问题:
最近在解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) {if (!r.finishing) {//首先判断该需要关闭的Activity是否完成了finish操作,如果没有则先完成if (!mService.mSleeping) {if (DEBUG_STATES) {Slog.d(TAG, "no-history finish of " + r);}//此处重新去请求finish操作requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,"no-history", false);} else {if (DEBUG_STATES) Slog.d(TAG, "Not finishing noHistory " + r+ " on stop because we're just sleeping");}}}if (r.app != null && r.app.thread != null) {adjustFocusedActivityLocked(r);r.resumeKeyDispatchingLocked();try {r.stopped = false;if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPING: " + r+ " (stop requested)");r.state = ActivityState.STOPPING;if (DEBUG_VISBILITY) Slog.v(TAG, "Stopping visible=" + r.visible + " for " + r);if (!r.visible) {mWindowManager.setAppVisibility(r.appToken, false);}//此处调用主线程进行stopActivity操作,如果此时我们的线程有其他耗时操作,就会导致//执行较为缓慢r.app.thread.scheduleStopActivity(r.appToken, r.visible, r.configChangeFlags);if (mService.isSleepingOrShuttingDown()) {r.setSleeping(true);}//当等待时间超过十秒时,会发送消息,强制执行操作。Message msg = mHandler.obtainMessage(STOP_TIMEOUT_MSG, r);mHandler.sendMessageDelayed(msg, STOP_TIMEOUT);} catch (Exception e) {// Maybe just ignore exceptions here...  if the process// has crashed, our death notification will clean things// up.Slog.w(TAG, "Exception thrown during pause", e);// Just in case, assume it to be stopped.r.stopped = true;if (DEBUG_STATES) Slog.v(TAG, "Stop failed; moving to STOPPED: " + r);r.state = ActivityState.STOPPED;if (r.configDestroy) {destroyActivityLocked(r, true, false, "stop-except");}}}}

由上面代码便可以知道,当我们在初始化中进行了过多耗时操作,便会导致回调延时,所以后续写代码的过程中,应该注意耗时操作不应在主线程中进行。

Android onStop onDestroy方法延时回调的问题相关推荐

  1. Android的onDestroy方法,Android编程之Activity中onDestroy()调用分析

    本文分析了Android编程之Activity中onDestroy()调用方法.分享给大家供大家参考,具体如下: 刚刚一个BUG让我发现,如果 activity 实现了一个回调接口,然后使用 this ...

  2. Android的onDestroy方法,android – 活动方法:onCreate()和onDestroy()

    当第一次创建一个活动时,系统会调用OnContentChanged()方法作为第一个方法,当一个活动被杀死时,系统的最后一次调用是OnDetachedFromWindow()方法,但是android文 ...

  3. Android的onDestroy方法,Android:onDestroy()或Application类中的类似方法

    首先:我是绝对的初学者 当我的应用退出时,我需要执行一些代码(是的,我在Android中不知道这样的事情),这对我来说行得通: -我有MyApplication,它扩展了Application. 作为 ...

  4. Android Activity onDestroy() 不回调的解决方式

    用Activity的时候,会发现如下问题: 有时候会发现Activity的onDestroy方法回调不执行,或者延时执行,比较缓慢(可以达到好几秒钟之后才调用),即使之前使用finish方式关闭Act ...

  5. android 为什么不调用onDestroy方法关闭activity

    前天有个同学突然咨询我,说关闭android的activity,为什么不直接调用ondestroy方法,而是要调用activity.finish(). 我这里总结下我的理解: 1.我们知道onDest ...

  6. Android 如何正确的重写 onDestroy() 方法

    不知道大家在写 Android 的时候有没有遇到过这样的一个疑惑:当你在重写 onDestry() 的方法时,有没有犹豫过,我们自己的方法,是应该放在 super.onDestroy() 方法的上面呢 ...

  7. python教程:实现延时回调普通函数的方法

    这篇文章主要给大家介绍了关于python中实现延时回调普通函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. 回调函 ...

  8. Android onDestroy方法执行延迟的原因

    一整天过去,终于发现了自己项目中的这个问题所在,onDestroy方法执行延迟是因为-->页面跳转代码要放在当前Activity的finish()方法之前执行. 以下为整个事件的过程(仅作个人记 ...

  9. android activity生命周期(一)onCreate和onDestroy方法

    首先我们来说一下什么是生命周期 平时我们在开发软件的时候软件就有生命周期,同样 很多的事物都有自己的生命周期 一般来说 生命是不由自己的主观意识控制的. 举个例子 :人的生命周期:从出生-->到 ...

最新文章

  1. 部署通用基础设施, 满足顶级 SLA 要求
  2. Linux下安装rabbitmq3.7.8
  3. 超图iServer版本安装和使用入门图解
  4. Hybris (SAP旗下的软件公司)
  5. PHP中用于精确计算的bcmath扩展
  6. 现在开始(译) 明确的知道你想要什麽是关键 每次 只做一件事的习惯 成功的人是因为屡次尝试经历失败保持激情 动手一试...
  7. windows下IDEA全面红色,但是能编译,不能智能提示
  8. 深入学习Spring框架(二)- 注解配置
  9. 天梯赛练习集--L1-009 (分式求和)
  10. Three.js线宽.lineWidth无效
  11. 时空超分辨论文阅读笔记(一)---- Zooming Slow-Mo
  12. exsi 安装ipmi_在vSphere中为不同服务器配置IPMI功能
  13. python脚本控制ios手机app_appium 下 python 脚本自动化测试iOS APP 实例
  14. [附源码]计算机毕业设计JAVAjsp小微企业库存管理系统
  15. 爬虫技术python爬到女性语音_python爬虫看看虎牙女主播中谁最“顶”步骤详解
  16. 使用win10自带虚拟光驱打开ISO镜像文件
  17. oracle创建视图与生成唯一编号
  18. Matlab-初级教程-系列1:matlab之入门教学视频-3 数组和矩阵分析3
  19. html+css技巧分享和IE6典型BUG分析(重温一下)
  20. 欧拉降幂和广义欧拉降幂

热门文章

  1. linux下守护进程的创建和sighup信号
  2. storm示例之DRPC
  3. 人工蜂群算法的python实现
  4. c语言炉石传说算法设计,炉石传说:下棋吃鸡还扣分?设计师:现在已经改回去了...
  5. JSE学习笔记之1初始Java
  6. Creator3D:太厉害了!3D模型原来可以这样显示在2DUI上
  7. 进化计算(一)——基本原理GAGP
  8. 携程开源配置管理中心Apollo简介
  9. 以账号为例,来说说解决问题的思路和方向。
  10. 炼丹师入门修炼指南-深度学习入门资料推荐