天天看点

Android学习之——Activity的生命周期与加载模式

Activity的生命周期:

在Activity在Android应用中运行时,它的活动状态由Android以Activity栈的形式管理。当前Activity位于栈顶,每个Activity都可能从活动状态转为非活动状态,也可能由非活动状态转为活动状态。

Activity的状态大概有4个:
  • 活动状态:当前Activity位于前台,可见,可以获取焦点。
  • 暂停状态:其他Activity位于前台,该Activity可见,但不能获取焦点。
  • 停止状态:Activity不可见,失去焦点。
  • 销毁状态:Activity结束,或者Activity所在的Dalvik进程结束。

下面是官方Activity生命期结构图:

Android学习之——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,不适合大多数应用程序。