Android ServiceConnection详解

来源:互联网 发布:python与数据挖掘书籍 编辑:程序博客网 时间:2024/05/16 04:50

绑定到一个Service


  应用组件(客户端)可以调用bindService()绑定到一个serviceAndroid系统之后调用serviceonBind()方法,它返回一个用来与service交互的IBinder


  绑定是异步的.bindService()会立即返回,它不会返回IBinder给客户端.要接收IBinder,客户端必须创建一个ServiceConnection的实例并传给bindService()ServiceConnection包含一个回调方法,系统调用这个方法来传递要返回的IBinder


注:只有activities,services,contentproviders可以绑定到一个service—你不能从一个broadcastreceiver绑定到service


所以,从你的客户端绑定到一个service,你必须:

  • 1实现ServiceConnection.
    你的实现必须重写两个回调方法:
    • onServiceConnected()
      系统调用这个来传送在serviceonBind()中返回的IBinder
    • OnServiceDisconnected()
      Android系统在同service的连接意外丢失时调用这个.比如当service崩溃了或被强杀了.当客户端解除绑定时,这个方法不会被调用.
  • 2调用bindService(),传给它ServiceConnection的实现.
  • 3当系统调用你的onServiceConnected()方法时,你就可以使用接口定义的方法们开始调用service了.
  • 4要与service断开连接,调用unbindService()
      当你的客户端被销毁,它将从service解除绑定,但是你必须总是在你完成与service的交互时或当你的activity暂停于是service在不被使用时可以关闭此两种情况下解除绑定.(下面会讨论更多在适当的时候绑定和解除绑定的问题.)


  例如,下面是前一篇"派生Binder类"中创建的代码片段,它把客户端连接到了service.所有需要做的就是把返回的IBinder强制转换到LocalBinder类并且请求LocalService实例:

[java] view plaincopy



  1. LocalService mService;  
  2. private ServiceConnection mConnection = new ServiceConnection() {  
  3.     // 当与service的连接建立后被调用  
  4.     public void onServiceConnected(ComponentName className, IBinder service) {  
  5.         // Because we have bound to an explicit  
  6.         // service that is running in our own process, we can  
  7.         // cast its IBinder to a concrete class and directly access it.  
  8.         LocalBinder binder = (LocalBinder) service;  
  9.         mService = binder.getService();  
  10.         mBound = true;  
  11.     }  
  12.   
  13.     // 当与service的连接意外断开时被调用  
  14.     public void onServiceDisconnected(ComponentName className) {  
  15.         Log.e(TAG, "onServiceDisconnected");  
  16.         mBound = false;  
  17.     }  
  18. };  

使用这个ServiceConnection,客户端可以绑定到一个service,通过把它传给bindService().例如:

Intentintent = new Intent(this, LocalService.class);

bindService(intent,mConnection, Context.BIND_AUTO_CREATE);

  • 第一个bindService()的参数是一个明确指定了要绑定的serviceIntent
  • 第二个参数是ServiceConnection对象.
  • 第三个参数是一个标志,它表明绑定中的操作.它一般应是BIND_AUTO_CREATE,这样就会在service不存在时创建一个.其它可选的值是BIND_DEBUG_UNBINDBIND_NOT_FOREGROUND,不想指定时设为0即可.


补充事项

下面是一些关于绑定到service的重要事项:

  • 你总是需要捕获DeadObjectException异常.它会在连接被打断时抛出.这是被远程方法抛出的唯一异常.
  • 对象引用计数是跨进程的作用的.
  • 你应该在客户端的生命期内使绑定和解除绑定配对进行,例如:
    • 如果你需要在你的activity可见时与service交互,你应该在onStart()绑定并在onStop()中解除绑定.
    • 如果你想让你的activity即使在它停止时也能接收回应,那么你可以在onCreate()中绑定并在onDestroy()中解除绑定.注意这意味着你的activity需要使用在自己整个运行期间使用service(即使位于后台),所以如果service在另一个进程中,那么你增加了这个进程的负担而使它变得更容易被系统杀掉.


  注:你一般不应该在你的activityonResume()onPause()中绑定和解除绑定到service,因为这些回调方法,出现在每个生命期变化中,并且你需要使发生在这些变化中的处理最小化.还有,如果你应用中的多个activity绑定到同一个service,并且有一个变化发生在其中两个activity之间,service可能在当前activity解除绑定(pause)和下一个绑定前(rusume)被销毁又重建.


管理BoundService的生命期

  当一个service的所有客户端都解除绑定,Android系统就销毁它(除非它是从onStartCommand()启动).如果你的service是一个纯boundservice,你不需管理它的生命期—Android系统会为你管理它.


  然而,如果你选择了实现onStartCommand()回调方法,那么你必须明确地停止service,因为service现在被认为是"开始的".在此情况下,service会一直运行,直到service使用stopSelf()停止它自己或另外的组件调用了stopService()停止了它,不管是否有客户端绑定了它.



  另外,如果你的service已经启动并且接受绑定,那么当系统调用你的onUnbind()方法,你可以选择返回true表示你想在客户端下一次绑定到service时接受一个对onRebind()的调用(而不是一个对onBind()的调用)onRebind()返回void,但是客户端依然会在它的onServiceConnected()回调中接收到IBinder.下图演示了这种生命其的逻辑:




图1.一个已开始并已绑定的service的生命期

Baidu Button BEGIN







Baidu Button END 172.16.140.13 Baidu Button BEGIN Baidu Button END

2 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 家里的白墙脏了怎么办 月经弄到床垫上怎么办 出租房墙面太脏怎么办 苹果6镜头模糊了怎么办 6s前摄像头进灰怎么办 手机镜头进灰了怎么办 6s摄像头进灰了怎么办 7plus摄像头进灰怎么办 苹果喇叭进灰了怎么办 苹果7摄像头进灰怎么办 锁眼里胶水堵了 怎么办 锁眼被牙签堵了怎么办 锁孔被胶水堵了怎么办 快手上不了同城怎么办 昌珉入伍宋茜怎么办 嗓子里卡了鱼刺怎么办 在餐厅吃到虫子怎么办 在餐厅吃出虫子怎么办 孕妇被虫子咬了怎么办 吃外卖吃到虫子怎么办 杯子盖拧错位了怎么办 身边有吸毒的人怎么办 如果牛难产了怎么办要 牛难产拉不出来怎么办 老公发现老婆有外遇怎么办 睡眠不好半夜老是醒怎么办 拔完智齿肿了怎么办 拔牙后咽口水疼怎么办 吃了脏东西拉肚子怎么办 微信遇到仙人跳怎么办 牙有裂痕疼应该怎么办 胸罩在学校掉了怎么办 锁屏密码忘记了怎么办 中汇支付不到账怎么办 痘痘毁容烂脸怎么办 我的手机掉了怎么办 公司不给开工资怎么办 我有卵巢老化怎么办呢 老师骂了我,我该怎么办 我的牙齿很难看怎么办 门牙摔了个缺怎么办