2.关于进程间通信(上):引入多进程

1.为什么需要进程间通信

  1. 业务场景:
    不同应用间交互数据
  2. 技术场景:
    增加应用可使用的内存空间,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会创建多次
发布了37 篇原创文章 · 获赞 0 · 访问量 576

猜你喜欢

转载自blog.csdn.net/qq_37514242/article/details/103519809