文章目录

  • 问题1:什么情况下Activity只调用onPause不调用onStop?
  • 问题2:onPause()、onStop()方法有什么区别?保存数据到底放在哪个好?
  • 问题3:调用了finish()方法后为什么没调用onDestory()方法,什么情况下Activity销毁时不会调用onDestory()方法。
  • 问题4:Activity销毁时在onDestory()方法释放资源有什么弊端?有什么更好的方法?
  • 问题5:onRestart()方法怎么使用?
  • 问题6:onSaveInstanceState()的调用时机是什么?怎么使用它?
  • 问题7:onCreate()、onResume()适合做什么工作?
  • 问题8:调用System.exit(0)为什么不能退出应用,还重启应用了?

从一开始接触Android,我们最早就接触到Activity,接触到Activity的onCreate()。后来我们会去学习Activity的各个生命周期,但是在实际项目中却还是有很多生命周期的问题导致在某些环境条件下会产生和预期不一致的结果。这里笔者整理出几个生命周期的知识点,希望对纠结于Activity生命周期如何做处理的你有些许帮助。

问题1:什么情况下Activity只调用onPause不调用onStop?

答:在跳转的目标Activity是透明状态的时候(就是有一点透明也算),也就是说不能完全去遮挡住前一个Activity的显示的话(比如跳转的Activity是Dialog的形式),那么前一个Activity只会调用onPause(),这个期间不会调用onStop()。

问题2:onPause()、onStop()方法有什么区别?保存数据到底放在哪个好?

答:首先要明白,在做跳转的时候,原来的Activity会先调用onPause()方法,知道被启动的Activity获取焦点后(onResume())后原来的Activity才会调用onStop()方法(如果被启动的Activity会完全遮挡住原先的Activity的话)。
从这个过程我们可以看得出来,onPause()是在跳转前被调用的,onStop()是跳转后再调用的。很显然,如果你需要执行很多耗时操作去保存数据的话,那么放在onPause()方法就会导致跳转缓慢,所以onPause()其实是不适合做耗时操作的(比如持久化数据到DB、File等),对于一些耗时不多的操作倒是无所谓(比如清理某个变量)。那么onPause()方法适合做什么呢,它适合释放一些资源数据,比如使用到Camera的时候,在onPause()就可以mCamera.release();了。另外的还有解除注册的BroadCast、解除Service绑定等等。而需要做持久化的可以放在onStop()方法里,就不会影响到Activity跳转的速度。

问题3:调用了finish()方法后为什么没调用onDestory()方法,什么情况下Activity销毁时不会调用onDestory()方法。

答:首先这个问题不是很严谨,调用了finish()方法后是会调用onDestory()方法的,但不是马上被调用。当一个Activity要销毁的时候,onDestory()方法不一定能即时被调用。某种情况下,在startActivity()之后做finish,可能Activity销毁时还没来得及走onDestory()方法就又重新创建走onCreate()方法了。所以首先要明确一点就是调用了finish()方法后不一定会马上调用onDestory()方法。那么什么情况下Activity销毁时不会调用onDestory()方法,这个问题看上去有种钻牛角尖的感觉。在Activity被调用finish()时、或者系统原因主动kill掉Activity的时候都会走onDestory()方法,只有在程序被外部强制关闭进程(比如在设置-应用-强制关闭)、或者在recent Task 最近任务关闭掉这个进程、或者是程序发生异常后崩溃了,这些都不会走onDestory()方法。

问题4:Activity销毁时在onDestory()方法释放资源有什么弊端?有什么更好的方法?

答:这个问题是延续问题3的,问题3提及到onDestory()不是马上被调用,甚至是不会被调用。所以其实把资源释放、数据清理放在这个生命周期里在某些情况下是行不通的。可能把某些有锁数据(在某个地方没释放掉、另外一个地方一定用不了)在onDestory()方法里做清理,再其他Activity的onCreate()或者onResume()再次使用,则可能存在这个问题。那么可以用什么更靠谱的方法呢?首先,onDestory()方法里做了数据清理资源释放这个绝逼没有问题,所以并不是说我们不用这个onDestory()了,只是考虑到上面说的问题后,我们可以在onPause()或者onStop()方法结合isFinish()方法来判断是否Activity是处于销毁状态,如果是的话则做出数据清理资源释放。有同学要问了,在onPause()或者onStop()方法做了判断后为什么还要onDestory()也做相同操作呢?我举个例子,主动调用isFinish()的时候,确实走到onPause()或者onStop()方法的时候就判断是finish状态,那么onDestory()的清空操作显得不需要了。但是考虑一种情况:当内存紧张的时候,系统kill掉这个Activity呢?此时不是finish状态,那么就要靠onDestory()来做这个事情了。

