android 进程间通信

来源:互联网 发布:百度网盘搜索 知乎 编辑:程序博客网 时间:2024/05/04 04:09

Android进程间通信的两种方式:AIDL(Android Interface Definition Language)和Messenger,有分别不同的使用场景。

当然他们也都可以用于LocalService,但是LocalService最好使用IBinder的方式。

AIDL:主要用于客户端主动调用服务端,(Android一些系统服务,早期的支付宝快捷支付服务应该都是使用的这种方法)。

Messenger:主要用于服务端回调客户端,比如:开启一个RemoteService监听电子秤的重量变化或者接触的NFC卡,然后回调客户端的方法处理数据。

AIDL的使用步骤:

1.服务端的实现(建立AIDL文件,写Service实现AIDL定义的方法,具体实现方法可以Google)。

2.在我们的APP中使用时,首先要建立AIDL文件,包名和文件名必须和服务端的一致。

3.在bindService()的connection中初始化GpService,我们就可以调用服务端的方法了。

//GpService是根据AIDL文件生成的类GpService mGpService = GpService.Stub.asInterface(service);

Messenger的使用步骤:

客户端代码:

final Messenger mMessenger = new Messenger(new IncomingHandler());/** * Class for interacting with the main interface of the service. */private ServiceConnection mConnection = new ServiceConnection() {public void onServiceConnected(ComponentName className, IBinder service) {Messenger mService = new Messenger(service);Message msg = Message.obtain();try {msg.replyTo = mMessenger;mService.send(msg);} catch (RemoteException e) {Log.e(TAG, "send download event failed" + e.getMessage());}}public void onServiceDisconnected(ComponentName className) {mService = null;}};/** * Handler of incoming messages from service. 接收RFID读取的数据 */@SuppressLint("HandlerLeak")class IncomingHandler extends Handler {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case CommonUtil.NFC_RFID_RW: {rfidData(msg.obj.toString());break;}default:break;}}}

服务端代码:

final Messenger mMessenger = new Messenger(new IncomingHandler());    private Messenger mClient;@Overridepublic IBinder onBind(Intent intent) {return mMessenger.getBinder();}/** * Handler of incoming messages from clients. */@SuppressLint("HandlerLeak")class IncomingHandler extends Handler {@Overridepublic void handleMessage(Message msg) {mClient = msg.replyTo;}}   






0 0