IPC
前言
IPC -->Intent process communication 进程间通信或者进程通信
Android中多进程模式
开启方式,在清单文件中设置process的值如 android:process:":remote"
”:":表示要在当前进程名前面附加上当前的包名,
包名加”:“完整的命名方式,进程名以”:“开头表示属于当前应用的私用进程,不以”:“开头的属于全局进程,通过ShareUID共享信息
Android中的多进程一个进程开启一个虚拟机运行,多进程的缺点:
1.静态变量和单例模式完全失效(一个进程一个虚拟机,不同的虚拟机内存分配上有不同的地址空间)
2.线程同步机制完成失效(同理,由于不是同一块内存,不管锁对象还是锁全局类都无法保证线程同步,不同进程锁的不是同一个对象)
3.SharedPreferences的可靠性下降(sp底层是通过读写xml文件实现,不支持并发读写,不然会有问题)
4.Application会多次创建(运行在同一个进程的组件是属于同一个虚拟机和同一个Application的)
通过Messenger进行IPC
1.使用Bundle传递基本数据类型、序列化对象以及Android支持的一下特殊对象
2.使用文件共享,适合对数据同步要求不高的进程间通信
3.使用Messenger,底层是AIDL实现
实现:
1.服务端
在服务端创建一个Service处理客户端的连接请求
同时创建一个Handler,在Handle中创建Messenger对象
在Service中的onBind()中返回这个Messenger对象底层的Binder
2.客户端
绑定服务端的Service,绑定成功后通过服务端返回的IBinder对象创建一个Messenger,有这个Messenger后就可以向服务端发消息。发的是Message对象
如果需要服务端可以回应客户端,就像回应服务端那样,我们就还需要创建一个Handler并创建一个新的Messenger,并把这个Messenger对象通过Message的replyTo参数传递给服务端,服务端通过这个replyTo参数就可以回应客户端
eg:
服务端
package com.hwt.mvpproject_hwt.test;
import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
public class MessengerService extends Service {
private final Messenger messenger = new Messenger(new MessengerHandler());
public MessengerService() {
}
@Override
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
public static class MessengerHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 1:
Log.i("ARROW", "handleMessage: "+msg.getData());
Messenger client = msg.replyTo;
Message message = Message.obtain(null,0);
Bundle bundle = new Bundle();
bundle.putString("reply","好好好");
message.setData(bundle);
try {
client.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
}
}
}
客户端
package com.hwt.mvpproject_hwt.test;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import com.hwt.mvpproject_hwt.R;
public class MessengerActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_messenger);
Intent intent = new Intent(this,MessengerService.class);
bindService(intent,serviceConnection,BIND_AUTO_CREATE);
}
private Messenger messenger;
private Messenger getReplyToMessenger = new Messenger(new MessengerHandler());
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
messenger = new Messenger(service);
Message msg = Message.obtain(null,1);
Bundle data = new Bundle();
data.putString("msg","Hello,Service");
msg.setData(data);
//接受服务端的数据需要的replyTo参数传递给服务端
msg.replyTo = getReplyToMessenger;
try {
messenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
private static class MessengerHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 0:
Log.i("ARROW", "handleMessage: client"+msg.getData());
break;
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(serviceConnection);
}
}
服务端和客户端通过Messenger两者互相进行通信的流程