Android学习——Service(二)
今天来介绍Service的第二种使用方式,Bind方式
Bind方式启动服务
Bind方式和Start方式启动很类似,都是通过Intent来启动,不同的是,Bind方式需要传入三个参数,如下:
Intent intent2 =new Intent(MainActivity.this,BindService.class); bindService(intent2,conn,BIND_AUTO_CREATE);
其中conn为一个ServiceConnection对象,用于获取以Bind方式绑定的Service对象,其包含两个抽象函数,如下:
conn=new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { bindservice=((BindService.MyBinder)service).getService(); } @Override public void onServiceDisconnected(ComponentName name) { } };
其中的onServiceDisconnected为当Service的绑定意外丢失时会调用,在该例中没有用到。
其中onServiceConnected为当ServiceConnextion对象和Service成功绑定时回调用的方法,其中的IBinder参数正是在Service中的onBind方法的返回值类型。故我们只需要在Service中,新建一个IBinder的子类,获取Service对象即可。
在Service中创建IBinder接口
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即可。
在Activity获取Service中的方法
在通过conn进行关联后,便可以方便地在Activity中调用Service中的方法,如下代码虚拟了一个音乐播放器为例:
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;