Android应用多进程通讯
(1)实现:AndroidManifest中声明process属性,指定组件进程
: 开头,为当前应用子进程(私有进程)
小写字母开头,其他应用可用
(2)进程间通讯:
- Messager
使用场景:
同个应用中的多进程时使用
使用方法:
创建获取服务端,客户端的Messager对象
服务端: Service
Messager messagerServer = new Messager(handler)
Messager messagerClient = message.replyTo;
客户端: Activity
Messager messagerClient = new Messager(handler)
message.replyTo = messagerClient;
messagerClient.sendMessage(message)
messagerServer = new Messager(binder);
code:
service:
public class ProcessService extends Service{
private Messenger messengerServer;
private Messenger messengerClient;
private Handler serverHandler;
static class Handler extends android.os.Handler {
private WeakReference<ProcessService> instance;
public Handler (ProcessService processService) {
instance = new WeakReference<>(processService);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
instance.get().handleMessage(msg);
}
}
public void handleMessage(Message msg) {
messengerClient = msg.replyTo;//获取客户端Messenger
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
serverHandler = new Handler(this);
messengerServer = new Messenger(serverHandler);//创建服务端Messenger
return messengerServer.getBinder();
}
}
Client:
public class MainActivity extends Activity {
private Messenger messengerServer;
private Messenger messengerClient;
private Handler clientHandler;
static class Handler extends android.os.Handler {
WeakReference<MainActivity> instance;
public Handler (MainActivity instance) {
this.instance = new WeakReference<>(instance);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (instance != null) instance.get().handleMessage(msg);
}
}
public void handleMessage(Message msg) {
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
clientHandler = new Handler(this);
messengerClient = new Messenger(clientHandler);//客户端Messenger
bindService(new Intent(this, ProcessService.class), serviceConnection, BIND_AUTO_CREATE);
}
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
messengerServer = new Messenger(service);//获取服务端Messenger
sendMsg();
}
@Override
public void onServiceDisconnected(ComponentName name) {
messengerServer = null;
}
};
@Override
protected void onResume() {
super.onResume();
}
public void sendMsg () {
if (messengerServer != null) {
Message message = Message.obtain();
message.replyTo = messengerClient;
message.what = 11;
try {
messengerServer.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
}
-
AIDL
使用场景: 多个应用进程间通讯
使用方法:
服务端 (1)对应包名下new aidl 文件,会在aidl文件夹下生成对应包名的aidl文件 (2)build 项目,在build-- generated--source -- aidl --debug下生成对应的java文件 (3)服务端实现AIDL.Stub 实现aidl文件中定义的接口方法 (4) 服务端远程服务中onbind方法返回 stub.asBinder() 客户端 (1)建立相同包名的aidl文件 (2)bind启动远程服务 bindService(new Intent(this, AidlService.class) ,serviceConnection, Context.BIND_AUTO_CREATE); (3)ServiceConnection 中获取AIDL对象,调用aidl接口中定义的方法,code: IMyAidlInterface aidl; private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { aidl = (IMyAidlInterface) service; } @Override public void onServiceDisconnected(ComponentName name) { } };
Messager底层封装的也是AIDL的调用方法;
AIDL是一种代理模式。通过代理远程对象,调用对象的方法,实现进程间的通讯。