第二章 IPC机制
2.2 Android中的多进程模式
1.首先,在Android中使用多进程只有一种方法,那就是给四大组件在AndroidMenifest中指定android:process属性,除此之外没有其他办法。
属性值不同,即代表在不同的进程中。
2.可以通过adb shell ps | grep com.ryg.chapter_2来查看进程信息。(com.ryg.chapter_2是包名前缀)
3.进程名以“:”开头的进程属于当前应用的私有进程,其他应用组件不可以和它跑在同一个进程中,而进程名不以“:”开头的进程属于全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中。如下:
<activity
android:name = "com.ryg.chapter_2.SecondActivity"
android:process = ": remote"/> (私有进程)
<activity
android:name = "com.ryg.chapter_2.ThirdActivity"
android:process = "com.ryg.chapter_2.remote"/> (全局进程)
4.多进程会造成的几个问题:
- 静态成员和单例模式完全失效
- 线程同步机制完全失效
- SharedPreferences的可靠性下降
- Application会多次创建(运行在不同进程中的组件是属于两个不同的虚拟机和同一个Application的)
多进程模式中,不同进程的组件的确会拥有独立的虚拟机、Application以及内存空间
2.3 跨进程通信常用的接口:Serializable接口、Parcelable接口以及Binder(这部分略)。
| Parcelable | Serializable
----|------|----
效率 | 效率很高 | 开销很大、序列化和反序列化过程需要大量I/O操作
复杂度 | 较为复杂 | 较为简单
适合场景 | Android推荐(内存序列化) | 适合将对象序列化到存储设备或者网络传输中
2.4 Android中的IPC方式
- 使用Bundle(Bundle实现了Parcelable接口),四大组件中的三个组件(Activity、Service、Receiver)都是支持在Intent中传递数据的
- 使用文件共享。
- 可以是文本文件,也可以是XML文件
- 使用SharedPreferences(每个应用的SharedPreferences文件都可以在当前包所在的data目录下查看到,一般来说,它的目录在/data/data/package name/shared_prefs目录下(package name是当前包名)
- 使用Messenger(以一个串行的方式处理客户端发来的消息,如果大量的消息同时发送到服务器,服务器仍然只能一个个处理,如果有大量的并发请求,那么用Messenger就不太合适了,messenger也不能跨进程调用服务端)
- 使用AIDL来实现跨进程的方法调用。
- 使用ContentProvider(用的很多,不过多介绍)
- Socket通信,常用于网络数据交换。
建议练习一下Messenger、AIDL、Socket,书中P65到P120,虽然除了AIDL其他在平常的使用中并不常用