目录

前言

什么是IPC?

什么是AIDL?

为什么用多进程?

正文

一、多进程的使用及优化

二、多进程解决问题

三、多进程的坑

四、多进程优化


前言

说起进程,不得不说说进程和线程之前的关系。在操作系统角度描述,线程是CPU调度的最小单位且是有限的系统资源。而进程是值一个执行单位,例如一个程序或应用,一个进程包含多个线程,默认的一个线程是主线程,即UI线程,可以操作Ui界面元素,但不能做耗时任务,否则会ARN程序无响应。我们可以使用多进程分担主进程压力以免因资源消耗过大被crash掉,另外多进程相互监听可以唤醒,使应用程序长期驻守后台接受即时消息和通知,防止应用被系统回收。

什么是IPC?

IPC(Inter-Process Communication)即进程间通信或者跨进程通信,指两个进程之间数据交换的过程。

什么是AIDL?

AIDL(Android Interface Definition Language)即Android接口定义语言,指Android 提供的一种进程间通信 (IPC) 机制。

Android Binder机制AIDL实例介绍

为什么用多进程?

下面说一下微信采用多进程开发的客户端架构,看看微信是怎么做的?

微信在v2.x+版本时,对NetWork层做轻重进程分离,独立到一个单独的进程中(:push中),而上面两个层级依然跑在微信主进程中(:workder中)。对于有内存泄漏的webview或者其他不频繁使用的功能,再把其单独分离到工具进程中(:tools中)。

通过分离进程,微信第一次重构解决了系统因为微信资源消耗,主动干掉微信服务的困境。

正文

一、多进程的使用及优化

1、我们可以通过指定四大组件在AndroidManifest文件中的属性android:process所处的进程包名即可。启动方式看起来很简单,但是远远没有我们想的那么简单,有时候我们使用多进程带来的好处,不及弥补代码层面的负面影响。

2、默认情况下,应用拥有一个主进程。组件被指定新进程之后,系统在启动这个组件的时候,是先创建这个进程,再创建该组件。打印出进程名称办法:重载Application类的onCreate方法即可。

3、设置android:process属性时,要注意:如果是android:process=”:deamon”,以:开头的名字,表示这是一个应用程序的私有进程,否则它是一个全局进程。私有进程的进程名称是会在冒号前自动加上包名,而全局进程则不会。一般我们都是有私有进程,很少使用全局进程。例如:

<activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activityandroid:name=".SecondActivity"android:process=":remote" /><activityandroid:name=".ThirdActivity"android:process="com.example.mac.processdemo.remote" /></application>

二、多进程解决问题

1、分担主进程的内存压力。

当应用越做越大,内存越来越多,将一些独立的组件放到不同的进程,它就不占用主进程的内存空间了。当然还有其他好处,有心人会发现

2、使应用常驻后台,防止主进程被杀守护进程,守护进程和主进程之间相互监视,有一方被杀就重新启动它。

Android后台进程里有很多应用是多个进程的,因为它们要常驻后台,特别是即时通讯或者社交应用,不过现在多进程已经被用烂了。典型用法是在启动一个不可见的轻量级私有进程,在后台收发消息,或者做一些耗时的事情,或者开机启动这个进程,然后做监听等。坏处:消耗用户的电量,多占用了系统的空间,若所有应用都这样占用,系统内存很容易占满而导致卡顿,应用程序架构会变得复杂,因为要处理多进程之间的通信。这里又是另外一个问题了。

三、多进程的坑

1、静态成员和单例模式完全失效 。
Android 为每一个进程分配一个独立的虚拟机,不同虚拟机在内存分配上有不同地址空间,这就导致多进程下访问同一个类的对象会产生多分副本。所以在一个进程中修改某个值,只会在当前进程有效,对其他进程不会造成任何影响。

2、线程同步机制完全失效。
因为多进程的内存地址空间不同,锁的不是同一个对象,所以不管是锁对象还是锁全局对象都无法保证线程同步。

3、SharedPreferences 的可靠性下降。
因为SharedPreferences 底层通过读写XML实现,并发读写显然是不安全的操作,甚至会出现数据错乱。

4、Application 会多次创建。
当一个组件指定一个新进场启动时,由于系统在创建新进程的同时要分配独立虚拟机,而这是一个启动应用的过程。因此,相当于系统又把应用的重新启动了一遍,既然重新启动了,那么自然要创建新的Application。

四、多进程优化

1、针对Application的多次重建:
在Application的onCreate中获取进程Id来判断不同进程,然后做不同的事情。

public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();//获取进程Idint pid = android.os.Process.myPid();Log.e("m_tag", "MyApplication onCreate pid is " + pid); //根据进程id获取进程名称String pName = getProcessName(this,pid);if("com.xyy.processtest".equals(pName)){//处理该进程的业务}}
}
public String getProcessName(Context cxt, int pid) {ActivityManager am = (ActivityManager)cxt.getSystemService(Context.ACTIVITY_SERVICE);List<RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();if (runningApps == null) {return null;}for (RunningAppProcessInfo procInfo : runningApps) {if (procInfo.pid == pid) {return procInfo.processName;}}return null;
}

2、针对静态成员的失效:

使用Intent或者aidl等进程通讯方式传递内容,不能用静态或单例模式。

