深入浅析Android应用中的多进程

发布时间:2020-11-20 16:53:02 作者:Leah
来源:亿速云 阅读:304

这篇文章将为大家详细讲解有关深入浅析Android应用中的多进程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

android:process

一个应用 android:process 简单示例

<activity android:name=".MusicPlayerActivity" android:process=":music"/>

<activity android:name=".AnotherActivity" android:process="droidyue.com"/>

应用多进程有什么好处

增加App可用内存

在Android中,默认情况下系统会为每个App分配一定大小的内存。比如从最早的16M到后面的32M或者48M等。具体的内存大小取决于硬件和系统版本。

这些有限的内存对于普通的App还算是够用,但是对于展示大量图片的应用来说,显得实在是捉襟见肘。

仔细研究一下,你会发现原来系统的这个限制是作用于进程的(毕竟进程是作为资源分配的基本单位)。意思就是说,如果一个应用实现多个进程,那么这个应用可以获得更多的内存。

于是,增加App可用内存成了应用多进程的重要原因。

独立于主进程

除了增加App可用内存之外,确保使用多进程,可以独立于主进程,确保某些任务的执行和完成。

举一个简单的例子,之前的一个项目存在退出的功能,其具体实现为杀掉进程。为了保证某些统计数据上报正常,不受当前进程退出的影响,我们可以使用独立的进程来完成。

多进程的不足与缺点

数据共享问题

SQLite容易被锁

不必要的初始化

一些简单的代码示例

获取当前的进程名

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的其他问题

android:process部分我们提到,如果这个属性值以小写字母开头,那么就是全局的进程,可以被其他应用共用。

所谓的共用,指的是不同的App的组件运行在同一个指定的进程中。

准备条件

受制于Android系统的安全机制,我们需要做到以下两个准备条件才可以。

  1. 这个应用使用同样的签名
  2. 两个应用指定同一个android:sharedUserId的值
     

具体示例

第一个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应用中的多进程就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

推荐阅读:
  1. 深入浅析Java 中的CharArrayReader
  2. 深入浅析JDK中的PriorityQueue

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

android roi 多进程

上一篇:Android项目中怎么样实现加载assets中的资源文件

下一篇:使用git实现一个码云上传功能

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》