AMessenger
AMessenger 是一個(gè)有跨進(jìn)程能力的 Handler昂勉,特點(diǎn)是非常輕巧
使用方法
1、初始化
AMessenger.getInstance().init(this);
2阵幸、每個(gè)進(jìn)程注冊(cè)要處理的事件
if (Util.isMainProcess(this)) {
AMessenger.getInstance().register(new MainMessengerHandler(), 111);
} else if (Util.isPlayerProcess(this)) {
AMessenger.getInstance().register(new PlayerMessengerHandler(), 222, 333);
} else if (Util.isDownloadProcess(this)) {
AMessenger.getInstance().register(new DownloadMessengerHandler(), 222, 333);
}
[AMessenger.java]
public void register(AHandler handler, int... whats)
每個(gè)進(jìn)程可以注冊(cè)任意個(gè) AHandler(通常一個(gè)就夠了) 和 what(通常會(huì)有多個(gè))
3精续、發(fā)送消息
AMessage aMessage = new AMessage(222);
aMessage.putParcelable("user", user);
AMessenger.getInstance().sendMessage(aMessage);
AMessenger.getInstance().sendEmptyMessage(333);
4、處理消息
public class PlayerMessengerHandler extends AHandler {
@Override
public void handleMessage(AMessage aMessage) {
if (aMessage.what == 222) {
Log.d("AMessenger", "log in " + aMessage.getParcelable("user", User.CREATOR));
} else if (aMessage.what == 333) {
Log.d("AMessenger", "log out");
}
}
}
原理
很顯然是基于 Messenger 實(shí)現(xiàn)的
1、AMessenger init 時(shí)每個(gè)進(jìn)程都會(huì)創(chuàng)建一個(gè) Messenger
2叨叙、非主進(jìn)程 bind 主進(jìn)程的 HubService,onBind 返回主進(jìn)程的 Messenger
3担敌、在 onServiceConnected 中通過(guò)主進(jìn)程的 Messenger 將自己的 Messenger 發(fā)給主進(jìn)程(sendMsg0)摔敛,這樣主進(jìn)程就擁有所有進(jìn)程的 Messenger
4、之后所有進(jìn)程之間的消息都先發(fā)給主進(jìn)程再進(jìn)行轉(zhuǎn)發(fā)
private void sendMsg0() {
if (mIsMainProcess || mHubMessenger == null) {
return;
}
Message msg0 = Message.obtain();
msg0.what = Integer.MIN_VALUE;
msg0.replyTo = mMessenger;
msg0.getData().putString("process", mProcess);
msg0.getData().putIntArray("whats", getWhats());
try {
mHubMessenger.send(msg0);
} catch (RemoteException e) {
e.printStackTrace();
}
}