【Android】Activity生命周期


一. 安卓Activity生命周期图示

如下图所示,一个Activity从创建到前台运行大致经历onCreate >> onStart >>onResume
——》》activity失去焦点,但仍然可见时(如被其他activity部分遮挡)会调用onPause方法
——》》activity完全不可见时(如按下主页键返回桌面)会调用onStop方法
——》》当activity被销毁时(如手动调用finish方法)会调用onDestroy方法

注:finish方法也会经历onPause》》onStop》》onDestroy的过程,如果activity是前台可见的

【Android】Activity生命周期_第1张图片

注:图片来自网络


二. 例子说明

demo结构

写了个demo,有三个activity

MainActivity,程序的入口,有两个button跳转到另外两个activity

【Android】Activity生命周期_第2张图片



SecondActivity,无任何控件

【Android】Activity生命周期_第3张图片



WindowActivity,窗口化的activity,一个textView显示"WindowActivity",一个button跳转到SecondActivity

【Android】Activity生命周期_第4张图片

以上三个activity全部重载了onCreate、 onStart 、onResume、onPause、onStop、onDestroy、onRestart方法

在每个方法里面输出当前函数名


1. 单个Activity演示

首次打开程序进入MainActiivty
【Android】Activity生命周期_第5张图片

依次运行MainActivity的onCreate >> onStart >>onResume 方法


按下主页键后,
先调用MainActivity的onPause,再调用onStop,此时回到桌面,mainActivity完全不可见




再次启动程序,
因为MainActivity并未被销毁,依次运行onRestart >> onStart >>onResume 方法,MainActivity重新回到前台





按下返回键,
依次运行onPause》》onStop》》onDestroy,销毁MainActivity 退出程序




2. 多个Activity间切换

从MainActivity跳转到SecondActivity
【Android】Activity生命周期_第6张图片

先调用main》onPause
然后创建SecondActivity再在前台显示获取焦点
最后调用main》stop,此时MainActivity完全不可见

在SecondActivity界面按返回键back到MainActivity
【Android】Activity生命周期_第7张图片



也是先调用secondActivity的onPause
然后回到MainActivity,因为其未被销毁,所以无需onCreate,而是onRestart》onStart》onResume
最后second》onstop,second》ondestroy

3. 切换到窗口化的Activity


从MainActivity跳转到WindowActivity(非满屏,只是一个窗口)
【Android】Activity生命周期_第8张图片

【Android】Activity生命周期_第9张图片


先调用main》onPause

然后走启动WindowActivity的普通流程


按下主页键后
【Android】Activity生命周期_第10张图片

先调用window》onPause

然后先调用main》onStop,再调用window》onStop

因为按下主页键之前MainActivity和WindowActivity都有可见部分,所以二者的onStop都需调用,因为WindowActivity获得当前焦点,在activity栈顶,所以先stop掉 mainActivity


再次启动程序

【Android】Activity生命周期_第11张图片


同理,启动之后两个activity都有可见部分,所以都要经历onRestart》onStart,WindowActivity要获得焦点,得onResume

之前stop的时候是mainActivity先,现在回复restart也是它先,这也和生命周期图中一一对应的关系一致


从windowActivity跳转到secondActivity

这一部分与返回主页类似,只不过多了一个启动secondActivity的过程

【Android】Activity生命周期_第12张图片

先调用当前栈顶activity,即windowActivity的onPause

然后就调用main》stop?       这一步不太理解,是不是非栈顶activity的stop总在新activity的启动之前?

然后新建并启动secondActivity

最后调用window》onStop


按返回键回到windowActivity

【Android】Activity生命周期_第13张图片


先调用当前activity的onpause,

然后恢复部分可见的activity:mainActivity,

再恢复全部可见获得焦点的activity:windowActivity

最后销毁当前activity



三. 总结

【Android】Activity生命周期_第14张图片
安卓activity的生命周期根据几个临界状态来划分,即是否具备焦点、是否可见、是否被销毁(是否存在),
要想跨过这些临界点就必须调用对应的方法
如要想存在就要 onCreate ,要想不存在就要onDestroy
要想可见就要onStart,要想完全不可见就要onStop
要想获得焦点就要onResume,要想失去焦点就要onPause
这些方法基本在临界点两边一一对应,只有一个onRestart比较特殊,若activity要恢复为可见状态时,如果其之前未被销毁则调用onRestart,如果已经被销毁则调用onCreate


而且方法往往不是单独存在,想要可见可能要经历onCreate》onStart
想要onDestroy,可能要先onPause》onStop
【Android】Activity生命周期_第15张图片

注:图来自网络



特别注意,当程序的activity栈的栈顶activity意图发生改变时,当前位于栈顶的activity一定会调用自己的onPause方法,所以在程序一些页面的数据保存应该写在onPause中,以防丢失

不论是新启动一个满屏activity,启动一个窗口activity,返回主页等前都会调用当前activity的onPause, 然后执行启动过程,最后可能还需要onStop当前activity
未重写返回键事件的情况下,按下back键其实效果等于调用当前activity的finish方法,只是这个finish过程要被分为onPause》恢复其他activity的操作》(onStart+onDestroy)
恢复其他activity的顺序与他们在activity栈的顺序相反,即栈顶的最后恢复


源码下载链接:
demo下载

END.



你可能感兴趣的:(Android开发)