Android onStop onDestroy方法延时回调的问题

问题:
最近在解BUG时,遇到了Activity退出,静态资源未及时进行销毁的问题,经过添加打印,发现是由于资源回收操作放在onDestroy中进行,而退出时onDestroy未及时调用导致。

原因:
经过添加LOG,发现是由于退出后返回的Activity中的初始化方法(onCreate,onStart,onResume)中存在一些耗时操作,导致消耗时间过多。而我们Activity按下back键之后的生命周期顺序是当前Activity(后续简称A)的A:onPause方法->前一个Activity(后续简称B)B:onRestart -> B:onStart -> B:onResume -> A:onStop -> A:onDestroy,由此可知导致A中onStop和onDestroy延迟调用的原因,是B中初始化操作耗时过久。

解决方法:
有几种解决方法,可以视代码情况的不同进行不同选择。
1.优化B中的初始化方法,如果B中的数据不是需要立即展示,可以将加载耗时数据的操作放在子线程中进行,并通过Handler在加载完成后发送消息更新UI,通常比较推荐使用此方法。
2.如果B中的数据无法使用异步进行操作,那么可以重写A的finish方法,在此方法中进行资源回收的操作,并在确认退出时调用此方法,不是特别推荐,有时异常退出可能会不调用此方法,导致资源无法回收。

原理分析:
我们进入到Framework中的ActivityStask.java文件中,见名知意,这个类是Android 返回栈的实现,Activity的生命周期回调也由此类进行控制,这个类的其他实现我们后续再写一篇进行详细分析,目前我们先看到其中的onStop生命周期管控方法stopActivityLocked


final void stopActivityLocked(ActivityRecord r) {
   
        if (DEBUG_SWITCH) Slog.d(TAG, "Stopping: " + r);
        if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0
                || (r.info.flags&ActivityInfo.FLAG_NO_HISTORY) 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值