1、跨进程Messager 多应用间单线程
把Messenger比喻为一个信使,信使的作用是派信;那么Message就比喻为信件、信封,即信使派的东西;那么Bundle是什么呢?Message里面保存了Bundle,那么bundle可以比喻为信纸,信纸上写满了各种我们要传递的信息。读到这里,读者应该明白了这三者在Messenger通讯方式内所扮演的角色了。简单来说:Messenger把装有Bundle的Message发送到别的进程。
###客户端
private Messenger clientMessenger = new Messenger(handler);
private Handler handler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Bundle bundle = msg.getData();
Log.i(TAG,"收到远程服务数据:"+bundle.getString("service"));
}
};
private void bindRemoteService(){
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.example.xxx",
"com.example.xxx.MessengerService"));
boolean isBind = bindService(intent,conn, Service.BIND_AUTO_CREATE);
Log.i(TAG,"bindRemoteService isBind="+isBind);
}
private Messenger messengerProxy;
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder iBinder) {
Log.i(TAG,"onServiceConnected:");
messengerProxy = new Messenger(iBinder);
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i(TAG,"onServiceDisconnected:");
}
};
private void sendData(){
if (messengerProxy == null) return;
Message message = new Message();
message.replyTo = clientMessenger;
Bundle bundle = new Bundle();
bundle.putString("client","这是客户端发送数据:"+messageid);
message.setData(bundle);
messengerProxy.send(message);
}
###服务端
//创建服务端Messenger
private final Messenger mMessenger = new Messenger(messengerHandler);
@Override
public IBinder onBind(Intent intent) {
//向客户端返回IBinder对象,客户端利用该对象访问服务端
return mMessenger.getBinder();
}
//拿到客户端的message 发送消息
private Handler messengerHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//取出客户端的消息内容
Bundle bundle = msg.getData();
String clientMsg = bundle.getString("client");
Log.i(TAG, "来自客户端的消息:" + clientMsg);
//新建一个Message对象,作为回复客户端的对象
Message message = Message.obtain();
Bundle bundle1 = new Bundle();
bundle1.putString("service", clientMsg+",服务端收到");
message.setData(bundle1);
try {
msg.replyTo.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
};
2、AIDL 多应用间多线程
参数定向tag