1.首先来一张生命周期的总图:
2.几个典型的场景
(1)Activity从被装载到运行,执行顺序如下:
onCreate() -> onStart() -> onResume();
(2)Activity从运行到暂停,再到继续回到运行
onPause() -> onResume ()
这个过程发生在Activity被别的Activity遮住了部分UI,失去了用户焦点,另外那个Activity退出之后,这个Activity再次获得运行。整个过程中,该Activity的实例是一直存在的。
(3)Activity运行到停止
onPause() -> onStop()
这个过程发生在Activity的UI完全被别的Activity遮住了,当然也失去了用户的焦点。这个过程中Activity的实例仍然存在。比如,当Activity运行的时候,用户了按了Home键,该Acitivity就会被执行。
(4)Activity从停止到运行
onReset() -> onStart() -> onResume()
处于Stopped状态并且实例仍然存在的Activity,再次被系统运行时,执行这个过程。这个过程是(3)的逆过程。
(5)Activity从运行到销毁,执行顺序如下:
onPause() -> onStop() -> onDestory()
这个过程发生在Activity完全停掉并被销毁了,所以该Activity的实例也就不存在了。比如这个Activity正在运行,用户按了Back按键,该Activity就会执行这个过程。这个过程是(1)的逆过程。
(6)被清除出内存的Activity的重新运行
onCreate() -> onStart() -> onResume()
这个过程对用户是透明的,用户不知道这个过程的发生。
3.Activity的实例化和启动
Acitivity实例的工作是android系统完成的,在用户点击执行一个Activity或者另一个Activity需要这个Activity执行时,如果这个Activity的实例不存在,Android系统都会实例化之,并且在该Activity所在线程的主线程中调用Activity的onCreate()方法,实现Activity的工作。
onCreate()是系统实例化Activity时,Activity可做的自身初始化的时机。在这里可以实例化变量,调用setContentView()设置UI显示内容。
一般来说,在Activity实例化之后就好启动该Activity,这样会在该Activity所在的进程的主线程中顺序调用Activity的onStart(),onResume()。onCreate()在Acitivity存续期中,只会被调用一次。如生命周期图中时序(6)的情形其实是另外又开启一个Activity的实例,并通过onCreate的参数传递进先前杀掉的Acitivity保存的信息。因为onStart()可因为已经停止了,再次执行而被调用多次。onResume()可以因为Activity的Paused/Resumed的不停转换,而被频繁调用。
4.Activity的暂停和继续
5.Activity的关闭/销毁与重新运行
6.Activity的启动模式
(1)standard(默认)
(2)singleTop
singleTop和standard模式,都会将intent发送新的实例(后两种模式不发送到新的实例,如果已经有了的话)。不过,singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不发送给新的实例。还是用刚才的示例,只需将launchMode改为singleTop,就能看到区别。运行的时候会发现,按多少遍按钮,都是相同的ActiA实例,因为该实例在栈顶,因此不会创建新的实例。如果回退,将退出应用。
(3)singleTask
singleTask模式和后面的singleInstance模式都是只创建一个实例的。当intent到来,需要创建singleTask模式Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。
(4)singleInstance
首先要说一下Task(任务)的概念。如果是Swing或者Windows程序,可能有多个窗口可以切换,但是你无法在自己程序中复用人家的窗口。注意是直接复用人家的二进制代码,不是你拿到人家api后的源代码级调用。Android可以做到,让别人的程序直接复用你的Activity(类似桌面程序的窗口)。Android为提供这种机制,就引入了Task的概念。Task可以认为是一个栈,可放入多个Activity。比如启动一个应用,那么Android就创建了一个Task,然后启动这个应用的入口Activity,就是intent-filter中配置为main和launch的那个(见一个APK文件部署产生多个应用安装的效果)。这个Activity是根(Root)Activity,可能会在它的界面调用其他Activity,这些Activity如果按照上面那三个模式,也会在这个栈(Task)中,只是实例化的策略不同而已。
Android(java)学习笔记170:Activity的生命周期
原文:http://www.cnblogs.com/hebao0514/p/4737887.html