一. 安卓Activity生命周期图示
如下图所示,一个Activity从创建到前台运行大致经历onCreate >> onStart >>onResume
——》》activity失去焦点,但仍然可见时(如被其他activity部分遮挡)会调用onPause方法
——》》activity完全不可见时(如按下主页键返回桌面)会调用onStop方法
——》》当activity被销毁时(如手动调用finish方法)会调用onDestroy方法
注:finish方法也会经历onPause》》onStop》》onDestroy的过程,如果activity是前台可见的
注:图片来自网络
二. 例子说明
demo结构
写了个demo,有三个activity
MainActivity,程序的入口,有两个button跳转到另外两个activity
SecondActivity,无任何控件
WindowActivity,窗口化的activity,一个textView显示"WindowActivity",一个button跳转到SecondActivity
以上三个activity全部重载了onCreate、 onStart 、onResume、onPause、onStop、onDestroy、onRestart方法
在每个方法里面输出当前函数名
1. 单个Activity演示
首次打开程序进入MainActiivty
依次运行MainActivity的onCreate >> onStart >>onResume 方法
按下主页键后,
先调用MainActivity的onPause,再调用onStop,此时回到桌面,mainActivity完全不可见
再次启动程序,
因为MainActivity并未被销毁,依次运行onRestart >> onStart >>onResume 方法,MainActivity重新回到前台
按下返回键,
依次运行onPause》》onStop》》onDestroy,销毁MainActivity 退出程序
2. 多个Activity间切换
从MainActivity跳转到SecondActivity
先调用main》onPause
然后创建SecondActivity再在前台显示获取焦点
最后调用main》stop,此时MainActivity完全不可见
在SecondActivity界面按返回键back到MainActivity
也是先调用secondActivity的onPause
然后回到MainActivity,因为其未被销毁,所以无需onCreate,而是onRestart》onStart》onResume
最后second》onstop,second》ondestroy
3. 切换到窗口化的Activity
从MainActivity跳转到WindowActivity(非满屏,只是一个窗口)
先调用main》onPause
然后走启动WindowActivity的普通流程
按下主页键后
先调用window》onPause
然后先调用main》onStop,再调用window》onStop
因为按下主页键之前MainActivity和WindowActivity都有可见部分,所以二者的onStop都需调用,因为WindowActivity获得当前焦点,在activity栈顶,所以先stop掉 mainActivity
再次启动程序
同理,启动之后两个activity都有可见部分,所以都要经历onRestart》onStart,WindowActivity要获得焦点,得onResume
之前stop的时候是mainActivity先,现在回复restart也是它先,这也和生命周期图中一一对应的关系一致
从windowActivity跳转到secondActivity
这一部分与返回主页类似,只不过多了一个启动secondActivity的过程
先调用当前栈顶activity,即windowActivity的onPause
然后就调用main》stop? 这一步不太理解,是不是非栈顶activity的stop总在新activity的启动之前?
然后新建并启动secondActivity
最后调用window》onStop
按返回键回到windowActivity
先调用当前activity的onpause,
然后恢复部分可见的activity:mainActivity,
再恢复全部可见获得焦点的activity:windowActivity
最后销毁当前activity
三. 总结
安卓activity的生命周期根据几个临界状态来划分,即是否具备焦点、是否可见、是否被销毁(是否存在),
要想跨过这些临界点就必须调用对应的方法
如要想存在就要 onCreate ,要想不存在就要onDestroy
要想可见就要onStart,要想完全不可见就要onStop
要想获得焦点就要onResume,要想失去焦点就要onPause
这些方法基本在临界点两边一一对应,只有一个onRestart比较特殊,若activity要恢复为可见状态时,如果其之前未被销毁则调用onRestart,如果已经被销毁则调用onCreate
而且方法往往不是单独存在,想要可见可能要经历onCreate》onStart
想要onDestroy,可能要先onPause》onStop
注:图来自网络
特别注意,当程序的activity栈的栈顶activity意图发生改变时,当前位于栈顶的activity一定会调用自己的onPause方法,所以在程序一些页面的数据保存应该写在onPause中,以防丢失
不论是新启动一个满屏activity,启动一个窗口activity,返回主页等前都会调用当前activity的onPause, 然后执行启动过程,最后可能还需要onStop当前activity
未重写返回键事件的情况下,按下back键其实效果等于调用当前activity的finish方法,只是这个finish过程要被分为onPause》恢复其他activity的操作》(onStart+onDestroy)
恢复其他activity的顺序与他们在activity栈的顺序相反,即栈顶的最后恢复
源码下载链接:
demo下载
END.