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:調用者
- package com.zhf.local;
- import android.app.Activity;
- import android.content.ComponentName;
- import android.content.Context;
- import android.content.Intent;
- import android.content.ServiceConnection;
- import android.os.Bundle;
- import android.os.IBinder;
- public class LocalServiceActivity extends Activity {
- private MyService myService;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Intent intent = new Intent(this, MyService.class);
- bindService(intent, connection, Context.BIND_AUTO_CREATE);
- }
- private ServiceConnection connection = new ServiceConnection() {
- @Override
- public void onServiceDisconnected(ComponentName name) {
- myService = null;
- }
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- myService = ((MyService.MyBinder) service).getService();
- System.out.println("Service連接配接成功");
- // 執行Service内部自己的方法
- myService.excute();
- }
- };
- protected void onDestroy() {
- super.onDestroy();
- unbindService(connection);
- };
- }
- 2:服務者
- package com.zhf.local;
- import android.app.Service;
- import android.content.Intent;
- import android.os.Binder;
- import android.os.IBinder;
- public class MyService extends Service {
- private final IBinder binder = new MyBinder();
- @Override
- public IBinder onBind(Intent intent) {
- return binder;
- }
- public class MyBinder extends Binder {
- MyService getService() {
- return MyService.this;
- }
- }
- public void excute() {
- System.out.println("通過Binder得到Service的引用來調用Service内部的方法");
- }
- @Override
- public void onDestroy() {
- // 當調用者退出(即使沒有調用unbindService)或者主動停止服務時會調用
- super.onDestroy();
- }
- @Override
- public boolean onUnbind(Intent intent) {
- // 當調用者退出(即使沒有調用unbindService)或者主動停止服務時會調用
- System.out.println("調用者退出了");
- return super.onUnbind(intent);
- }
- }