之前写代码,需要在一些特殊时机做一些事情,例如释放内存等,特殊时机包含:
- 应用退出(用户back 退出,没有任何 Activity 了,但进程还存活的情况)
- 应用 Home 按键置于后台
问题来了,怎么方便的判断这两种时机呢?
注意:需要考虑屏幕旋转异常情况。
ProcessLifecycleOwner 可以回答 2,判断不了 1;
另外可以聊聊ProcessLifecycleOwner原理呀。
更多问答 >>
-
2020-09-09 23:54
-
2020-10-03 11:43
-
每日一问 | 启动了Activity 的 app 至少有几个线程?
2020-10-12 00:47 -
每日一问 | 玩转 Gradle,可不能不熟悉 Transform,那么,我要开始问了。
2020-10-26 23:45 -
每日一问 | 关于 RecyclerView$Adapter setHasStableIds(boolean)的一切
2020-10-26 23:44 -
2020-08-23 23:54
-
每日一问 | apply plugin: 'com.android.application' 背后发生了什么?
2020-08-16 19:56 -
每日一问| View 绘制的一个细节,如何修改 View 绘制的顺序?
2020-08-12 10:21 -
每日一问 | 比 removeView 更轻量的操作,你了解过吗?
2020-07-27 01:14 -
每日一问 | RecyclerView的多级缓存机制,每级缓存到底起到什么样的作用?
2020-07-19 23:56
哈哈哈哈哈,我大概好像知道了!
http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/app/IProcessObserver.aidl之前那个Fragment数据恢复的问题,刚好看了一点AppDied相关代码,刚刚顺着AppDied一路找了下,找到了这个东西,SDK28版本,里面的两个方法刚好跟问题对应。SDK29,还多了一个监听Service的方法。不过这个类是在系统进程那边的,不能直接使用,我再看看。。。等我!下午 13:58:
不行,我天真了,IProcessObserver根本不能通过常规手段来使用,而且还需要SET_ACTIVITY_WATCHER权限。android.app下的ActivityManager,有个
addOnUidImportanceListener
方法,可以监听进程的FOREGROUND、SLEEPING、VISIBLE、GONE等状态变化,但这个方法需要PACKAGE_USAGE_STATS权限,还加了@hide和@SystemApi标记。。。。就算可以通过各种手段调用到,但是已经跟题目中的 “方便” 相违背了下午14:20:
Application中有个onTerminate
方法,但是注释说,只会在虚拟机环境中回调,正式环境下不会回调这个方法。所以,还是不行。咦?第一问 "应用退出(用户back 退出,没有任何 Activity 了,但进程还存活的情况)" ,是要监听进程即将完全退出,还是要监听所有Activity Destroyed?@xiaoyang 如果是后者,那大家回答的ProcessLifecycleOwner不是能做到嘛。。。如果是前者,感觉像是保活相关的。。。
8.21 下午14:33:
如何方便且准确地判断所有Activity Destroyed以及用户按下HOME键(或启动了其他应用界面)的时机呢?
在android.app.Application下有个内部类叫ActivityLifecycleCallbacks,顾名思义,就是用来监听Activities的生命周期回调的。需要通过Application的registerActivityLifecycleCallbacks
方法来设置。那它是怎么做到监听每个Activity生命周期的呢?真相就在Activity内。因为Activity持有对应Application的实例引用,当它的onCreate
、onStart
、onResume
等方法回调时,就可以通过持有的Application实例,来获取到刚刚通过registerActivityLifecycleCallbacks
方法设置的Callbacks,然后直接调用对应方法。其实,Activity中也有
registerActivityLifecycleCallbacks
方法,只不过这个方法仅仅是针对它本身,也就是只能监听它自己的生命周期回调,而Application的registerActivityLifecycleCallbacks
则是针对本进程所有的Activity。具体实现方法:
查阅各位同学推荐的ProcessLifecycleOwner源码,会发现它同样也是通过Application.registerActivityLifecycleCallbacks
来实现生命周期监听的,只不过,它里面的ActivityLifecycleCallbacks实现类,只实现了onActivityCreated
、onActivityPaused
、onActivityStopped
这三个方法:并没有实现
来看看它是怎么处理除ON_DESTROY之外的事件回调的:onActivityDestroyed
,也就是无法知道Activity何时Destroyed了。就比如ON_STOP事件,它会通过
我们也可以参照它这种做法,来实现题目中的两个要求。不过,有两个问题需要注意:mStartedCounter
来记录当前一共有多少个Activities Started——activityStarted
每回调一次,mStartedCounter
就+1。反之,mStartedCounter
会在activityStopped
时-1。一旦mStartedCounter
减剩下0个,就表示当前所有Activities都Stopped了,这时候就可以考虑发送ON_STOP事件了。如何准确分辨Activity是Stop还是Destroy? 因为Destroy会先回调
onStop
,怎么知道这次的onStop
是Activity要Destroy还是仅仅是Stop而已?一般情况下,屏幕旋转同样也会走一遍
onStop
和onDestroy
,应该怎么做才不会误判屏幕旋转为All Activities Destroyed呢(如果只启动了一个Activity的时候)?答案近在咫尺。
哈哈哈哈,Activity就有提供isFinishing
和isChangingConfigurations
方法!我们可以通过这两个方法轻松且准确判断出Activity是要Destroy还是只是Stop、是真的Destroy还是屏幕旋转。代码如下:可以直接拿去测试了。
ProcessLifecycleOwner 应该拿不到ON_DESTORY的时间吧,只能拿到ON_STOP,判断进入后台。
时间->事件
监听所有Activity#onDestory的时机
噢,哈哈哈哈知道了,registerActivityLifecycleCallbacks
ProcessLifecycleOwner原理也是registerActivityLifecycleCallbacks,但是它没有重写onActivityDestroyed。。。我今晚整理一下发出来 ...查看更多
ProcessLifecycleOwner原理也是registerActivityLifecycleCallbacks,但是它没有重写onActivityDestroyed。。。我今晚整理一下发出来
registerActivityLifecycleCallbacks如果不做特殊处理也不能区分是否屏幕旋转,所以这个方法还是不太合适。。。好丢脸啊,说错那么多次
哈哈,我的预期就是registerActivityLifecycleCallbacks + 特殊处理呀。
哈哈哈哈那我知道怎么做了,下午整理一下发出来。还以为有一步到位的方法呢
更新啦
赞赞,好了 我要更新下一个问答了
多进程下ProcessLifecycleOwner都不能回答1、2呢。一个程序就只有两个界面:MainActivity在主进程,OtherActivity在other进程。MainActivity进入OtherActivity后ProcessLifecycleOwner就会调用Lifecycle.Event.ON_STOP了,这个怎么破?
在activity结束的时候根据isTaskRoot是否可以判断当前这个activity是不是最后一个了,如果是结束之后就是第一种情况吧
按home键置于后台,homewatch好像可以监听,或者lifecycle,或者手动根据生命周期判断屏幕旋转注册表设置config属性然后在activity中根据onConfig方法做判断,这个应该也可以吧
这个无论是HOME键还是所有Activities Destroyed,level都会是TRIM_MEMORY_UI_HIDDEN,也就是这个标识只能判断应用界面是否对用户可见,并不能区分出到底是按了H ...查看更多
这个无论是HOME键还是所有Activities Destroyed,level都会是TRIM_MEMORY_UI_HIDDEN,也就是这个标识只能判断应用界面是否对用户可见,并不能区分出到底是按了HOME键,还是所有Activity都被Destory了
咦?如果跟registerActivityLifecycleCallbacks两种方法结合,就能准确区分出HOME键和屏幕旋转,但是太麻烦了,而且还判断不了All Activities Destroy ...查看更多
咦?如果跟registerActivityLifecycleCallbacks两种方法结合,就能准确区分出HOME键和屏幕旋转,但是太麻烦了,而且还判断不了All Activities Destroyed的情况,因为onTrimMemory总是先于onDestroy回调
确实,如果还要考虑这些情况的话,就不太合适了 = =
还有个简单方法,基类activity onresume则进入前台 onstop则进入后台
应用退出肯定就destroy了,按home键只是onstop
各位大佬,有个问题请教一下
app 中有多个进程的情况下 也可以用ProcessLifecycleOwnerProcessLifecycleOwner
ProcessLifecycleOwner
ProcessLifecycleOwner
监听整个应用退出,也是有回调的,是通过双进程的,binderDied