1.为什么需要进程间通信
- 业务场景:
不同应用间交互数据 - 技术场景:
增加应用可使用的内存空间,Android系统对每个应用可使用的内存做了限制;
因为一些特殊原因有些模块需要跑在单独的进程。
2.如何多进程
通常情况下,不同的app是跑在不同的进程中,这里主要针对一个app如何跑在多个进程。
在业务开发层面,只有一个方法:即在AndroidManifest.xml文件中给4大组件配置android:process属性。
// 私有进程:有”:"属于当前应用 私有进程,前面默认附带包名,其他应用的组件不可以和它跑在同一个进程中
android:process=“:remote”
// 全局进程:无”:”为 全局进程,其他应用通过SharedUserId方式可以和它跑在同一个进程中
android:process=“com.example.learndemo.remote”
示例:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".RemoteProcessActivity"
android:process="com.example.testipc.remote" />
</application>
// 通过shell命令查看,有两个进程:一个为默认的进程(包名),一个为设置的remote全局进程
C:\Users\ubt>adb shell ps -ef | findstr "com.example"
u0_a46 12211 246 0 09:28:29 ? 00:00:01 com.example.testipc
u0_a46 12247 246 0 09:28:48 ? 00:00:01 com.example.testipc.remote
3.一个应用多进程会带来哪些问题
- 因
Android为每个应用(进程)分配一个独立的虚拟机,不同的虚拟机在内存上有不同的地址空间,因此不同虚拟机访问同一个类的对象会产生多个副本。
即:不同进程的组件拥有独立的虚拟机、Application、内存空间。 - 果
1.单例失效(对象不同)
2.线程同步机制失效(锁定的对象不同)
3.Application会创建多次