Bound服务的简介:
bound服务是 Service 类的一种实现,它允许其它应用程序与其绑定方法返回一个 IBinder 对象,此对象定义了客户端与服务进行交互时所需的编程接口。
创建Bound服务基于扩Binder
如果你的服务只用于本地应用程序并且不需要跨进程工作,那你只要实现自己的 Binder 类即可,这样你的客户端就能直接访问服务中的公共方法了。仅当客户端和服务位于同一个应用程序和进程中,这也是最常见的情况,这种方式才会有用。比如,一个音乐应用需要把一个activity绑定到它自己的后台音乐播放服务上,采用这种方式就会很不错。
具体实现步骤如下:
1.在你的服务中,创建一个Binder的实例
// 给客户端的Binder
private final IBinder mBinder = new LocalBinder();
/**
* 用于客户端Binder的类。
* 因为知道本服务总是运行于与客户端相同的进程中,我们就不需要用IPC进行处理。
*/
public class LocalBinder extends Binder {
LocalService getService() {
return LocalService.this;
}
2.从回调方法onBind()中返回Binder的该实例
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
Service完整代码如下:
public class LocalService extends Service {
// 给客户端的Binder
private final IBinder mBinder = new LocalBinder();
// 生成随机数
private final Random mGenerator = new Random();
/**
* 用于客户端Binder的类。
* 因为知道本服务总是运行于与客户端相同的进程中,我们就不需要用IPC进行处理。
*/
public class LocalBinder extends Binder {
LocalService getService() {
return LocalService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
//服务端的功能代码,供客户端调用
public int getRandomNumber() {
return mGenerator.nextInt(100);
}
}
3.在客户端中,在回调方法onServiceConnected()中接收Binder并用所提供的方法对绑定的服务进行调用
public class BindingActivity extends Activity {
LocalService mService;
boolean mBound = false;
@Override
protected void onStart() {
super.onStart();
// 绑定到LocalService
Intent intent = new Intent(this, LocalService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
super.onStop();
// 与服务解除绑定
if (mBound) {
unbindService(mConnection);
mBound = false;
}
}
/** 定义服务绑定时的回调方法,用于传给bindService() */
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className,
IBinder service) {
/**这里的IBinder类型参数service便是LocalService中public IBinder onBind(Intent intent)方法返回的mBinder */
LocalBinder binder = (LocalBinder) service;
/**LocalBinder为客户端提供了getService()方法,用于返回LocalService的实例。 这就让客户端可以调用服务中的公共方法。*/
mService = binder.getService();
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
}
};
}
音乐播放器实现原理
服务端Service:
public class MusicService extends Service{
MediaPlayer player;
//歌曲文件地址
String path=null;
@Override
public IBinder onBind(Intent intent) {
return new MusicController();
}
//必须继承binder,才能作为中间人对象返回
class MusicController extends Binder{
MusicService getMusicService(){
return MusicService.this;
}
}
//服务创建的时候
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
player = new MediaPlayer();
}
//服务销毁的时候
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
//停止播放
player.stop();
//释放占用的资源,此时player对象已经废掉了
player.release();
player = null;
}
public void play(){
System.out.println("播放音乐");
//重置
player.reset();
try {
//加载多媒体文件
player.setDataSource(path);
player.prepareAsync();//异步准备
player.setOnPreparedListener(new OnPreparedListener() {
//准备完毕时,此方法调用
@Override
public void onPrepared(MediaPlayer mp) {
player.start();
}
});
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void pause(){
System.out.println("暂停播放");
player.pause();
}
}
客户端Activity:
public class MainActivity extends Activity {
MusicService musicService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this, MusicService.class);
//混合调用
//为了把服务所在进程变成服务进程
startService(intent);
//绑定服务
bindService(intent, new MusicServiceConn(), BIND_AUTO_CREATE);
}
class MusicServiceConn implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
MusicController mc=(MusicController)service;
musicService=mc.getMusicService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
//开始播放按钮
public void play(View v){
musicService.play();
}
//暂停播放按钮
public void pause(View v){
musicService.pause();
}
}