不管是安卓的官方文档还是源码注释,处处可见“从 Activity A 跳到 Activity B,当系统内存不足时 A 可能会被回收……”,而且没有明确说明 A 和 B 是否属于同一个 app 或进程。
但是,在官方给的 Activity 生命周期图中,却说内存不足时低优先级的进程将被杀死。
那么,内存不足时,到底是 Activity 被回收了呢,还是进程被杀死了呢,还是二者都出现了呢?
答案是,Activity 被回收了,而且进程被杀死了,而且一般情况下该进程是后台进程。
默认情况下,一个 app 内的所有 Activity 都属于同一个进程,不同的 app 的 Activity 属于不同的进程。
但是,即使 Activity A 和 B属于同一个 app,它们也是可以属于不同的进程的。实现方法是在 AndroidManifest 文件中通过 android:process 属性来指定不同进程。
但是,通过在 Manifest 文件中设置 android:process 属性,我们可以做到同一个 app 的 Activity 运行于不同的进程。
<activity android:name="com.tigerpenguin.lab.activitymemory.ActivityA"
android:label="Multi Process"
android:process=":ProcessA">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.tigerpenguin.lab.activitymemory.ActivityB"
android:label="Activity B"
android:process=":ProcessB"/>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
当内存不足时,系统会杀死优先级低的后台进程,进程内的 Activity 肯定也就被回收了。
手机屏幕上正在显示的 Activity 所在的进程是前台进程,其余的是后台进程。
“从 Activity A 跳到 Activity B……”,这时 B 显示在屏幕上,如果 A 和 B 属于同一个进程,所以 A 和 B 所在的进程属于前台进程,所以 A 一般不会被杀死;如果 A 和 B 属于不同进程(二者可能属于同一个 app,也可能属于不同的 app),这时 A 有可能被杀死。
之所以说“前台进程一般不会被杀死……”,是因为在实际开发中,确实接到过用户投诉:正在操作的 app 发生 crash。排查后发现原因是用户机型内存过小,导致前台正在运行的 app 被杀死了。
说到这,作为一个安卓开发人员,忍不住发几句牢骚。
用户一遇到 crash 就开始骂娘、投诉,其实我们也很郁闷。
你在一个千把块钱的性能一般的手机上,开了一堆应用,手机卡了你狂喷:”看,安卓手机不行,就是不如苹果流畅……“,请问:你用过跟 iPhone 同等价位的安卓手机吗?app 崩了,你又去应用商店的评论区骂娘,去客服投诉,搞得一大群人郁闷。
难道你在买手机前就没有一个定位吗?难道你不知道一分价钱一分货?用 iPhone 1/5 的价钱买的安卓手机,却硬要跟 iPhone 比用户体验,活该你每天都活在负能量里面!
参考文献: