1.2.2 Activity管理机制
Android的管理是通过Activity栈和Task来进行的,本节将着重介绍与Activity相关的Activity栈、Task以及Activity生命周期等概念。
1. Activity栈
Android的管理主要是通过Activity栈来进行的。当一个Activity启动时,系统根据其配置或调用的方式,将Activity压入一个特定的栈中,系统处于运行(Running or Resumed)状态。当按Back键或触发finish()方法时,Activity会从栈中被压出,进而被销毁,当有新的Activity压入栈时,如果原Activity仍然可见,则原Activity的状态将转变为暂停(Paused)状态,如果原Activity完全被遮挡,那么其状态将转变为停止(Stopped)。
2. Task
Task是Android中与Activity相关的另一个重要概念,其与Activity栈有着密切的联系。笔者认为,一个Task对应于一个Activity栈,Task是根据用户体验组成的运行期逻辑单元,其与应用的区别在于,Task中的Activity可以由不同的应用组成。在实际的终端使用中,在主界面长按Home键时弹出的一个网格界面即是当前运行的Task而非应用。
Task的定义位于frameworks\base\services\java\com\android\server\am\目录下的TaskRecord.java中,一个Task由tasked、affinity(亲和性)、clearOnBackground、intent、affinityIntent、origActivity、realActivity、numActivities、lastActiveTime、rootWasReset、stringName等属性构成。
在Activity中,有不少属性与Task相关,如android:allowTaskReparenting、android: taskAffinity、android:alwaysRetainTaskState、android:clearTaskOnLaunch、android: finishOnTaskLaunch等。
(1)Task间移动配置
android:allowTaskReparenting属性用来配置是否允许Activity从启动它的Task移动到和该Activity设置的Task亲和性相同的Task中,示例如下:
android:label="ActivityManagerRecentOneActivity"
android:allowTaskReparenting="true"
android:taskAffinity="android.app.cts.recentOne">
(2)Task状态配置
android:alwaysRetainTaskState属性用于配置是否保留Activity所在的Task状态,默认为“false”。
android:clearTaskOnLaunch属性用于配置当Task从主界面重新启动时,是否需要清除除根Activity外的所有Activity,默认为false。
android:finishOnTaskLaunch属性用于配置当Task从主界面重新启动时,特定的Activity是否需要被销毁,默认为false。
(3)Task亲和性
Task亲和性是一个很重要的概念,由android:taskAffinity属性定义。如果希望Activity启动时运行在特定的Task中,必须显式设置Task的android:taskAffinity属性,下面是Music应用中的一个示例:
android:taskAffinity="android.task.video"
android:label="@string/videobrowserlabel"
android:icon="@drawable/app_video"
android:exported="false">
...
注意 只有通过标志位为FLAG_ACTIVITY_NEW_TASK的Intent启动Activity时,该Activity的android:taskAffinity属性才有效,系统才会将具有相同Task亲和性的Task切换到前台,然后启动该Activity,否则该Activity仍然运行在启动它的Task中。
在默认情况下,通过android.intent.category.LAUNCHER的Action启动的应用所在的Task亲和性为应用包名。在解析APK包(PackageParser.java)时系统会确定应用的Task亲和性。
3. Activity生命周期
Activity从启动到被销毁的整个过程称为Activity的一个生命周期。在一个生命周期中,Activity有很多的状态变化,图1-8所示为Activity在生命周期中的状态迁移过程。
(点击查看大图)图1-8 Activity生命周期Activity生命周期中状态迁移执行的方法如下:
protected void onCreate(Bundle savedInstanceState)
protected void onStart()
protected void onResume()
protected void onPause()
protected void onStop()
protected void onDestroy()
protected void onRestart()
注意 onResume()方法和很多初学者所认为的不同,其除了在Activity恢复可见性时被调用外,在构建Activity后也会被调用。另外,应避免直接调用onDestroy()销毁Activity,正确销毁Activity的方式是调用finish()方法。