IPC机制简介
IPC是Inter-Process Communication的缩写,含义就是跨进程通信。
首先我们要理解什么是进程,什么是线程。按操作系统的描述,进程是资源分配的最小单位,而线程是CPU调度的最小单位,一个进程可以包含多个线程(主线程、子线程)。多线程需要考虑并发问题。
Android中的主线程是也叫UI线程,在主线程执行耗时操作会ANR。
IPC基础概念介绍
主要包含三部分:Serialiazable,Parcelable以及Binder
- 序列化:将对象转化为字节的过程
- Serialiazable:Java提供的序列化接口(标记接口)
- Parcelable:android提供的序列化接口
Serialiazable与Parcelable的区别:Serialiazable使用简单但是需要大量I/O操作,Parcelable使用较繁琐,主要用于内存序列化,效率高。
- Binder
直观的看,Binder是Android中的一个类,实现了IBinder接口
从不同角度理解Binder:
1 从IPC角度,Binder是跨进程通信方式
2 从FrameWork角度,Binder是ServiceManager连接各种Manager(如am, wm等)的桥梁
3 从应用层角度,Binder是客户端与服务端通信的媒介
使用多进程会造成如下几个方面的问题
- 静态成员变量和单例模式失效
- 线程同步机制完全失效
- SharedPreferences的可靠性下降
- Application会多次创建
/**
* 获取当前进程的名字
*
* @param context
* @return
*/
private String getCurProcessName(Context context) {
int pid = android.os.Process.myPid();
ActivityManager mActivityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo appProcess : mActivityManager
.getRunningAppProcesses()) {
if (appProcess.pid == pid) {
return appProcess.processName;
}
}
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "onCreate: --> AIDLApplication 多进程执行多次");
if (getCurProcessName(this).equals(getPackageName())) {
Log.i(TAG, "onCreate: 主进程");
} else {
Log.i(TAG, "onCreate: 其他进程 名字是=" + getCurProcessName(this));
}
}
网友评论