今天来介绍Service的第二种使用方式,Bind方式ide
Bind方式和Start方式启动很相似,都是经过Intent来启动,不一样的是,Bind方式须要传入三个参数,以下:函数
Intent intent2 =new Intent(MainActivity.this,BindService.class); bindService(intent2,conn,BIND_AUTO_CREATE);
其中conn为一个ServiceConnection对象,用于获取以Bind方式绑定的Service对象,其包含两个抽象函数,以下:this
conn=new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { bindservice=((BindService.MyBinder)service).getService(); } @Override public void onServiceDisconnected(ComponentName name) { } };
其中的onServiceDisconnected为当Service的绑定意外丢失时会调用,在该例中没有用到。spa
其中onServiceConnected为当ServiceConnextion对象和Service成功绑定时回调用的方法,其中的IBinder参数正是在Service中的onBind方法的返回值类型。故咱们只须要在Service中,新建一个IBinder的子类,获取Service对象便可。code
public class BindService extends Service { public class MyBinder extends Binder { public BindService getService() { return BindService.this; } } @Nullable @Override public IBinder onBind(Intent intent) { Log.d("Jinx","Bind"); return new MyBinder(); }
如上所示便可,其中Binder为IBinder的一个子类,咱们的内部类继承Binder便可。对象
在经过conn进行关联后,即可以方便地在Activity中调用Service中的方法,以下代码虚拟了一个音乐播放器为例:blog
Service中:继承
public void Play() { Log.d("Jinx","Play"); } public void Pause() { Log.d("Jinx","Pause"); }
Activity中:接口
case R.id.play_bt: bindservice.Play(); break; case R.id.pause_bt: bindservice.Pause(); break;