3、针对文件共享问题:

多进程情况下会出现两个进程在同一时刻访问同一个数据库文件的情况。这就可能造成资源的竞争访问,导致诸如数据库损坏、数据丢失等。在多线程的情况下我们有锁机制控制资源的共享,但是在多进程中比较难,虽然有文件锁、排队等机制,但是在Android里很难实现。解决办法就是多进程的时候不并发访问同一个文件,比如子进程涉及到操作数据库,就可以考虑调用主进程进行数据库的操作。

结束。

Android 多进程的基础使用及优缺点相关推荐

  1. Android IPC机制之IPC概念、Android 多进程和相关基础知识

    1.IPC 的基本概念 1.1 IPC的使用场景 IPC 即 Inter-Process Communication 进程间通信,IPC用于多进程,而Android的多进程情况一般有: 1.一个应用需 ...

  2. [Android]多进程知识点详解

    作者:Android开发_Hua 链接:https://www.jianshu.com/p/e0f833151f66 多进程知识点汇总: 一:了解多进程 二:项目中多进程的实现 三:多进程的优缺点与使 ...

  3. Android技能树 — 树基础知识小结(一)

    前言: 现在安卓面试,对于数据结构的问题也越来越多了,也经常看到别人发的面试题都是问什么红黑树,二叉树查找等,所以我们虽然不会马上就会各种难的面试题,但起码树的基础知识还是要会的,这样才能去进一步学. ...

  4. Android视频开发基础(二)

    Android视频开发基础(二) https://blog.csdn.net/goodlixueyong/article/details/62447452 前一篇文章详细介绍了视频的一些基本概念,这些 ...

  5. android界面数据存储,Android应用开发基础之数据存储和界面展现(二)

    Android应用开发基础之数据存储和界面展现(二) 常见布局 相对布局 RelativeLayout 组件默认左对齐.顶部对齐 设置组件在指定组件的右边 android:layout_toRight ...

  6. Android中的基础控件TextView、Button、ImageView、EditText、ProgressBar

    文章目录 1 Android中的基础控件 1.1 控件的通用属性 2 TextView 2.1 TextView的继承关系 2.2 TextView的常用属性 3 EditText 3.1 常用属性 ...

  7. 创建android程序时 默认使用布局是,《Android移动应用基础教程》中国铁道出版社课后习题(附答案)...

    <Android移动应用基础教程>中国铁道出版社课后习题(附答案) 第2章Android UI开发 一.填空题 1.Android中的布局分为6种,分别是RelativeLayout.Li ...

  8. android 启动服务同时传递数据,Android Studio开发基础之起动Service,并通过从Activity向Service传递数据...

    Android Studio开发基础之启动Service,并通过从Activity向Service传递数据 本实例演示启动Service,并通过从Activity向Service传递数据,新建一个Se ...

  9. [编转]Android localsocket 的基础和使用实践: 02

    在上一节里,谈到了基础和具体是实践实现: 这一节涉及调试和具体的实践测试: 例子源码在: http://download.csdn.net/detail/goleftgoright/4183596 下 ...

最新文章

  1. 计算机jsp外文文献,计算机 JSP web 外文翻译 外文文献 英文文献
  2. The source attachment does not contain the source for the file Activity.class
  3. STM32系统滴答定时器(systick)应用
  4. makefile使用宏及用法$(宏标识符) $(cc)_宏编程的艺术
  5. wps如何和matlab兼容,怎样使wps和office兼容
  6. 透过Win2008 R2窥视微软虚拟化帝国
  7. android 本地数据库sqlite的封装
  8. php case语句吗,【PHP公开课|关于PHP switch case语句,你知道怎么用吗,这个例子你一定要来看看】- 环球网校...
  9. (5)JavaScript之prompt语句
  10. java 泛型 class t_java 泛型中classT 和T的区别是什么?
  11. MFC的DLL中实现定时器功能
  12. Kafka下载安装及部署
  13. 2021年T电梯修理考试报名及T电梯修理试题及解析
  14. Kibana:在 Kibana 中对数据进行深入分析 (drilldown)
  15. C++ MFC 如何画一个空心的即透明填充色的图形如矩形,圆形等
  16. 嵌入式linux shadow文件,04.嵌入式Linux文件系统
  17. Picosmos 一键智能抠图
  18. bash install.sh ********错误
  19. python:.py文件转.dll文件(.pyd文件)
  20. File “./tools/train.py“, line 124 log_file = osp.join(cfg.work_dir, f‘{timestamp}.log‘)

热门文章

  1. UDS协议一致性测试之Service 27环境NRC 13、NRC 24优先级判断
  2. 电脑打字技巧:微软输入法的U模式和V模式,快速打日期和时间。
  3. [附源码]java毕业设计高校奖学金评定管理系统
  4. 判断输入数是奇数还是偶数
  5. JavaScript 实现汉字按拼音首字母分组拼序
  6. python字典统计单词个数_python字典统计单词个数
  7. 在网络世界中如何才能保护好自己的安全?
  8. 手把手教你如何在广交会使用OBS直播丨汇信外贸软件
  9. 机器学习 生成_使用机器学习的Midi混搭生成独特的乐谱
  10. xp系统 自动锁定计算机,xp如何设置锁屏时间