您的位置:首页 > 移动开发 > Android开发

到底是 Activity 被回收了还是进程被杀死了?

2016-08-12 19:36 253 查看
不管是安卓的官方文档还是源码注释,处处可见“从 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"/>


当内存不足时,系统会杀死优先级低的后台进程,进程内的 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 比用户体验,活该你每天都活在负能量里面!

参考文献:

Android Activity and Low Memory

onPause() v.s. onSaveInstanceState()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内存 android