偶然翻起去过去的笔试题,被一道activity的问题吸引。
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的生命周期分为:oncreate ,onstart,onresume,on pause,onstop,ondestroy。
第一点,onpause与onstop区别。这地方是最令初学者头疼的地方。官方的解释是 onpause是被覆盖,onstop是完全覆盖。后来研究知道,有些情况activity并没有完全占据整个屏幕,而是占据一部分(类似dialog或是半屏效果)。onstop没什么问题,就是正常启动新页面。所以以下两种情况只会调用onpause而不会调用onstop
1. 一个透明的包含Dialog的Activity 出现
2. 按poweroff锁屏
第二点:back健与home健区别,同时这也是onstop与ondestroy的区别。由于Android本身的特性,使得现在不少应用都没有直接退出应用程序的功能,按照一般的逻辑,当Activity栈中有且只有一个Activity时,当按下Back键此Activity会执行onDestroy,那么下次点击此应用程图标将从重新启动,因此,当前不少应用程序都是采取如Home键的效果,当点击了Back键,系统返回到桌面,然后点击应用程序图标,直接回到之前的Activity界面,这种效果是怎么实现的呢?
back健会执行ondestroy而home健只执行onstop方法。但是可以通过修改onbackpress方法来强行让back 健也不执行destroy方法。
@Override publicvoid onBackPressed() { Intent home = new Intent(Intent.ACTION_MAIN); home.addCategory(Intent.CATEGORY_HOME); startActivity(home); }
当然,此种方式通过Home键效果强行影响到Back键对Activity生命周期的影响。注意,此方法只是针对按Back键需要退回到桌面时的Activity且达到Home效果才重写。
或者,为达到此类效果,Activity实际上提供了直接的方法。
1 activity.moveTaskToBack(true);
moveTaskToBack()此方法直接将当前Activity所在的Task移到后台,同时保留activity顺序和状态
第三点:finish方法与destroy方法。finish是在appmanage栈中移除,destrop是释放内存,当然finish 会调用destroy方法。类似于c++的delete函数与free函数。(delete后free)