您的位置:首页 > 其它

音乐播放器中Service的使用

2016-03-06 11:37 435 查看

1、Android中常用的Service

第一种是startService(),第二种是bindService()。

这两种的区别?

startService本身的设计上不利于交互,它的参数和使用startActivity时很相似,仅仅两个参数,第一个参数是intent,第二个参数是启动哪个Service。一旦启动了service就像是跟service说去完成这件事,就没有其他的交互了。对于音乐播放器这种让service去播放音乐,暂停,下一曲,上一曲这些都需要和service交互,显然使用startService是不太合适的。

bindService在设计上就很适合用于音乐播放器这种需要交互的情况下。因为它会提供一个接口给Activity,通过这个接口IBinder可以去控制service的行为。

2、使用方法:

service中最重要的部分是通过onBind()这个函数返回一个接口IBinder。

@Override
public IBinder onBind(Intent intent) {
//这个MyBinder类是继承Binder类所写的,在该类中可以写自己的业务逻辑函数
myIBinder = new MyBinder();
Bundle bundle = intent.getExtras();
serviceMusicList=(ArrayList)bundle.getSerializable("musiclist");
return myIBinder;
}
class MyBinder extends Binder{
public void play()
{
//
}
}


Activity这边启动bindService的方法。

bindService()有三个参数,第一个是一个intent,第二个是ServiceConnection,这个对象需要自己去实现一些接口,这里使用的是在onServiceConnected()中获得Service的接口IBinder,强转成MyBinder便可使用其中的方法,间接控制service。第三个参数通常写BIND_AUTO_CREATE,官方文档的说明是 automatically create the service as long as the binding exists意思是当绑定它的activity还存在service就存在。

bindService(Intent service,ServiceConnection conn,int flags)


//初始化服务,从服务获取到一个IBinder接口,从而控制服务端的业务逻辑
public void initservice()
{
Intent service =new Intent(this,MusicService.class);
Bundle musiclistBundle = new Bundle();
musiclistBundle.putSerializable("musiclist", musiclist);
service.putExtras(musiclistBundle);
ServiceConnection conn = new ServiceConnection() {

@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub

}

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
musicManager = (MyBinder) service;
}
};
bindService(service, conn, Service.BIND_AUTO_CREATE);
}


3、注册service

这个步骤比较容易忽略,而且比较难排查,编译器不会报错,但是运行时会有问题。

注册方法,在AndroidManifest.xml文件中application标签内写如

<service  android:name = ".MusicService"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: