学习笔记,欢迎指导。
△绑定式的服务定义:一个由bindService()方法所开启的服务成为绑定式的服务。
→其他组件可以与该服务绑定,同时可以与他进行通信(包括向服务发送请求,接收服务所返回的和数据,你还可以通过这个服务进行进程间的通信)。
→一个绑定式的服务不可以在后台无限期地执行,当所有与他相绑定的组件都与他解绑,这个服务就会销毁(当不再有组件与他绑定,系统会自动将干掉他)。
△绑定式服务的基础知识
→他是Service的子类,开发者要覆写onBind()方法,这个方法返回一个IBinder对象,这个对象里面定义一个公有方法,与服务绑定的组件通过该方法与服务进行通信。
→客户端(客户端就是想要与服务相绑定的那个组件)通过方法:bindService与服务绑定。
→一个服务可以在同一个时间与多个客户端绑定,系统会向每一个与服务绑定的客户端传第一个:IBinder对象,但是,只有第一个与服务想绑定的客户端的”IBinder”对象是通过onBind方法返回的,其他与服务绑定的客户端的”IBinder”对象不是通过onBind方法返回。即onbind()方法只会调用一次。
→当最后一个与服务相绑定的客户端也解绑定了,系统将会销毁服务。
△创建一个绑定式的服务
→当你的服务工作于不同场合(工作于一个应用的内部;工作于不同的进程之间),使用不同创建方法。本文只是讲述作用于单一应用内部的服务。
→当服务只是工作在自己应用内部,方法如下:在你的服务类内部,定义一个内部类去继承Binder(),然后,在onBind方法里,返回一个该内部类实例。
△具体步骤:
→首先,绑定服务的本质是,在窗体那获取服务实例,然后就能直接调用服务里的公有方法(这有点类似于Fragment与窗体通信的做法)。
→在服务里完成步骤:
(1)定义一个内部类继承Binder类,该内部类里面定义一个共有方法,该方法将当前服务实例返回。
(2)在服务的onBind方法里面,将该内部类的实例返回。看代码
public class MService extends Service {
//创建一个内部类的实例
private MyBinder myBinder = new MyBinder();
public void onCreate() {
super.onCreate();
Log.i("test", "--onCreate--");
}
//第一步:定义一个类去继承Binder
public class MyBinder extends Binder{
//内部类里定义一个公有方法
public MService getService(){
return MService.this;//将当前服务的实例返回
}
}
//第二步:在服务的onBind方法里面
//将该内部类的实例返回
@Override
public IBinder onBind(Intent intent) {
Log.i("test", "--onBind--");
return myBinder;
}
}
→在客户端(我这里将窗体做客户端)完成步骤:
(1)定义一个内部类,该内部类实现接口”ServiceConnection”,同时实现接口里的两个方法:”onServiceConnection”(客户端在这个方法方法体里得到Binder对象,由该对象就能得到服务实例)、”onServiceDisConnection”(当服务被意外断开,系统将会回调这个方法)。
(2)分别创建服务类变量、内部类变量(内部类变量需要实例化),在”onServiceConnection”方法里面用得到的服务实例将服务类变量实例化
(3)在需要绑定服务的地方,调用bindService()方法,将内部类变量传入。
看代码:代码注释已经写好代码编写时的顺序,这个顺序只是便于理解而已。
public class MainActivity extends Activity implements View.OnClickListener {
//第二步:创建内部类变量以及服务类的变量
//同时实例化内部类变量
private MService mService = null;
private MServiceConnection mServiceConnection =
new MServiceConnection();
//窗体的初始化方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViewById(R.id.bt_bind_the_service)
.setOnClickListener(this);
}
//点击事件响应函数
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.bt_bind_the_service:
Intent intent =
new Intent(MainActivity.this, MService.class);
//第三步:绑定服务那个时候将接口的实例传入
bindService(intent, mServiceConnection,
Context.BIND_AUTO_CREATE);
break;
}
}
//第一步:定义一个内部类去实现接口”ServiceConnection”
class MServiceConnection implements ServiceConnection{
//这个方法里面那个service
//就是服务类里面的onBind()方法所返回的IBinder变量了
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//还是第二步:将服务类的变量实例化:
//将IBinder向下转型
MService.MyBinder myBinder = (MService.MyBinder)service;
//调用公有方法就能获得服务类的实例
mService = myBinder.getService();
Log.i("test","连接服务");
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i("test", "意外断开");
}
}
}
→总结一下做了什么:
在服务里,继承Binder同时定义公有方法,通过onBind()方法将服务类实例传递给客户端。
在客户端,通过bindService()绑定服务,同时通过”ServiceConnection”接口里的”onServiceConnection”方法获取服务实例。
注意:你最好定义一个布尔型变量,每次绑定服务或者解绑定时都要修改这个标记。