-
是这样所有的一且都围绕着生命周期来的,从创建开始到销毁结束,整个应用的整个生命过程都由你掌控着,是不是有种掌握别人命运的感觉,哈哈哈。。。
先上Android 生命周期的图片:
最初遇到很多的应用都是写了不完整的生命周期,基本上所有的逻辑全部在onCreate()方法里面全部完成,这么做是很不妥当的。自己的要求是严格按照生命周期来写,不管用不用到,先按照生命周期写下去。
- 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()方法里面进行获取最初的状态记录下来,等到退出的时候还原。