多进程
- 进程是系统资源分配的最小单位,进程间的资源和数据相互隔离
- 多进程使用场景
将一些臃肿的组件放到单独的进程中,防止影响主进程的运行,例如webview、视频合成等 - 多进程的影响
- Application会被多次创建
- 数据共享失效(对象、单例、回调)
- 静态变量和EventBus不支持进程间通信的原因在于,不同的进程会有各自的jvm,也就导致不是同一个EventBus对象。
- 进程间通信(IPC,Inter Process Communication)
进程间通过内核提供的机制完成数据交换,称为进程间通信。
启动多个进程
- 例如:将自己封装的CommonWebViewActivity在一个单独的进程中启动
使用android:process
<activity
android:name=".activity.CommonWebViewActivity"
android:process=":webview"
android:screenOrientation="portrait" />
- 需要特别说明的是,android:process=":webview" 中的webview名字是自定义的,而冒号":"的含义是当前进程名前附加上当前的包名。那么刚刚所创建出的Activity的完整进程名就为com.example.zhangyu:webview
当然你也可以自己设置完整地进程名,如android:process="com.example.process:webview"这便是一种完整地命名方式。
- 以:开头的进程,是APP的私有进程,不允许其他APP的组件来访问。
- 如果这个进程的名字是以小写字符开头的,则这个服务将在一个以该名字命名的全局的进程中运行。当然前提是,它要有相应的权限,这将允许它在不同应用中的各个组件可以共享一个进程。从而减少资源的占用。
- Application多次创建
不同进程跑在不同虚拟机,每个虚拟机启动会创建自己的Application
进程间通信方式(同一个app下)
- 例如同一app下的两个不同进程下的activity
- 使用Intent来传值和回传(就像在同一个进程中一样)
- 使用SharedPreference
进程间通信方式(不同app间)
- Binder (传递可序列化的数据)
- SharedPreferences
可靠性下降,不支持并发写,会出现脏数据。 - Activity
可以跨进程调用其他应用程序的Activity
其实也就是传入Intent,setResult返回Intent - ContentProvider
- BroadcastReceiver
- Service
Content Provider类似,也可以访问其他应用程序中的数据, 但不同的是,ContentProvider返回的是Cursor对象, 而Service返回的是Java对象,这种可以跨进程通讯的服务叫AIDL服务。 - Socket
学过计算机网络的对Socket不陌生,所以不需要详细讲述。只需要注意,Android不允许在主线程中请求网络,而且请求网络必须要注意声明相应的permission。然后,在服务器中定义ServerSocket来监听端口,客户端使用Socket来请求端口,连通后就可以进行通信。
参考资料