Activity的生命周期:
在Activity在Android应用中运行时,它的活动状态由Android以Activity栈的形式管理。当前Activity位于栈顶,每个Activity都可能从活动状态转为非活动状态,也可能由非活动状态转为活动状态。
Activity的状态大概有4个:
- 活动状态:当前Activity位于前台,可见,可以获取焦点。
- 暂停状态:其他Activity位于前台,该Activity可见,但不能获取焦点。
- 停止状态:Activity不可见,失去焦点。
- 销毁状态:Activity结束,或者Activity所在的Dalvik进程结束。
下面是官方Activity生命期结构图:
从图中可以看到被回调的方法有:
- onCreate(Bundle savedStatus):创建Activity时被回调。只调用一次。
- onStart():启动Activity时被回调。
- onRestart():重新启动Activity时被回调。
- onResume():恢复Activity时被回调,onStart()方法回调后一定会回调该方法。
- onPause():暂停Activity时被回调。
- onStop():停止Activity时被回调。
- onDestory():销毁Activity时被回调,之调用一次。
开发的时候,可以选择性地去覆写上面的方法其中最常见的覆写方法是onCreate(Bundle savedStatus)——用于对Activity的初始化。 onPause()方法和onResume()方法在游戏开发中很常见。
当然,要真正了解的话,要自己覆写上述方法进行观察。
Activity的4种加载模式:
这里提到的加载模式就是在AndroidManifest.xml文件中配置Activity时用到Android:launchMode属性,该属性用来配置Activity的加载模式。 该属性有4个属性值:
- standard:标准模式,默认的加载模式。
- singleTop:Task顶单例模式。
- singleTask:Task内单例模式。
- singleInstance:全局单例模式。
在官方API中有简单的介绍: 点击打开链接 任务和返回堆栈 讲加载模式前先介绍点Android对Activity的管理:Android采用Task来管理多个Activity,当我们启动一个app时,Android就会创建一个Task,然后启动这个app的入口Activity(即AndroidManifest.xml中<intent-fliter.../>中配置为MAIN和LAUNCHER的Activity)。这里的Task可以理解成Activity栈,栈顶为启动的Activity,栈底为其他Activity。 Android的加载模式,就负责管理实例化,Activity的加载方式,并可以控制Activity与Task之间的加载关系。
下面对4中加载方式进行详细的介绍:
1、standard模式
在使用这种模式启动Activity时,系统会为目标Activity创建一个新的实例,并将新的Activity添加到栈中,但不会创建新的栈。 我们可以通过Activity的getTaskId()方法来获取当前Activity所在的Task的ID,进而进行观察。
2、singleTop模式
这种模式在启动Activity时,如果要被启动的Activity已经位于栈顶,则系统不会创建新的Activity实例,而是通过调用onNewIntent()方法使用已有的Activity实例。 如果要启动的Activity没有位于栈顶,则系统会创建新的Activity实例,并将器加载到栈顶,此时就跟standard模式相同。
3、singleTask模式
采用这种加载模式时,同一个栈内只有一个目标Activity的实例,如果将要启动的目标Activity不存在,系统将会创建一个Activity的实例并将其加载到栈顶;如果目标Activity已经存在且位于栈顶,此时与singleTop模式相同。这种加载模式允许其他(standard和singleTop)Activity加载到目标Activity所在的栈中,如果Activity已存在但不在栈顶,要打开目标Activity的话,则移出目标Activity上面的所以Activity,使目标Activity位于栈顶。
4、singleInstance模式
这种加载模式与SingleTask模式类似,不同点在于,系统不允许其他Activity加载到目标Activity所在的栈中,目标Activity一直是栈中唯一的成员,并且一直位于栈顶(前台是目标Activity存在);如果目标Activity不存在的话,系统会创建一个新的栈,再创建目标Activity的实例,并将其加载到新的栈的栈顶。
总结:标准模式是默认模式,适合大多数类型的Activity,singleTop对于许多类型的Activity也是常见的发射模式;而对于singleTask和singleInstance,不适合大多数应用程序。