最近在搞Android最基础的组件--Activity。这个其实说简单也不简单,还是花了点时间去弄,主要是弄清楚它的各个状态和生命周期的关系,下面一起来探讨下activity的生命周期。
一、Activity:是用来和用户交互的窗体,包括用户输入和显示处理结果。一个应用程序通常由多个activities组成,他们通常是松耦合关系。它们的状态有:运行状态、暂停状态、停止状态、销毁状态。
这里应该是有一张关于activity生命周期的图的,但是我懒得传了,网上一搜一大把,只要动动手指就好了。。。
其7个生命周期如下:
onCreate(Bundle savedInstanceState)
onStart()
onRestart()
onResume()
onPause()
onStop()
onDestroy()
我这里建了一个工程,代码会在后面上传;
生命周期的详解:
1、单个Activity窗体时:
初次启动Activity:会调用onCreate()-->onStart() --> onResume(),然后分别进行以下操作。
情况1:按下Back键:此时回到系统桌面,系统调用onPause()-->onStop() --> onDestroy()。因为用户选择终止程序,所以要进行退出销毁动作。
然后,在桌面点程序图标,则重新启动Activity,调用onCreate()-->onStart() --> onResume()。
图片:
注:onPause()方法是在Activity可见但不可交互的时候调用,我们若要保存页面的数据,应在此周期中进行操作。onDestroy()方法是进行页面资源的释放,以释放内存空间。
情况2:按下锁屏键,系统调用onPause()-->onStop(),activity不可见,系统暂停当前Activity的运行。
接着解锁屏幕:调用onRestart()-->onStart()-->onResume(),activityc重新进入运行状态。
情况3:按下Home键:系统回到桌面,系统调用onPause() --> onStop()。因为用户并没有退出程序,但是Activity处于不可见状态,所以会调用onstop(),但是不会调用onDestroy()。
然后在桌面点击程序图标,调用onCreate()-->onStart() --> onResume(),恢复不可见的Activity到前台。
情况4:长按Home键,调用onPause(),此时activity仍处于可见但不可交互的暂停状态,但是不会调用onStop()方法。
接着操作分为:
(1)按Back键返回,则调用onResume()。窗体处于可见的暂停状态,直接恢复即可。
(2)按Home键退回桌面,则调用onStop()。窗体处于不可见状态。然后再点击程序图标,则调用onRestart()-->onStart()-->onResume(),进行窗体恢复。
情况5:按音量键,不触发任何Activity周期。
2、多个Activity下进行切换:
这里将第一个Activity称为A,第二个Activity称为B,第三个Activity称为C...依次类推。
情况1:Activity A跳转到Activity B
B的Activity分为完全遮蔽A和不完全遮蔽A两种:
(1)B完全遮蔽A:系统调用为:A:onPause()-->B:onCreate()-->B:onStart()-->B:onResume()-->A:onStop()。
然后,在B中分别进行以下操作:
1)按Back键:返回到A,系统调用:B:onPause()-->A:onRestart()
-->A:onStart()-->A:onResume()-->B:onStop()-->B:onDestroy()。在B中,系统会回收B,释放B中资源,或者可以手动设置回收。
2)按Home键:回到系统桌面,调用为:B:onPause() -> B:onStop()。然后在桌面点击程序图标,调用B:onCreate()-->B:onStart() -->B: onResume(),恢复B到前台进行交互。
3)按锁屏键:调用:B:onPause()-->B:onStop()。接着解锁屏幕:调用B:onRestart()-->B:onStart()-->B:onResume(),Activity重新进入运行状态。
4)长按Home键:弹出后台运行的程序的窗体,没有完全遮蔽B,则会调用:B:onPause();然后操作分两种:1、若按Back键,则调用:B:onResume()恢复B;2、若按Home键,则调用:B:onStop();然后桌面点击程序图标,执行:B:onRestart()-->B:onStart()-->B:onResume()
5)若有其他优先级高的程序启动,则会调用:B:onPause()-->B:onStop()
6)注:若OS内存吃紧,在后台的A可能会被系统kill掉,以释放内存给其它程序使用。
(2)B不完全遮蔽A:onPause()--> B:onCreate()--> B:onStart()--> B:onResume(),然后分别执行操作:
1)按Back键,B:onPause() --> A:onResume() --> B:onStop() --> B:onDestroy()。
2)锁屏:B:onPause() --> B:onStop() --> A:onStop();接着解锁:B:onRestart() --> B:onStart() --> A:onRestart() --> A:onStart() --> B:onResume()。
3)Home键:B:onPause() --> A:onStop() --> B:onStop()。再点击图标,则将两个页面都恢复过来。
4)点击音量键,不调用任何周期。弹出框等,只有是Activity才会调用Activity的周期。