💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
### 二、Android中的多进程模式 #### 1、开启多进程模式 正常情况下,Android中多进程是指一个应用中存在多个进程的情况。在Android中使用多进程只有一种方法:就是给四大组件(Activity、Service、Receiver、ContentProvider)在AndroidManifest中指定android:process属性。这个属性的值就是进程名。这意味着不能在运行时指定一个线程所在的进程。(其实还有一种方式,就是使用JNI在Native层去fork一个新的进程,这中方法属于特殊情况,也不是常用的创建多进程的方式) 关于进程的详细描述可参考[深入了解Android系统之进程](https://www.kancloud.cn/alex_wsc/androidsystem/403689)和[Android进程和线程](https://www.kancloud.cn/alex_wsc/android/431889) 可以在Eclipse的DDMS视图中查看进程信息,还可以用shell来查看当前所存在的进程信息,命令为:adb shell ps 或者 adb shell ps|grep 包名。 ~~~ <activity android:name=".MainActivity" android:configChanges="orientation|screenSize" android:label="@string/app_name" android:launchMode="standard" > <intent-filter> <action android:name="android.intent.action.MAIN" /> </intent-filter> </activity> <activity android:name=".SecondActivity" android:configChanges="screenLayout" android:label="@string/app_name" android:process=":remote" /> <activity android:name=".ThirdActivity" android:configChanges="screenLayout" android:label="@string/app_name" android:process="com.ryg.chapter_2.remote" /> ~~~ 上面的代码中, (1)MainActivity没有指定process属性,所以它运行在默认的进程中,默认进程的进程名是包名。 (2)SecondActivity会运行在一个单独的进程中,进程名为“com.ryg.chapter_2:remote”,其中com.ryg.chapter_2是包名。在程序中的冒号“:”的含义是指要在当前的进程名前面附加上当前的包名,是一种简写的方法。而且以“:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中。而进程名不以“:”开头的进程属于全局进程,其他应用通过ShareUID 方式可以和它跑在同一个进程中。 (3)ThirdActivity会运行在另一个单独的进程中,进程名为“com.ryg.chapter_2.remote”。这是一种完整的命名方式。属于全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中(需要这2个应用有相同的ShareUID且签名相同才可以)。 >[info] **注意点一**:Android系统会为每一个应用分配一个唯一的UID,具有相同UID的应用才能共享数据。要求两个应用具有相同的ShareUID并且签名相同才可以跑在同一个进程中。在这种情况下,它们可以互相访问对方的私有数据,比如data目录、组件信息等,不管它们是否跑在同一个进程中。当然如果它们跑在同一个进程中,那么除了能共享data目录、组件信息,还可以共享内存数据,或者说它们看起来就像是一个应用的两个部分。 #### 2、多进程模式的运行机制 (1)多进程会带来很多意想不到的麻烦,因为Android为每一个应用都分配了一个独立的虚拟机,或者说为每个进程都分配了一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机中访问同一个类的对象会产生多份副本。这样很就容易导致数据不同步。 (2)所有运行在不同进程的四大组件,只要它们之间需要通过内存来共享数据,都会共享失败,这也是多进程所带来的主要影响。正常情况下,四大组件中间不可能不通过一些中间层来共享数据,那么简单的指定进程名来开启多进程都会无法正确的运行。当然,特殊情况下,某些组件之间不需要共享数据,这个时候可以指定android:progress来开启多进程,但是这种场景是不常见的,几乎所有的情况都需要共享数据。 (3)使用多进程会造成主要以下四方面的问题: * 静态成员和单例模式完全失效。(由独立虚拟机造成) * 线程同步机制完全失效。(同上) * SharedPreferences的可靠性下降。(存在并发读写的问题) * Application会多次创建。(新的进程中又会导致进程所在的Application在新的虚拟机中再次创建) (4)运行在同一个进程中的组件是属于同一个虚拟机和同一个Application的,同理,运行在不同进程的组件是属于两个不同的虚拟机和Application的。 (5)多进程相当于两个不同的应用采用了SharedUID的模式 (6)实现跨进程的方式有很多: 1. Intent传递数据。 2. 共享文件和SharedPreferences。 3. 基于Binder的Messenger和AIDL。 4. Socket等