很多时候,我们都会在Activity#onDetory()方法中去释放资源,解注册等操作,我们预期当我们执行Activity.finish()之后,会及时释放这些资源or解注册相关操作。
那么,今天的问题是,我们调用了finish()之后,有没有可能不会及时(比如3s以上)调用onDestory呢?
回答思路:
- Activity的onDestory的执行流程是什么?
- 从执行流程中可以看出来,是否有导致不及时调用的环节。
更多问答 >>
-
2020-05-21 01:15
-
每日一问 | 我们常说的dalvik虚拟机是基于寄存器的,而jvm是基于栈,到底指的是什么?
2020-05-20 21:29 -
2020-05-25 23:08
-
每日一问 在 Java 支持了 switch(字符串)之后,只是语法糖而已?
2020-06-01 00:55 -
2020-06-07 20:55
-
2020-05-07 10:02
-
每日一问 “PathClassLoader 只能加载已安裝到系統中(即/data/app目录下)的apk文件” 严谨吗?
2020-05-05 20:46 -
每日一问 | “必须在UI线程才能更新控件/界面” 这句人人皆知的话,100%正确吗?
2020-04-29 01:14 -
2020-04-13 23:58
-
每日一问 | 我们经常用的 String类型,你知道它最大可以放多长的字符串吗?
2020-04-08 23:58

直接上链接吧,https://www.jianshu.com/p/479b78235361
调用finish并不会立即去调用onDestory 就遇到一个问题 我们现在一般会注册lifecycle 来释放资源,但是因为onDestory执行不及时,如果重复快速打开同一个页面,就有可能获取到上一次关闭要释放但是又没有来得及释放的资源,导致新的页面刚打开获取资源能正常使用,用了几秒,资源被释放了,就报错了,这个咋整
之前我也遇到过这个问题,看看有么有大神回答一下
可以在onResume跟onPause中做相关处理
onPause 页面退到后台 或者启动新的页面 都会执行 并不能标识 是页面关闭
我们重写一下 finish 方法,在里面释放资源咋样?
在B页面并不会及时调用onDestory ,会在A页面执行onResume之后才会调用onDestory
1:Activity的onDestory的执行流程是什么?:
通过mH的msg分发处理2.从执行流程中可以看出来,是否有导致不及时调用的环节。: 异常退出,系统回收,最好是用onStart,onStop ,,动画相关就在onResume和onPause调用finish()方法后 会调用 ActivityManagerService 中的 finishActivity方法 会通过 Handler H类发送消息 再执行 ondestory() 如果这个时候遇到Handler收到同步屏障消息的时候 就可能延迟调用调用finish()
在onCreate()里调用finish(),onCreate里finish后面的代码执行完后才会调用onDestroy
一个场景,Activity A 开启 Activity B, 然后finish Activity B
这时候生命周期走向是 B onPause()-> A onRestart()-> A onStart() -> A onResume() - B onStop()-> B onDestroy()
那么onStop 和 onDestroy 回调可能会延时,
1.延迟原因,B onPause之后,AMS会将B保存在需要finish的列表里,A onResume之后 注册一个IdleHandler(空闲处理器) 等待主线程轮训到,才会去调用B onStop onDestroy ,因为IdleHandler的优先级低,只有主线程消息执行完才会去执行,所以主线程消息过多也会使其延迟。
2.延迟10s原因,在B onPause之后,也会同步注册一个10s的延时消息,那么就算App在A onResume之后没有主动注册IdleHandler销毁Activity,这个延时的消息到时间后,也会执行销毁Activity的逻辑。请问 B onPause之后,AMS会将B保存在需要finish的列表里,这里的finish列表具体是哪个列表呀,看了下源码没有找到。
应该指的是 ActivityStackSupervisor 的 mFinishingActivities
调用finish(),并不会立即执行onDestroy,根据Activity的流程假设为Act1:onResume->onPause->onStop,这个时候会去执行Activity堆栈里面的上一个Act2:onStop->onResume,Act2完成后才会去执行Act1 的onDestory( 这个时间是有可能超过3s的)
Act1#onPause->Act2#onCreate->Act2#onStart->Act2#onResume->Act1#onStop ...查看更多
Act1#onPause->Act2#onCreate->Act2#onStart->Act2#onResume->Act1#onStop
你和我说的场景不一样,你是去创建一个新的activity,我这个只是说的返回到activity堆栈中的上一个activity