绑定服务的用法

时间:2021-05-22 23:18:50

绑定服务的用途

  • 服务有两种启动方法: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();
    }