到底是 Activity 被回收了还是进程被杀死了?
Posted 陈蒙_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了到底是 Activity 被回收了还是进程被杀死了?相关的知识,希望对你有一定的参考价值。
不管是安卓的官方文档还是源码注释,处处可见“从 Activity A 跳到 Activity B,当系统内存不足时 A 可能会被回收……”,而且没有明确说明 A 和 B 是否属于同一个 app 或进程。
但是,在官方给的 Activity 生命周期图中,却说内存不足时低优先级的进程将被杀死。
那么,内存不足时,到底是 Activity 被回收了呢,还是进程被杀死了呢,还是二者都出现了呢?
答案是,Activity 被回收了,而且进程被杀死了,而且一般情况下该进程是后台进程。
详见官方文档中关于 Activity 生命周期的解释:
The system never kills an activity directly to free up memory. Instead, it kills the process in which the activity runs, destroying not only the activity but everything else running in the process, as well.
即,系统永远不会直接杀死 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"/>
当内存不足时,系统会杀死优先级低的后台进程,进程内的 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 比用户体验,活该你每天都活在负能量里面!
参考文献:
- Understand the Activity Lifecycle
- Android Activity and Low Memory
- onPause() v.s. onSaveInstanceState()
以上是关于到底是 Activity 被回收了还是进程被杀死了?的主要内容,如果未能解决你的问题,请参考以下文章