Bound Service 允许其它的组件(比如Activities)绑定到这个Service上,可以发送请求,也可以接受请求,甚至进行进程间的通话。Bound Service 仅仅在服务于它的组件时存在(只要它被组件绑定时存在),不能独自无限期的在后台运行。
创建Bound Services
当创建一个能提供绑定功能的服务时,我们必须提供一个IBinder对象,客户端能使用这个对象与服务进行交互。在Android中有三种方式定义方式:
1.扩展Binder类 // 仅为本应用程序所使用,并且服务和应用程序在同一个进程时使用。
2.使用Messenger
3.使用AIDL (Android Interface Definition Language)
通过扩展Binder类创建创建Bound Services
步骤:
a.在Service类中,创建一个Binder实例
包含客户端能调用的公共方法
public class MyBinder extends Binder {
public BinderService getService() {
return BinderService.this;
}
}
返回当前服务对象
private MyBinder binder = new MyBinder();
@Override
public IBinder onBind(Intent intent) {
return binder;
}
根据需求定义自己的公共方法,处理服务。
public void myMethod() {
Log.i(TAG, "myMethod()");
}
以上是创建好了Bound Services
b.在onBind()方法中返回Binder实例
创建一个Activity应用程序来绑定Bound Services
public class BinderActivity extends Activity {
private Button btnStartBinderService;
private Button btnStopBinderService;
private boolean isConnected = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.binder);
btnStartBinderService = (Button)findViewById(R.id.btnStartBinderService);
btnStopBinderService = (Button)findViewById(R.id.btnStopBinderService);
btnStartBinderService.setOnClickListener(listener);
btnStopBinderService.setOnClickListener(listener);
}
private OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
//Intent intent = new Intent(MainActivity.this, ExampleService.class);
switch (v.getId()) {
case R.id.btnStartBinderService:
bindService();
break;
case R.id.btnStopBinderService:
unBind();
break;
}
}
};
private void unBind() {
if (isConnected) {
unbindService(conn);
}
}
private void bindService() {
Intent intent = new Intent(BinderActivity.this, BinderService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
}
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
isConnected = false;
}
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
// TODO Auto-generated method stub
MyBinder myBinder = (MyBinder)binder;
BinderService service = myBinder.getService();
service.myMethod();
isConnected = true;
}
};
}
c.在客户端,从onServiceConnected()方法中获得Binder实例。