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


本文整理自网络,侵删。

前言

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

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

android:process

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

一个应用 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可用内存之外,确保使用多进程,可以独立于主进程,确保某些任务的执行和完成。

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

多进程的不足与缺点

数据共享问题

  • 由于处于不同的进程导致了数据无法共享内容,无论是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;
}

基本的进程初始化类

阅读剩余部分

相关阅读 >>

Sqlitestudio打开后如何切换成简体中文Sqlitestudio绿色版中文设置方法介绍

Sqlite 实现if not exist 类似功能的操作

python人工智能实战之对话机器人的实现

Sqlitestudio打开后如何切换成简体中文Sqlitestudio绿色版中文设置方法介绍

python实现Sqlite将字段当做索引进行查询的方法

Sqlite3中数据导入到mysql中的实战教程

android开发笔记之 数据存储方式详解

c#查询sqlserver数据库并返回单个值的方法

c#中efcore-shardingcore呈现“完美”分表

基于android的英文词典的实现方法

更多相关阅读请进入《Sqlite》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...