前言

在计算机操作系统中,进程是进行资源分配和调度的基本单位。这对于基于Linux内核的Android系统也不例外。在Android的设计中,一个应用默认有一个(主)进程。但是我们通过配置可以实现一个应用对应多个进程。
本文将试图对于Android中应用多进程做一些整理总结。
android:process
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容易被锁
不必要的初始化
Application.onCreate方法。一些简单的代码示例
获取当前的进程名
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系统的安全机制,我们需要做到以下两个准备条件才可以。
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中多进程的一些浅显的研究,如有问题,欢迎指正。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
# android
# 应用内多进程
# app
# 多进程
# 单应用多进程
# Android应用开发SharedPreferences存储数据的使用方法
# Android 动画之TranslateAnimation应用详解
# Android 动画之ScaleAnimation应用详解
# Android开发中多进程共享数据简析
# Android 多进程资料总结
# Android 进程间通信实现原理分析
# Android应用程序四大组件之使用AIDL如何实现跨进程调用Service
# Android编程防止进程被第三方软件杀死的方法
# 解析后台进程对Android性能影响的详解
# Android结束进程的方法详解
# 多个
# 如有
# 按需
# 可以通过
# 情况下
# 可以使用
# 自己的
# 也不
# 还没有
# 成了
# 第一个
# 不太
# 是由
# 捉襟见肘
# 这个问题
# 不受
# 第二个
# 才可以
# 就是我
# 更重要
相关文章:
外贸公司网站制作哪家好,maersk船公司官网?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
建站之星免费模板:自助建站系统与智能响应式一键生成
建站主机默认首页配置指南:核心功能与访问路径优化
存储型VPS适合搭建中小型网站吗?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
音乐网站服务器如何优化API响应速度?
教学网站制作软件,学习*后期制作的网站有哪些?
如何高效配置IIS服务器搭建网站?
如何选择服务器才能高效搭建专属网站?
建站之星CMS五站合一模板配置与SEO优化指南
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
Swift中switch语句区间和元组模式匹配
成都网站制作报价公司,成都工业用气开户费用?
如何在宝塔面板中修改默认建站目录?
建站之星安装失败:服务器环境不兼容?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
沈阳制作网站公司排名,沈阳装饰协会官方网站?
如何通过免费商城建站系统源码自定义网站主题与功能?
如何选择高效便捷的WAP商城建站系统?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
Android自定义控件实现温度旋转按钮效果
简历在线制作网站免费,免费下载个人简历的网站是哪些?
如何用低价快速搭建高质量网站?
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
如何在Golang中引入测试模块_Golang测试包导入与使用实践
javascript基本数据类型及类型检测常用方法小结
建站OpenVZ教程与优化策略:配置指南与性能提升
免费网站制作appp,免费制作app哪个平台好?
如何打造高效商业网站?建站目的决定转化率
简单实现Android验证码
建站之星北京办公室:智能建站系统与小程序生成方案解析
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
C#如何使用XPathNavigator高效查询XML
长沙做网站要多少钱,长沙国安网络怎么样?
如何高效搭建专业期货交易平台网站?
如何通过智能用户系统一键生成高效建站方案?
如何在云虚拟主机上快速搭建个人网站?
建站主机SSH密钥生成步骤及常见问题解答?
网站制作难吗安全吗,做一个网站需要多久时间?
如何通过.red域名打造高辨识度品牌网站?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
网站制作公司,橙子建站是合法的吗?
建站之星如何配置系统实现高效建站?
如何在建站宝盒中设置产品搜索功能?
*请认真填写需求信息,我们会在24小时内与您取得联系。