Binder机制分析【二】-Binder服务/客户端实现举例
前一章说了下Binder机制的实现分析,这章就主要通过实际的例子来看看,具体的服务端创建。一般而言,同一个进程里的沟通称之为短程沟通,进程间的沟通称之为远程沟通,短程沟通的效率远高于远程沟通,但是Android提供的Binder机制就提供了高效率的远程沟通。
下面通过Activity与Service之间的沟通为例,列举出2种实现方式。
例子一:通过直接继承Binder实现
1.实现Binder类
public class MyBinder extends Binder {private Context mContext;public MyBinder(Context context){mContext = context;}@Overrideprotected boolean onTransact(int code, Parcel data, Parcel reply, int flags)throws RemoteException {reply.writeString(data.readString()+" mp3");switch(code){case 1:MyMediaPlayer.getIntance(mContext).play();break;case 2:MyMediaPlayer.getIntance(mContext).stop();break;default:break;}return true;}}public class MyService extends Service {private Binder mBinder = null;@Overridepublic IBinder onBind(Intent arg0) {Log.e("XXX", "onBind");return mBinder;}@Overridepublic void onCreate() {super.onCreate();mBinder = new MyBinder(this);Log.e("XXX", "onCreate");}}private ServiceConnection mServiceConnection = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {Log.e("XXX", "onServiceDisconnected");}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {mIBinder = service;Log.e("XXX", "onServiceConnected");}};Intent intent = new Intent("com.eric.ipc.binder"); bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);Parcel send_data = Parcel.obtain();send_data.writeString("play");Parcel reply_data = Parcel.obtain();mIBinder.transact(1, send_data, reply_data, 0);package com.eric.ipc.aidl;interface IMediaPlayer {void play();void stop();}public class MyBinder extends IMediaPlayer.Stub {private Context mContext;public MyBinder(Context context){mContext = context;}@Overridepublic void play() throws RemoteException {MyMediaPlayer.getIntance(mContext).play();}@Overridepublic void stop() throws RemoteException {MyMediaPlayer.getIntance(mContext).stop();}}private ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { Log.e("XXX", "onServiceDisconnected"); } @Override public void onServiceConnected(ComponentName name, IBinder service) { mIBinder = IMediaPlayer.Stub.asInterface(service); Log.e("XXX", "onServiceConnected"); } };mIBinder.play();