问题5:onRestart()方法怎么使用?

答:一个Activity的onStop() 对应 onRestart(),如果调用了onStop()而没有被销毁,那么再进去的时候则是一个重启的状态,当activity从Stopped状态回到前台时,会调用onRestart(),再调用onStart()方法。onRestart()方法只在activity从stopped状态恢复时才会被调用,因此我们可以使用它来执行一些特殊的恢复。但是建议onStop()方法去对应onStart()。也就是我们在onStop()里面做了哪些清除的操作,就该在onStart()里面重新把那些清除掉的资源重新创建出来。

问题6:onSaveInstanceState()的调用时机是什么?怎么使用它?

答:onSaveInstanceState()方法,注意不是看固定什么操作就会调用它,而是只要系统主动要杀死它的时候就会调用,如果自己按下back键或者finish是用户主动行为,就不会被调用。所以系统什么时候想要主动杀死掉这个Activity,我们不能明确,只能说它要主动杀死的时候就会调用这个方法,而用户的主动销毁行为则不会调用这个方法。所以一个好的应用我们应该是要考虑到这一点,所以重写onSaveInstanceState()为我们的应用做一些被主动销毁时的数据保存工作。而注意当Activity被系统主动kill掉的时候,事实上栈上还是存在这个记录的,所以返回到这个Activity的时候,会重新创建这个实例。这个过程就会调用onRestoreInstanceState(),我们可以利用这个方法来恢复现场,或者在onCreate()方法里面传进来的参数Bundle对象,在重新创建的时候它是不为空的,在这里来恢复现场也可以。注意onRestoreInstanceState()是在onStart()方法之后的,所以它发生在onCreate()之后。其次需要注意的是onSaveInstanceState()和onRestoreInstanceState()并不是什么生命周期方法,而且onSaveInstanceState()和onRestoreInstanceState()不一定是对应的。比如发生了onSaveInstanceState(),但是栈上的记录没有了,那么下次也只会创建,并不是重新创建,当然不会再走onRestoreInstanceState();

问题7:onCreate()、onResume()适合做什么工作?

答:很多同学可能觉得,有很多数据初始化的工作,貌似放在onCreate()、或者onResume()方法都没啥问题。但事实上,区别是有的,而且很大。在启动的过程,onCreate()执行完之后会迅速到onStart()被用户可见后再到onResume()获取焦点。然后一直保持在Resumed状态直到Pause状态。也就是说onCreate()方法没执行完,用户是看不到什么东西的。所以onCreate()里面尽量少做事情,尽量只做UI初始化的工作,而注册资源等放在onResume()方法,避免程序启动太久都看不到界面。onCreate()只会调用一次,而每次Activity恢复可见后又会调用一次onResume()方法,所以根据自己的业务逻辑,有些业务数据需要在页面恢复可见的时候重新做什么事情,那么就适合放在onResume(),而onCreate()尽量只做UI初始化和一些不太耗时数据处理。

问题8:调用System.exit(0)为什么不能退出应用,还重启应用了?

答:如果直接调用System.exit(0)、killProcess,如果栈上面存在没有finish过的Activity的话,那么退出会重新创建启动进程,如果当前没有其他没有finish的activity的话就能退出,所以调用这个要确保没有其他未finish的activity才行。可以利用一个记录Activity的列表,在需要完全退出应用的时候,遍历这些Activity依次调用finish()方法后再用System.exit(0)。

