绑定服务的用途
- 服务有两种启动方法:startService和bindService。
- startService启动服务后,即使启动他的组件死亡,服务仍然会在后台运行;bindService启动服务后,服务与启动他的组件同生共死。
- 既然如此,绑定服务似乎就好像失去了服务本来的意义(后台单独运行的进程)。实际上绑定服务最大的用途就是其他进程可以去调用服务里的方法,而这是startService无法做到的。
下面介绍绑定服务的用法:我们模拟做一个音乐播放服务,服务里有开始播放和停止播放的方法需要其他的进程去调用。
代码示例
public class MainActivity extends Activity {
MusicInterface mi;
private MusicServiceConnection conn;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent(this, MusicService.class);
startService(intent);
conn = new MusicServiceConnection();
bindService(intent, conn, BIND_AUTO_CREATE);
}
class MusicServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mi = (MusicInterface) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
public void play(View v) {
mi.play();
}
public void stop(View v) {
mi.stop();
}
}
- 主activity我们放置了两个按钮:开始播放和停止播放,点击相应的按钮就可以实现相应的功能(注意这里的方法是绑定服务里的方法)。
-
activity启动时绑定服务,在链接到服务后将服务转成抽象接口,接口里是服务里定义的可以外部进程直接调用的方法。
public class MusicService extends Service {
@Override
public void onCreate() {
super.onCreate();
System.out.println("onCreate");
}
@Override
public IBinder onBind(Intent intent) {
System.out.println("onBind");
return new MusicController();
}
@Override
public boolean onUnbind(Intent intent) {
System.out.println("onUnbind");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
System.out.println("onDestroy");
}
class MusicController extends Binder implements MusicInterface{
@Override
public void play() {
MusicService.this.play();
}
@Override
public void stop() {
MusicService.this.stop();
}
}
public void innerMethod(){
System.out.println("我是外部进程不能访问的方法");
}
public void play() {
System.out.println("开始播放");
}
public void stop() {
System.out.println("停止播放");
}
} -
绑定服务要求返回一个Buider对象,这个对象相当于一个暴露服务里方法给外部进程的中介,这里我们让这个对象实现接口,接口里定义一些允许访问的方法。
public interface MusicInterface {
void play();
void stop();
}