问题:
最近在解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)