Bound Service 跟一般的Service的区别是Bound Service可以提供一些方法给开启它的人(组件),相当于把自己的把柄给Activity,这样Activity就可以控制这个Service,不至于不收控制。
1.首先,我们新建一个类,继承Service,重写onBind方法,这时候这个方法就有用了。而且必须用。别忘了注册Service。
2.我们在类里创建一个内部类,继承Binder
public class LocalBinder extends Binder {
public void show(){
Toast.makeText(MyBoundService.this, "测试", Toast.LENGTH_SHORT).show();
}
}
这里的方法就是提供给Activity的。
然后实例化。
private LocalBinder binder = new LocalBinder();
把这个实例通过onBind方法返回。
@Override
public IBinder onBind(Intent intent) {
return binder;
}
全部代码
package com.hyw.test;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.widget.Toast;
public class MyBoundService extends Service {
private LocalBinder binder = new LocalBinder();
@Override
public IBinder onBind(Intent intent) {
return binder;
}
public class LocalBinder extends Binder {
public void show(){
Toast.makeText(MyBoundService.this, "测试", Toast.LENGTH_SHORT).show();
}
}
然后在Activity里定义服务绑定时的回调方法
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
//解除绑定时执行
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//绑定服务时执行
}
};
绑定服务时调用的那个方法里的那个IBinder service参数就是Service的onBind方法返回的那个Ibinder。在这个方法里我们可以获得Service里定义的那个LocalBinder 的实例,也就是onBinder返回的那个binder。获得之后我们就可以使用LocalBinder 这个内部类里定义的方法了。
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
//解除绑定时执行
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//绑定服务时执行
LocalBinder binder = (LocalBinder) service;
binder.show();
}
};
为了更方便的控制Service,我们一般会在LocalBinder 定义一个获得Service的方法。
public class LocalBinder extends Binder {
public void show(){
Toast.makeText(MyBoundService.this, "测试", Toast.LENGTH_SHORT).show();
}
MyBoundService getMyBoundService (){
return MyBoundService.this;
}
}
然后在activity里通过回调方法获得binder,再通过binder获得Service的实例,使用service的方法就更方便了。
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
//解除绑定时执行
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//绑定服务时执行
LocalBinder binder = (LocalBinder) service;
mService = binder.getMyBoundService();
binder.show();
}
};
说了这么多,我们还没绑定呢
Intent intent = new Intent(this,MyBoundService.class);
bindService(intent, connection, BIND_AUTO_CREATE);
connection就是那个回调。
那么怎么解除绑定呢?
这样就行
unbindService(connection);
注意onServiceDisconnected回调方法只在当与服务的联接发生意外中断时,比如服务崩溃或者被杀死时,Android系统将会调用该方法。客户端解除绑定时,不会调用该方法。