假设 app 的 task 栈里只有一个 activity,此 activity 切到后台后,系统内存短缺,决定释放这个 acitvity,那么是直接杀掉整个进程(不会触发 onDestory,下次 application 实例需要重建)还是单独 finish 掉 activity (并触发 onDestory,此时 app 进程仍在内存中,下次 application 实例无需重建)?
1
zpxshl Jan 24, 2018 via Android
一般是单独释放 activity,如果内存严重不足,直接杀进程。
|
2
lancerly Jan 24, 2018
不同意 1 楼,不存在只 finish activity 不杀进程的情况,
内存不足,系统会按照进程优先级回收进程, 至于走不走 onDestory,不同的 rom 实现不一样, |
3
suikator Jan 24, 2018 via Android
kill 进程之前应该先保证栈里的 activity 已经 destory 了
|
4
jasonyang9 Jan 24, 2018
歪个楼。为什么这贴中所有的 destroy 都被写成了 destory ?
|
7
s82kd92l Jan 24, 2018
两种情况都可能出现.第一种情况系统内存不太紧张,系统会先执行 onDestroy,进程状态变为 cached process。然后系统再从所有"cached-process"里面选择杀。
当系统把所有的 cached-process 全杀光了,内存还是不够(比如 512M 的手机经常这样),系统就直接杀非空进程,根本不管你的 onDestroy 是否执行了 |
8
honeycomb Jan 24, 2018
按照文档的说法,系统可以绕过 destroy activity 而直接杀 process。
但是也可以采取 destroy activity 的做法 https://developer.android.com/reference/android/app/Activity.html |
9
s82kd92l Jan 24, 2018
还有 Activity 是否执行 onDestroy 与 Application 是否重建没有因果关系。只要进程不被杀,哪怕是 cached-process,你的所有 static/singleton 的值都还在,甚至里面还能有一大堆线程继续运行任务都可以。
我一直觉得 android 里面的 service 是挂羊头卖狗肉,尤其是那些没有提供 onBind 的 service,除了向系统表达一下”我很重要别杀我”之外什么软用都没有。一个 app 可能有 10 个后台 service,但很可能只有一个线程负责处理这些 service。这样 10 个后台服务与两个效果一模一样(需要两个服务才能耍流氓,A 拉起 B,B 拉起 A )。 |
10
paparika OP |
11
paparika OP @s82kd92l 说到 service 想起另一个问题,系统内存紧张的时候会杀掉 service,此时是整个进程一起杀还是单独杀 service 呢,如果是单独杀,如果 service 里面之前启用了一个 thread,那么被杀掉时这个 thread 发生什么了?
|
12
s82kd92l Jan 24, 2018
@paparika 做音乐播放当然要前台 service+常驻通知,前半段思路就是官方推荐做法。我不是做 UI,后半部分我不好评价,但感觉显示播放状态应该是 service 驱动 activity,而不该让 activity 主动去 pull。是不是用 rxjava 之类的反转控制技术好些?
|
13
s82kd92l Jan 24, 2018 如果紧张到杀带 service 的进程通常是内核绕开 android 层直接杀,整个进程都会死。
|
14
lancerly Jan 24, 2018 <quote>
These processes often hold one or more Activity instances that are not currently visible to the user (the onStop() method has been called and returned). Provided they implement their Activity life-cycle correctly (see Activity for more details), when the system kills such processes it will not impact the user's experience when returning to that app: it can restore the previously saved state when the associated activity is recreated in a new process. </quote> 根据文档的说法,回收内存的时候,如果实现过生命周期,那么用户返回时可以保证用户体验不被破坏,也就是说会走生命周期, 对于目前国内的 rom 来说,杀后台进程大都是直接走了 forceKill,内核直接杀,应用并不能收到任何通知, |
15
honeycomb Jan 24, 2018 via Android
Android 8 增加的后台限制真的是非常友好了,仅默默杀掉 service 并确保它们不再自行重新启动,但又不干涉 job
|