Processes
android 进程简介
- 默认情况下,一个应用的所有的component运行在同一个process中
android:process
- 通过在manifest指定android:process属性,可分别指定四大组件运行的进程名
- application也可以指定android:process属性,为所有的component指定一个默认的process
- 不指定进程名时,使用包名作为进程名
- 如果进程名是以冒号开头的,则这个进程是应用的私有进程
- 如果进程名是以字符开头的,且符合包名规范,则这个进程是全局的
<service
android:name="com.xiaomi.push.service.XMPushService"
android:enabled="true"
android:process=":pushservice" />
android:multiprocess
- 只有provider和activity定义了android:multiprocess,但一般不要在activity中使用。
- 如果android:multiprocess为true,则每个访问provider的应用都会自己创建一个ContentProvider实例
优势:避免跨进程通信,提高数据访问效率,弊端:多个实例导致系统内存消耗变大,且难以处理多个进程之间的数据同步问题
不同APP运行在同一进程
- 如果需要两个不同APK中的组件运行于同一个进程,需要以下三个条件:
- 两个应用程序使用相同的android:sharedUserId
- 两个应用使用相同的keystore进行签名
- 为组件设置相同的android:process
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.shareusertesta"
android:versionCode="1"
android:versionName="1.0"
android:sharedUserId="com.example">
Process的实际使用
- 子进程可以分担主进程的内存压力
- 在主进程Crash时,子进程中的功能不受影响
- 子进程的Application#onCreate中可以跳过一些不必要的初始化
Process 分类
Foreground process
- 用户正在使用的process,任何时候,android系统都只有一个foreground process
- 以下情况所在的process被认为是foreground process:
- 拥有一个处于onResume()状态的activity;
- 拥有一个与处于onResume()的activity相绑定的service;
- 拥有一个调用了startForeground()方法的service;
- 拥有一个正在执行生命周期函数(onCreate(), onStart(), oronDestroy())的service;
- 拥有正在执行onReceive()方法的broadcastreceiver
- 一般情况下,foreground procee是不会被detroy的
Visible process
- 没有处于foreground 的componet,但是仍然能够影响用户的所见
- 以下情况的process被认为是visible process:
- 拥有一个activity对于用户来说是可见的,但是不处于onResume()状态
- 拥有一个与一个visible activity绑定的service
- 一般情况下,visible procee也是不会被detroy的
Service process
- 一个正在运行的service的process(调用了service 的startService()方法),比如下载东西,播放音乐
- service process也被认为是很重要的,除非内存不足,也不会被destroy
Background process
- 拥有处于onPause()状态的acitivty 的process
- 同一时间可以有很多个background processes, 一般被存放在lru list(least recently used)中
- 系统可以在任何时候destroy 掉background process
Empty process
- 不含有任何activity componet
- 保留这种process一般是为了缓存目的,为了下一次启动更快
process 回收
- android 系统总是尽可能的保存所有的process,但是有时候有可能需要回收内存,
根据process的状态和运行在 process中的component,形成了一个优先级序列,当需要回收内存时,最低优先级的被remove掉
- android 总是将一个process标注为它能达到的最高级,比如有一个onResume()的activity,同时也有正在播放音乐的service,
这时这个process被认为是foreground process
- process的优先级也会与其它process有关,比如process A 中的content provider为process B中提供数据,
那么A被认为优先级比B高,至少是和B一样高
- service process的优先级比background proces的优先级要高,所以需要消耗很长时间的操作一般被放在service中,而不是放在一个back thread中,比如上传图片等等,所以在broadcastreceiver中,如果要启动一个长时间操作,也应当启用一个service,而不是用back thread