当前位置: 首页 > news >正文

android 多进程 数据库,Android中应用多进程的整理总结

前言

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

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

android:process

应用实现多进程需要依赖于android:process这个属性

适用元素:Application, Activity, BroadcastReceiver, Service, ContentProvider。

通常情况下,这个属性的值应该是”:“开头。表示这个进程是应用私有的。无法在在跨应用之间共用。

如果该属性值以小写字母开头,表示这个进程为全局进程。可以被多个应用共用。(文章结尾会探讨这个问题)

一个应用 android:process 简单示例

应用多进程有什么好处

增加App可用内存

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

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

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

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

独立于主进程

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

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

多进程的不足与缺点

数据共享问题

由于处于不同的进程导致了数据无法共享内容,无论是static变量还是单例模式的实现。

SharedPreferences 还没有增加对多进程的支持。

跨进程共享数据可以通过Intent,Messenger,AIDL等。

SQLite容易被锁

由于每个进程可能会使用各自的SQLOpenHelper实例,如果两个进程同时对数据库操作,则会发生SQLiteDatabaseLockedException等异常。

解决方法:可以使用ContentProvider来实现或者使用其他存储方式。

不必要的初始化

多进程之后,每个进程在创建的时候,都会执行自己的Application.onCreate方法。

通常情况下,onCreate中包含了我们很多业务相关的初始化,更重要的这其中没有做按照进程按需初始化,即每个进程都会执行全部的初始化。

按需初始化需要根据当前进程名称,进行最小需要的业务初始化。

按需初始化可以选择简单的if else判断,也可以结合工厂模式

一些简单的代码示例

获取当前的进程名

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);

}

}

}

是否需要多进程

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

内存限制

研究内存占用居高不下的原因

如果是由内存泄漏导致,尝试解决来降低内存占用

如有必要,可以通过配置largeHeap尝试解决

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

关于android:process的其他问题

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

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

准备条件

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

这个应用使用同样的签名

两个应用指定同一个android:sharedUserId的值

具体示例

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

package="com.droidyue.androidmutipleprocesssample"

android:sharedUserId="droidyue.com"

>

android:name=".MyApplication"

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

第二个App的Manifest文件,SecondActivity运行在名为droidyue.com的进程中。

package="com.example.jishuxiaoheiwu.accessfromanotherprocess"

android:sharedUserId="droidyue.com"

>

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

android:process="droidyue.com"

/>

上面的AnotherActivity和SecondActivity会运行在一个名为droidyue.com的进程中,尽管他们位于不同的App中。

但是这种共用进程的方式会引发很多问题,不太建议大家使用。

以上就是我关于Android中多进程的一些浅显的研究,如有问题,欢迎指正。

总结

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

您可能感兴趣的文章:

Android应用开发SharedPreferences存储数据的使用方法

Android 动画之TranslateAnimation应用详解

Android 动画之ScaleAnimation应用详解

Android开发中多进程共享数据简析

Android 多进程资料总结

Android 进程间通信实现原理分析

Android应用程序四大组件之使用AIDL如何实现跨进程调用Service

Android编程防止进程被第三方软件杀死的方法

解析后台进程对Android性能影响的详解

Android结束进程的方法详解

相关文章:

  • Android CPU 双核,骁龙MSM8625双核处理器
  • html图片自动对齐,HTML网页中的图形是如何对齐的?有什么方法可以使它们对齐?...
  • android加固apache,Apache安全加固(3)修改httpd.conf文件
  • android初级课程表,模仿大神的一个android课程表
  • html表格 图片 自适应,响应式表格,HTML表格自适应(responsive table)
  • 2021高考成绩微信查询6,湖南6月25日左右公布高考成绩
  • html段落文本,证明段落文本HTML
  • 冯诺依曼计算机主机,冯诺依曼结构计算机包括哪五大部分?
  • map HTML 兼容,HTML map 标签 - HTML 颜色参考手册 - 自强学堂
  • html在id下加标签,html – 标签“for”和输入“id”
  • html5 drag this,HTML5之ondragover,ondrop,ondragstart
  • 计算机应用基础 在线作业 f,计算机应用基础在线作业F.doc
  • 浙江省计算机二级办公软件高级应用等级,浙江省计算机等级考试
  • 计算机网口速率修改,win7系统修改无线网卡连接速率的操作方法
  • 第一年职称计算机考试,2018年职称计算机考试photoshop练习题及答案(1)
  • Asm.js的简单介绍
  • es6--symbol
  • JAVA之继承和多态
  • Laravel Mix运行时关于es2015报错解决方案
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • node学习系列之简单文件上传
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • Vue2 SSR 的优化之旅
  • Vue组件定义
  • web标准化(下)
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 收藏好这篇,别再只说“数据劫持”了
  • 学习HTTP相关知识笔记
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • # .NET Framework中使用命名管道进行进程间通信
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (06)Hive——正则表达式
  • (Matlab)使用竞争神经网络实现数据聚类
  • (ros//EnvironmentVariables)ros环境变量
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)计算机毕业设计高校学生选课系统
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (六)软件测试分工
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (四)模仿学习-完成后台管理页面查询
  • (算法设计与分析)第一章算法概述-习题
  • (转)ObjectiveC 深浅拷贝学习
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .NET 5种线程安全集合
  • .NET Core 中插件式开发实现
  • .Net 路由处理厉害了
  • .NET简谈设计模式之(单件模式)
  • .php文件都打不开,打不开php文件怎么办
  • @JsonSerialize注解的使用
  • [ linux ] linux 命令英文全称及解释
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序