Android开发知识(十三):再次理清Activcity各个生命周期应该做的事情相关推荐

  1. Android 开发知识结构图

    Android 开发知识结构图

  2. Android开发知识(一)(理论篇)

    之前学了很久的关于Android开发知识,只是很多的网课和博客都是很零碎的.这些零碎的知识对于小白来说,并不是一件好事,他们会觉得云里雾里,对Android产生抵触心理.在学了快六个月之后感觉自己终于 ...

  3. Android doc |Getting Started|部分 转载 --管理Activity生命周期

    原文 https://developer.android.com/training/basics/activity-lifecycle/index.html 原文被部分改动 管理Activity生命周 ...

  4. android生命周期方法,Android零基础入门|Activity状态和生命周期方法

    原标题:Android零基础入门|Activity状态和生命周期方法 前面两期我们学习了Activity的创建和注册.以及启动和关闭,也学会了重写onCraete方法,这些知识在实际开发中远远不够,还 ...

  5. WatchOS开发教程之一: Watch App架构及生命周期

    WatchOS 开发教程系列文章: WatchOS开发教程之一: Watch App架构及生命周期 WatchOS开发教程之二: 布局适配和系统Icon设计尺寸 WatchOS开发教程之三: 导航方式 ...

  6. 【Monica的android学习之路】四大组件的生命周期

    [Monica的android学习之路]四大组件的生命周期 1. Service 1.1 启动service 1.1.1 startService 1.1.2 bindService 1.2 死亡回调 ...

  7. android中的横竖屏切换,Android中横竖屏切换时Activity的生命周期

    Android中横竖屏切换时Activity的生命周期执行情况 1.默认情况下生命周期 (1)第一次进入界面 11-17 13:55:18.452: E/ImageListActivity(10586 ...

  8. Android开发知识体系,技术实现

    想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样. 本文参考了目前大部分 Android 应用启动优化的方案,将大家的方案做一个汇总,如果你有这方 ...

  9. Android开发知识体系!Android面试吃透这一篇就没有拿不到的offer!挥泪整理面经

    1.项目介绍 Flutter是目前比较流行的跨平台开发技术,凭借其出色的性能获得很多前端技术爱好者的关注,比如阿里闲鱼,美团,腾讯等大公司都有投入相关案例生产使用. 基于Flutter+Dart+ch ...

最新文章

  1. MATLAB_4-形态学_腐蚀_膨胀_灰度图的腐蚀以及膨胀_开运算_闭运算_文章末尾有几个素材例子
  2. 六年级上学期计算机上册教案,六年级上册数学全册教案
  3. java 编写异常_Java基础编程之异常处理
  4. Java加载sklearn训练好的模型进行预测(无法搞定)
  5. 如何在SAP S/4HANA Cloud系统里创建employee
  6. 栏目图片 栏目描述_昕街拍|长期福利栏目来啦,秀街拍赢礼品!
  7. 百分制转化为五级制java_javav 的日志-编写存储过程,将百分制成绩,转换成绩等级’A’,’B’,’C’,’D’,’E’...
  8. 7-4 哈利·波特的考试 (25 分)(C语言实现)
  9. 如何看待自己写的烂代码
  10. 传统负载均衡助力AIOps优化智能运维
  11. atom 快速编写html,Atom 编辑器自定义代码段(snippet)
  12. python练习册 每天一个小程序 第0010题
  13. ps手机计算机图标教程,手绘设计精美手机APP软件图标的PS教程
  14. mysql全文检索 中文_mysql全文索引不支持中文的解决方案
  15. soul-网关实战(二)如何成为了Soul的贡献者
  16. 《九日集训》第五天打卡
  17. 博弈论_奇偶性、单向行走
  18. 梯度下降算法动图_一文读懂梯度下降算法
  19. automotive industry is embracing change and agile transitioning
  20. Python打印菱形

热门文章

  1. 映客都是互刷礼物吗_映客互刷礼物有什么用_映客守护有什么用
  2. 映客2020年报:转型的主动与被动
  3. 大数据培训之核心知识点Hbase、Hive、Spark和MapReduce的概念理解、特点及机制等
  4. 支付宝开发 ——第三方支付
  5. Date,LocalDateTime类型,获取今年开始时间,获取去年的今天。
  6. 一篇文章带你搞定 MongoDB 实现 REST
  7. 神州退市,一嗨要上市
  8. 可以在Facebook Marketplace 上面买亚马逊雨林?
  9. Linux编程:多个子进程与父进程使用匿名管道读写
  10. Matplotlib实现单画布绘制多个子图