到底是 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 肯定也就被回收了。
手机屏幕上正在显示的 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()
但是,在官方给的 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()
相关文章推荐
- 到底是 Activity 被回收了还是进程被杀死了?
- 内存不足:杀死进程还是牺牲子进程
- 内存不足:杀死进程还是牺牲子进程
- 内存不足:杀死进程还是牺牲子进程
- Android应对进程被杀死--Activity
- Android应对Activity进程被杀死
- 保证进程被杀死后,activity还能够立刻重新启动的技巧(android:stateNotNeeded="true")
- Activity杀死进程退出
- 安卓开发,一个Activity启动了一个本地服务,然后把Activity切换到后台,那这是后台进程还是次要服务进程
- kill命令"-1"这个参数到底是杀进程还是reload?(转)
- Android应对Activity进程被杀死
- Android四大组件——Activity生命周期、启动模式、显隐式意图、杀死进程、杀死所有Activity、安装及反编译
- 嵌入式 linux下sleep函数到底是线程休眠还是进程休眠
- 一个很好的命令(pkill),一次性杀死某用户所有进程。PS:其他杀进程命令
- Linux中的僵死进程(02)---wait回收僵死进程
- 查看特定进程杀死进程方法
- 织梦建站:我们到底是改用GBK编码还是用UTF8编码?
- 被唤醒后的线程到底重新执行同步代码块还是从那是等待的那里继续执行
- 杀死指定名称的进程(C++)
- 从startActivity一步步到穿越进程壁垒