绑定Service概念 : 实现了Service组件与Activity组件绑定的操作,即完成了在Activity中直接操作Service的功能的方法.另外,绑定的Service组件的声明周期会受到Activity生命周期的影响
我们先来了解一下绑定Service应有的生命周期方法
@Override public void onCreate() { //初始化服务组件,整个生命周期中只执行一次 super.onCreate(); } @Override public IBinder onBind(Intent intent) { //绑定组件时放回Binder(实现了IBinder)的对象 return null; } @Override public boolean onUnbind(Intent intent) { //解绑方法 return true; } @Override public void onRebind(Intent intent) { //重新绑定时方法,如果onUnbind方法返回true时表示可以重新绑定,否则表示不能重新绑定 super.onRebind(intent); } @Override public void onDestroy() { //销毁服务方法 super.onDestroy(); }
我们现在使用绑定的方式完成音乐播放功能
首先时准备工作: 在res资源文件夹下创建一个raw文件夹,其中放入一个音频文件(注意文件名不能包含大写字母,汉字或以数字开头)
1) 新建Service的子类,并重写绑定Service相关声明周期方法
2)创建一个Binder的子类(该类的作用是实现UI组件与服务组件之间的交互),所以要在此类中添加必要的方法用来提供给Activity使用,其实现的过程就是用户不能直接操作Service组件,但用户必须通过Activity作为中间人才能操作服务组件
//在此为了方便表示其中的关系,我使用了内部类的表示方式,该类是MyService的内部类 public class MyBinder extends Binder{ public MyService getService(){ return MyService.this; //放回MyService对象,使得Activity可以直接调用该对象中的公共方法 } }
3)在MyService的绑定方法中返回该内部类对象
@Override public IBinder onBind(Intent intent) { return new MyBinder(); }
4)在Service添加适当的方法用来操作媒体对象
private MediaPlayer player; @Override public void onCreate() { player=MediaPlayer.create(getApplicationContext(), R.raw.music); player.setLooping(true);//设置循环播放 } public void start(){ player.start(); } public void pause(){ player.pause(); } public void stop(){ player.stop(); }
5)在清单文件中注册Service
<application <service android:name="com.chen.service.MyService" > <intent-filter> <action android:name="com.chen.service.MyService" /> </intent-filter> </service> </application>
6)在Activity中实例化一个绑定组件之间的通信接口对象ServiceConnection接口
对此,我们仍用内部类的方式先实现此接口
private MyService myService; public class MyServiceConnection implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { //此方法为绑定成功后回调的方法,其中第二个参数就是onBind方法返回的Binder对象 //但是如果想使用此对象需要进行向下转型 //同过MyBinder定义的方法便可获得Myservice对象 myService=((MyBinder)service).getService(); } @Override public void onServiceDisconnected(ComponentName name) { //解除绑定时,调用相应的销毁方法 myService.onDestroy(); } }
7)在Activity中的适当位置绑定和解绑服务组件
此时我在oncreate方法中绑定组件
private MyServiceConnection conn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intent = new Intent("com.chen.service.MyService");//参数为清单文件中指定的Action bindService(intent, conn=new MyServiceConnection(), Context.BIND_AUTO_CREATE); }
在ondestory方法中解绑服务
@Override protected void onDestroy() { unbindService(conn); super.onDestroy(); }
8)同上一篇博文,我们仍用三个按钮
<Button android:id="@+id/play" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:onClick="onClick" android:text="播放" /> <Button android:id="@+id/pause" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/play" android:onClick="onClick" android:text="暂停" /> <Button android:id="@+id/stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/pause" android:onClick="onClick" android:text="停止" />
在Activity中实现监听事件
public void onClick(View v) { switch (v.getId()) { case R.id.play: myService.start(); break; case R.id.pause: myService.pause(); break; case R.id.stop: myService.stop(); break; default: break; } }
好了,现在可以运行了,不过有一点小缺陷就是停止后不能再播放了,亲们自己处理以下哈^_^
拜拜,下期再见