一个简单扫描应用彻底明白Android 生命周期

Posted #Skye

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个简单扫描应用彻底明白Android 生命周期相关的知识,希望对你有一定的参考价值。

  • 做久了的android程序员大概都觉得Android好简单,无非就是那几个,按照生命周期来就OK了,有啥写的。。。。。

  • 是这样所有的一且都围绕着生命周期来的,从创建开始到销毁结束,整个应用的整个生命过程都由你掌控着,是不是有种掌握别人命运的感觉,哈哈哈。。。

先上Android 生命周期的图片:

最初遇到很多的应用都是写了不完整的生命周期,基本上所有的逻辑全部在onCreate()方法里面全部完成,这么做是很不妥当的。自己的要求是严格按照生命周期来写,不管用不用到,先按照生命周期写下去。

  1. Activity实例是由系统自动创建,并在不同的状态期间回调相应的方法。一个最简单的完整的Activity生命周期会按照如下顺序回调:onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy。称之为entire lifetime。

2.当执行onStart回调方法时,Activity开始被用户所见(也就是说,onCreate时用户是看不到此Activity的,那用户看到的是哪个?当然是此Activity之前的那个Activity),一直到onStop之前,此阶段Activity都是被用户可见,称之为visible lifetime。

3.当执行到onResume回调方法时,Activity可以响应用户交互,一直到onPause方法之前,此阶段Activity称之为foreground lifetime。
此处以我们的扫描应用为例,按照生命周期的规律实现。

在实际应用场景中,假设A Activity位于栈顶,此时用户操作,从A Activity跳转到B Activity。那么对AB来说,具体会回调哪些生命周期中的方法呢?回调方法的具体回调顺序又是怎么样的呢?

开始时,A被实例化,执行的回调有A:onCreate -> A:onStart -> A:onResume。

当用户点击A中按钮来到B时,假设B全部遮挡住了A,将依次执行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop。

此时如果点击Back键,将依次执行B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy。

至此,Activity栈中只有A。在Android中,有两个按键在影响Activity生命周期这块需要格外区分下,即Back键和Home键。我们先直接看下实验结果:

此时如果按下Back键,系统返回到桌面,并依次执行A:onPause -> A:onStop -> A:onDestroy。

此时如果按下Home键(非长按),系统返回到桌面,并依次执行A:onPause -> A:onStop。由此可见,Back键和Home键主要区别在于是否会执行onDestroy。

此时如果长按Home键,不同手机可能弹出不同内容,Activity生命周期未发生变化(由小米2s测的,不知道其他手机是否会对Activity生命周期有影响)。

由于Android本身的特性,使得现在不少应用都没有直接退出应用程序的功能,按照一般的逻辑,当Activity栈中有且只有一个Activity时,当按下Back键此Activity会执行onDestroy,那么下次点击此应用程图标将从重新启动,因此,当前不少应用程序都是采取如Home键的效果,当点击了Back键,系统返回到桌面,然后点击应用程序图标,直接回到之前的Activity界面,这种效果是怎么实现的呢?

通过重写按下Back键的回调函数,转成Home键的效果即可。

@Override
public void onBackPressed() {
    Intent home = new Intent(Intent.ACTION_MAIN);
    home.addCategory(Intent.CATEGORY_HOME);
    startActivity(home);
}

说的有点远了,今天我自己遇到的问题是,当执行home键退出时,程序执行了onPause(),最初设想的是程序退出,对原来的状态不做任何的改变(实际是做了改变,退出时还原为原始状态),我的疏忽先是在onCreate()获取状态记录下来,在onDestory()进行还原状态。但是使用者是在onCreate()之后按home键退出,再进行设置里面操作修改扫描状态,然后再打开扫描应用,再退回去,结果发现刚才设置的状态改变了。然后以为是设备不正常。
对于这个问题,其实最开始应该在onResume()方法里面进行获取最初的状态记录下来,等到退出的时候还原。

以上是关于一个简单扫描应用彻底明白Android 生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Android 生命周期 - 我的想法正确吗?

Spark 定制版:009~Spark Streaming源码解读之Receiver在Driver的精妙实现全生命周期彻底研究和思考

Spark Streaming源码解读之Receiver生成全生命周期彻底研究和思考

[Android]Activity的生命周期

带你彻底明白 Android Studio 打包混淆

Android Activity的生命周期简单总结