您的位置:首页 > 其它

绑定服务的用法

2017-01-06 15:56 169 查看

绑定服务的用途

服务有两种启动方法: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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息