最近要做音乐播放器,刚接触andriod开发,吧activity和service之间的关系搞懂了
IBinder
- 跨进程调用
- 可用于远程调用和进程内调用,拥有与远程对象的交互的协议,不直接实现,要从Binder派生
activity与service绑定
- mainActivity使用MusicPlayerService(service)类的方法
- mainActivity类中需要定义
private ServiceConnection conn = new ServiceConnection() {//定义连接service
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//musicBinder是service自定义类对象,其有一个自定义方法叫getplayInfo,返回的还是service对象本身
mediaPlayerService = ((MediaPlayerService.musicBinder) service).getPlayInfo();
}
@Override
public void onServiceDisconnected(ComponentName name) {
mediaPlayerService = null;
}
}
- onStart()和onCreate()里定义
intent = new Intent(this, MediaPlayerService.class);
bindService(intent, conn,Context.BIND_AUTO_CREATE);
- service里面定义
public class MediaPlayerService extends Service{
public MediaPlayerService(){
musicBinder=new musicBinder();
}
//通过bind 返回一个IBinder对象,然后该对象调用里面的方法实现参数的传递,返回给onServiceConnected
@Override
public IBinder onBind(Intent intent) {//供客户端用来与服务通信
return musicBinder;
}
//自定义musicBinder类和其方法
class musicBinder extends Binder{
public MediaPlayerService getPlayInfo(){
return MediaPlayerService.this;
//返回service对象本身
}
}
}
- 总结一下流程
activity和services绑定流程:(bindService方式)
1. new intent指定和哪个service绑定
2.开始绑定,传递服务连接处理函数ServiceConnection()(有点像回调函数),//调用此函数时android会调用service类中的onBind()函数。
3.onBind()函数里面返回了一个Binder子类对象。Binder子类中有个getPlayerInfo()方法,返回service对象本身。,最终就是为了给Activiy返回service对象的引用。
4.Activity和service绑定成功后。android会调用onServiceConnected()函数。此函数中IBinder就是service返回的Binder的子类对象MusicBinder.
5.调用MusicBinder中的方法getplayinfo()即可获得service对象的引用。
6.开始调用service中的公共方法