android service 实现Binder类补充

来源:互联网 发布:morphvox pro御姐数据 编辑:程序博客网 时间:2024/06/07 07:08

绑定到一个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即可.


    转载自:http://blog.csdn.net/nkmnkm/article/details/7393456

原创粉丝点击