在计算机操作系统中,进程是进行资源分配和调度的基本单位。这对于基于 Linux 内核的 Android 系统也不例外。在 Android 的设计中,一个应用默认有一个 (主) 进程。但是我们通过配置可以实现一个应用对应多个进程。
本文将试图对于 Android 中应用多进程做一些整理总结。
一个应用 android:process 简单示例
- <activity android:name=".MusicPlayerActivity" android:process=":music"
- />
- <activity android:name=".AnotherActivity" android:process="droidyue.com"
- />
在 Android 中,默认情况下系统会为每个 App 分配一定大小的内存。比如从最早的 16M 到后面的 32M 或者 48M 等。具体的内存大小取决于硬件和系统版本。
这些有限的内存对于普通的 App 还算是够用,但是对于展示大量图片的应用来说,显得实在是捉襟见肘。
仔细研究一下,你会发现原来系统的这个限制是作用于进程的 (毕竟进程是作为资源分配的基本单位)。意思就是说,如果一个应用实现多个进程,那么这个应用可以获得更多的内存。
于是,增加 App 可用内存成了应用多进程的重要原因。
除了增加 App 可用内存之外,确保使用多进程,可以独立于主进程,确保某些任务的执行和完成。
举一个简单的例子,之前的一个项目存在退出的功能,其具体实现为杀掉进程。为了保证某些统计数据上报正常,不受当前进程退出的影响,我们可以使用独立的进程来完成。
一些简单的代码示例
- private String getCurrentProcessName() {
- String currentProcName = "";
- int pid = android.os.Process.myPid();
- ActivityManager manager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
- for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
- if (processInfo.pid == pid) {
- currentProcName = processInfo.processName;
- break;
- }
- }
- return currentProcName;
- }
这个类用来每个进程共用的业务初始化逻辑。
- public class AppInitialization {
- @CallSuper
- public void onAppCreate(Application application) {
- Log.i("AppInitialization", "onAppCreate is being executed.");
- }
- }
- public class AppInitFactory {
- public static AppInitialization getAppInitialization(String processName) {
- AppInitialization appInitialization;
- if (processName.endsWith(":game")) {
- appInitialization = new GameAppInitialization();
- } else if (processName.endsWith(":music")) {
- appInitialization = new MusicAppInitialization();
- } else {
- appInitialization = new AppInitialization();
- }
- return appInitialization;
- }
- static class GameAppInitialization extends AppInitialization {
- @Override
- public void onAppCreate(Application application) {
- super.onAppCreate(application);
- Log.i("GameAppInitialization", "onAppCreate is being executed.");
- }
- }
- static class MusicAppInitialization extends AppInitialization {
- @Override
- public void onAppCreate(Application application) {
- super.onAppCreate(application);
- Log.i("MusicAppInitialization", "onAppCreate is being executed.");
- }
- }
- }
- public class MyApplication extends Application{
- private static final String LOGTAG = "MyApplication";
- @Override
- public void onCreate() {
- super.onCreate();
- String currentProcessName = getCurrentProcessName();
- Log.i(LOGTAG, "onCreate currentProcessName=" + currentProcessName);
- AppInitialization appInitialization = AppInitFactory.getAppInitialization(currentProcessName);
- if (appInitialization != null) {
- appInitialization.onAppCreate(this);
- }
- }
- }
判断是否需要多进程,需要视具体情况而定。
除了内存限制之外,还需要考虑是否真的需要独立于主进程来执行某些操作。
在 android:process 部分我们提到,如果这个属性值以小写字母开头,那么就是全局的进程,可以被其他应用共用。
所谓的共用,指的是不同的 App 的组件运行在同一个指定的进程中。
受制于 Android 系统的安全机制,我们需要做到以下两个准备条件才可以。
第一个 App 的 Manifest 文件,AnotherActivity 运行在名为 droidyue.com 的进程中。
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.droidyue.androidmutipleprocesssample"
- android:sharedUserId="droidyue.com"
- >
- <application
- android:name=".MyApplication"
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:supportsRtl="true"
- android:theme="@style/AppTheme">
- <activity android:name=".AnotherActivity" android:process="droidyue.com"/>
- </application>
- </manifest>
第二个 App 的 Manifest 文件,SecondActivity 运行在名为 droidyue.com 的进程中。
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.jishuxiaoheiwu.accessfromanotherprocess"
- android:sharedUserId="droidyue.com"
- >
- <application
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:supportsRtl="true"
- android:theme="@style/AppTheme">
- <activity android:name=".SecondActivity"
- android:process="droidyue.com"
- />
- </application>
- </manifest>
上面的 AnotherActivity 和 SecondActivity 会运行在一个名为 droidyue.com 的进程中,尽管他们位于不同的 App 中。
但是这种共用进程的方式会引发很多问题,不太建议大家使用。
以上就是我关于 Android 中多进程的一些浅显的研究,如有问题,欢迎指正。
来源: