Binding to a Service

  Application components (clients) can bind to a service by calling bindService(). The Android system then calls the service's onBind() method, which returns an IBinder for interacting with the service.

  The binding is asynchronous. bindService() returns immediately and does not return the IBinder to the client. To receive the IBinder, the client must create an instance of ServiceConnection and pass it to bindService(). The ServiceConnection includes a callback method that the system calls to deliver the IBinder.

  Note: Only activities, services, and content providers can bind to a service—you cannot bind to a service from a broadcast receiver.

So, to bind to a service from your client, you must:

  1. Implement ServiceConnection.

    Your implementation must override two callback methods:

    onServiceConnected()
    The system calls this to deliver the IBinder returned by the service's onBind() method.
    onServiceDisconnected()
    The Android system calls this when the connection to the service is unexpectedly lost, such as when the service has crashed or has been killed. This is not called when the client unbinds.
  2. Call bindService(), passing the ServiceConnection implementation.
  3. When the system calls your onServiceConnected() callback method, you can begin making calls to the service, using the methods defined by the interface.
  4. To disconnect from the service, call unbindService().

    If your client is still bound to a service when your app destroys the client, destruction causes the client to unbind. It is better practice to unbind the client as soon as it is done interacting with the service. Doing so allows the idle service to shut down. For more information about appropriate times to bind and unbind, see Additional Notes.

  For example, the following snippet connects the client to the service created above by extending the Binder class, so all it must do is cast the returned IBinder to the LocalService class and request the LocalService instance:

 LocalService mService;
private ServiceConnection mConnection = new ServiceConnection() {
// Called when the connection with the service is established
public void onServiceConnected(ComponentName className, IBinder service) {
// Because we have bound to an explicit
// service that is running in our own process, we can
// cast its IBinder to a concrete class and directly access it.
LocalBinder binder = (LocalBinder) service;
mService = binder.getService();
mBound = true;
} // Called when the connection with the service disconnects unexpectedly
public void onServiceDisconnected(ComponentName className) {
Log.e(TAG, "onServiceDisconnected");
mBound = false;
}
};

  With this ServiceConnection, the client can bind to a service by passing it to bindService(). For example:

 Intent intent = new Intent(this, LocalService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

Additional notes 注意事项

  Here are some important notes about binding to a service:

  • You should always trap DeadObjectException exceptions, which are thrown when the connection has broken. This is the only exception thrown by remote methods.

    捕获DeadObjectException异常
  • Objects are reference counted across processes.
    进程间对象是 引用+引用计数 访问。
  • You should usually pair the binding and unbinding during matching bring-up and tear-down moments of the client's lifecycle. For example:
    • If you only need to interact with the service while your activity is visible, you should bind during onStart() and unbind during onStop().
    • If you want your activity to receive responses even while it is stopped in the background, then you can bind during onCreate() and unbind during onDestroy(). Beware that this implies that your activity needs to use the service the entire time it's running (even in the background), so if the service is in another process, then you increase the weight of the process and it becomes more likely that the system will kill it.
      绑定与解绑成对出现,注意组件的生命周期。通常可以在onCreate中绑定,onDestory解绑.而不要在onResume,onPause中绑定,解绑。

    Note: You should usually not bind and unbind during your activity's onResume() and onPause(), because these callbacks occur at every lifecycle transition and you should keep the processing that occurs at these transitions to a minimum. Also, if multiple activities in your application bind to the same service and there is a transition between two of those activities, the service may be destroyed and recreated as the current activity unbinds (during pause) before the next one binds (during resume). (This activity transition for how activities coordinate their lifecycles is described in the Activities document.)

  For more sample code, showing how to bind to a service, see the RemoteService.java class in ApiDemos.

最新文章

  1. 体验Rabbitmq强大的【优先级队列】之轻松面对现实业务场景
  2. 二维码跳转不同的 app store
  3. php抽奖代码
  4. Linq和Lamda表达式的简单处理方式
  5. CSS3的新属性的一下总结
  6. Tomcat中部署WEB项目的四种方法
  7. c语言数组不同初始化方式的结果
  8. BOT、BT、PPP形式介绍(3)
  9. webapi 发布接口报405错误(angularjs2.0)
  10. 解决xshell评估期已过的问题
  11. EBS R12安装升级(FRESH)(三)
  12. 关于ES6
  13. 配置php环境的一个nginx.conf
  14. ORA-20011 ORA-29913 KUP-11024 GATHER_TABLE_STATS
  15. [爬虫]采用Go语言爬取天猫商品页面
  16. 获取验证码随机字符串@return string $captcha,随机验证码文字
  17. SPSS学习系列之SPSS Modeler怎么修改默认的内存大小(图文详解)
  18. Linux下的wine生活(QQ/微信/Office)
  19. 【laravel5.4】php artisan migrate报错:Specified key was too long; max key length is 767 bytes
  20. 修改oracle表空间数值

热门文章

  1. Android网络编程(三)Volley使用方法全解析
  2. Redis入门教程(三)— Java中操作Redis
  3. 在CentOS上把MySQL从5.5升级到5.6
  4. 【iOS系列】-xib封装使用
  5. Oracle改动字段类型
  6. EJB学习笔记六(EJB中的拦截器)
  7. 最新Bootstrap手册
  8. 让Linq的OrderBy支持动态字段
  9. C# Stopwatch
  10. C语言-1.结构体,2.枚举,3.typedef,4.预处理指令的概念,5.条件编译