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 {
@Override
public 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;
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
/**
* Handler of incoming messages from clients.
*/
@SuppressLint("HandlerLeak")
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
mClient = msg.replyTo;
}
}