参考Android开发艺术探索
IPC简介
IPC:Inter-Process Communication,进程间通讯 或者 跨进程通讯。
- 线程是CPU调度的最小单元,同时线程是一种有限的系统资源。
- 进程一般是一个执行单元,在PC和移动设备上指一个程序或者一个应用。
Android中的IPC
-
Binder:Android中特有的进程通讯方式
- ContentProvider
- Intent (即通过 Bundle传输数据)
- Messenger
-
Socket:可以实现任意两个终端之间的通信,在同一个设备的两个进程之间通讯 Socket自然也支持。
-
使用文件共享
此方式适合在对数据同步要求不高的进程之间进行通信,并且要妥善处理并发读/写的间隔。
==注意==:SharedPreference 并不在这种方式的范围内。SharedPreference是Android在提供的轻量级存储方案,它通过键值对的方式来存储数据,在底层实现上它采用 XML文件来存储键值对,每个应用的 ShredPreference文件都可以在当前包所在的 data目录下查看到。本质上来说,SharedPreference 也是文件的一种,但是由于系统对它的读/写有一定的缓存策略,即内存中会有一份SharedPreference 文件的魂村,因此在多进程模式下,系统对它的读/写就变得不可靠,当面对高并发的读/写访问,SharedPreference有很大几率会丢失数据,因此,不建议在进程间通信中使用SharedPreference。
开启多进程的方式
- 常规中,在Android中开启多进程的方式只有一个,就是给四大组件在AndroidManifest中指定 android:process 属性。
- 非常规的一种方式,就是通过JNI 在 Native 层去fork 一个新的进程。
这里主要针对 process 属性的开启多进程的模式展开描述。
packageName = "com.test"
android:process=":remote"
android:process="com.test.remote"
上面code 中显示两种process 属性赋值的方式
-
一种是有
:
,这是一种简写,完整进程名会自动为其附加包名。这种方式开启的进程,属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中。
-
另一种是完整的命名方式,此种属于全局进程,其他应用通过ShareUID的方式可以和它跑在同一个进程中
Android系统会为每个应用分配一个唯一的UID,具有相同UID的应用才能共享数据。这里要说明的是,两个应用通过ShareUID 跑在同一个进程中是有要求的,需要这两个应用有相同的ShareUID 并且签名相同才可以。在这种情况下,它们可以相互访问对方的私有数据,比如data目录、组件信息等,不管它们是否跑在同一个进程中。当然如果它们跑在同一个进程中,那么除了能共享data目录、组件信息,还可以共享内存数据,或者说它们看起来就像是一个应用的两个部分。
IPC中常用的类
- CopyOnWriteArrayList
- ConcurrentHashMap
- AtomicBoolean
- RemoteCallbackList
这些类都是为了保证多线程并发的情况下的线程安全的类,为方便开发者使用,由系统实现的原子类。其中RemoteCallbackList 是为了解决跨进程通信时的 监听回调的类。
网友评论