天天看點

Android開發:bindService的使用方法

http://blog.csdn.net/zhou_wenchong/article/details/51302574

bindService用于綁定一個服務。這樣當bindService(intent,conn,flags)後,就會綁定一個服務。這樣做可以獲得這個服務對象本身,而用startService(intent)的方法隻能啟動服務。

    bindService方式的一般過程:

1.建立Service類BindService。在BindService類裡建立内部類MyBinder,繼承自Binder(Binder實作IBinder接口)。MyBinder提供方法傳回BindService執行個體。

    public class MyBinder extends Binder{

        public BindService getService(){

            return BindService.this;

        }

    }

執行個體化MyBinder得到mybinder對象;

重寫onBind()方法:

 @Override

 public IBinder onBind(Intent intent) {

  return mybinder;

 }

2.在Activity裡,執行個體化ServiceConnection接口的實作類,重寫onServiceConnected()和onServiceDisconnected()方法

ServiceConnection conn=new ServiceConnection(){

  @Override

  public void onServiceConnected(ComponentName name, IBinder service) {

  }

  @Override

  public void onServiceDisconnected(ComponentName name) {

  }

};

3.在Activity的onCreate()方法裡,建立Intent,并綁定服務

        Intent intent=new Intent(MainActivity.this,BindService.class); 

        bindService(intent, conn,BIND_AUTO_CREATE);

4.在Activity的onDestroy裡面,添加

unbindService(conn);

如果不加這一步,就會報Android.app.ServiceConnectionLeaked: ******.MainActivity has leaked ServiceConnection的異常。

bindService()的執行過程如下:

bindService(intent,conn,flag)->Service:onCreate()->Service:onBind()->Activity:onServiceConnected()

code

[java]  view plain  copy

  1.  1:調用者  
  2. package com.zhf.local;  
  3. import android.app.Activity;  
  4. import android.content.ComponentName;  
  5. import android.content.Context;  
  6. import android.content.Intent;  
  7. import android.content.ServiceConnection;  
  8. import android.os.Bundle;  
  9. import android.os.IBinder;  
  10. public class LocalServiceActivity extends Activity {  
  11.     private MyService myService;  
  12.     @Override  
  13.     public void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.main);  
  16.         Intent intent = new Intent(this, MyService.class);  
  17.         bindService(intent, connection, Context.BIND_AUTO_CREATE);  
  18.     }  
  19.     private ServiceConnection connection = new ServiceConnection() {  
  20.         @Override  
  21.         public void onServiceDisconnected(ComponentName name) {  
  22.             myService = null;  
  23.         }  
  24.         @Override  
  25.         public void onServiceConnected(ComponentName name, IBinder service) {  
  26.             myService = ((MyService.MyBinder) service).getService();  
  27.             System.out.println("Service連接配接成功");  
  28.             // 執行Service内部自己的方法  
  29.             myService.excute();  
  30.         }  
  31.     };  
  32.     protected void onDestroy() {  
  33.         super.onDestroy();  
  34.         unbindService(connection);  
  35.     };  
  36. }  
  37. 2:服務者  
  38. package com.zhf.local;  
  39. import android.app.Service;  
  40. import android.content.Intent;  
  41. import android.os.Binder;  
  42. import android.os.IBinder;  
  43. public class MyService extends Service {  
  44.     private final IBinder binder = new MyBinder();  
  45.     @Override  
  46.     public IBinder onBind(Intent intent) {  
  47.         return binder;  
  48.     }  
  49.     public class MyBinder extends Binder {  
  50.         MyService getService() {  
  51.             return MyService.this;  
  52.         }  
  53.     }  
  54.     public void excute() {  
  55.         System.out.println("通過Binder得到Service的引用來調用Service内部的方法");  
  56.     }  
  57.     @Override  
  58.     public void onDestroy() {  
  59.         // 當調用者退出(即使沒有調用unbindService)或者主動停止服務時會調用  
  60.         super.onDestroy();  
  61.     }  
  62.     @Override  
  63.     public boolean onUnbind(Intent intent) {  
  64.         // 當調用者退出(即使沒有調用unbindService)或者主動停止服務時會調用  
  65.         System.out.println("調用者退出了");  
  66.         return super.onUnbind(intent);  
  67.     }  
  68. }  

繼續閱讀