Android中应用多进程的整理总结

Android中应用多进程的整理总结,第1张

概述前言在计算机 *** 作系统中,进程是进行资源分配和调度的基本单位。这对于基于Linux内核的Android系统也不例外。在Android的设计中,一个应用默认有一个(主)进程。但是我们通过配置可以实现一个应用对应多个进程。

前言

在计算机 *** 作系统中,进程是进行资源分配和调度的基本单位。这对于基于linux内核的AndroID系统也不例外。在AndroID的设计中,一个应用默认有一个(主)进程。但是我们通过配置可以实现一个应用对应多个进程。

本文将试图对于AndroID中应用多进程做一些整理总结。

androID:process

应用实现多进程需要依赖于androID:process@H_502_19@这个属性 适用元素:Application,Activity,broadcastReceiver,Service,ContentProvIDer。 通常情况下,这个属性的值应该是”:“开头。表示这个进程是应用私有的。无法在在跨应用之间共用。 如果该属性值以小写字母开头,表示这个进程为全局进程。可以被多个应用共用。(文章结尾会探讨这个问题)

一个应用 androID:process @H_502_19@简单示例

@H_403_33@<activity androID:name=".MusicPlayerActivity" androID:process=":music"/><activity androID:name=".AnotherActivity" androID:process="droIDyue.com"/>

应用多进程有什么好处

增加App可用内存

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

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

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

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

独立于主进程

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

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

多进程的不足与缺点

数据共享问题

由于处于不同的进程导致了数据无法共享内容,无论是static变量还是单例模式的实现。 SharedPreferences 还没有增加对多进程的支持。 跨进程共享数据可以通过Intent,Messenger,AIDL等。

sqlite容易被锁

由于每个进程可能会使用各自的sqlOpenHelper实例,如果两个进程同时对数据库 *** 作,则会发生sqliteDatabaseLockedException等异常。 解决方法:可以使用ContentProvIDer来实现或者使用其他存储方式。

不必要的初始化

多进程之后,每个进程在创建的时候,都会执行自己的Application.onCreate@H_502_19@方法。 通常情况下,onCreate中包含了我们很多业务相关的初始化,更重要的这其中没有做按照进程按需初始化,即每个进程都会执行全部的初始化。 按需初始化需要根据当前进程名称,进行最小需要的业务初始化。 按需初始化可以选择简单的if else判断,也可以结合工厂模式

一些简单的代码示例

获取当前的进程名

@H_403_33@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;}

基本的进程初始化类

这个类用来每个进程共用的业务初始化逻辑。

@H_403_33@public class AppInitialization { @CallSuper public voID onAppCreate(Application application) { Log.i("AppInitialization","onAppCreate is being executed."); }}

工厂模式的应用

@H_403_33@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."); } }}

具体的调用时的代码

@H_403_33@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); } }}

是否需要多进程

判断是否需要多进程,需要视具体情况而定。

内存限制

研究内存占用居高不下的原因 如果是由内存泄漏导致,尝试解决来降低内存占用 如有必要,可以通过配置largeHeap尝试解决

除了内存限制之外,还需要考虑是否真的需要独立于主进程来执行某些 *** 作。

关于androID:process的其他问题

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

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

准备条件

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

这个应用使用同样的签名 两个应用指定同一个androID:sharedUserID@H_502_19@的值

具体示例

第一个App的Manifest文件,AnotherActivity运行在名为droIDyue.com的进程中。

@H_403_33@<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的进程中。

@H_403_33@<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中多进程的一些浅显的研究,如有问题,欢迎指正。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

总结

以上是内存溢出为你收集整理的Android中应用多进程的整理总结全部内容,希望文章能够帮你解决Android中应用多进程的整理总结所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1147093.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)