绑定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;
}
}
好了,现在可以运行了,不过有一点小缺陷就是停止后不能再播放了,亲们自己处理以下哈^_^
拜拜,下期再见