1.Tasks and Back Stack概述
一个task就是用户交互的多个被打开的activity的集合,设备的home按键往往是许多任务的一个起点。当用户点击app的起动图标或者快捷方式时,该app的任务将被前置,如果该app的task不存在,则创建一个与该app关联的task,main activity将被置于任务栈的栈底。
当activity A启动了一个新的activity B,则B将被压入back stack的栈顶并获得焦点处于resumed状态,A在B的下面处于stopped状态。当用户按下back按钮,B将弹出back stack的置于栈顶,此时B处于destroyed状态而销毁。当该app的activity在栈里全部移除后,该task也就不再存在了。当回到主屏或者开启新的task后,该task将作为一个整体,能够被置于后台,而处于stopped状态满足后进先出的原则!
2.Activity状态保存
注意:在同一个时刻,如果系统内存不足,将会销毁一些activity以恢复内存,具体了解Activity的状态保存
3.启动模式
(1)."standard"
activity的默认启动模式,该activity可以被实例化对此,可以在不同任务或者同一任务中。
(2)."singleTop"
在当前任务的栈顶,如果该activity已经存在,系统会自动调用该activity的onNewIntent()方法,而不是创建该activity的实例化对象。即除了该activity位于当前任务的栈顶之外,都需要重新实例化。
(3)."singleTask"
系统将为该activity创建一个新的任务,并将该activity置于新任务的栈底,如果该activity已经存在,系统通过调用onNewIntent()并移除该activity对应任务栈上的所有activity实例化对象,重新使用该activity,而不是实例化该activity。
(4)."singleInstance"
和"singleTask"相似,只不过该activity只存在于一个新的task中,并且该task只能存放当前一个activity对象。
在AndroidManifest.xml项目清单文件中可以设置activity的启动模式,而当通过intent标签重新指定该activity的启动模式后,该activity在项目清单文件中配置的启动模式将被覆写。关于通过intent配置activity这里暂时略去。
4.Activity在启动模式下的生命周期
在Activity一文中已经阐述过Activity生命周期,这里主要介绍当activity设置了启动模式后,如果需要启动的该activity,则不需要重新实例化。按activity的当前状态区分
(1).paused
说明该activity可见,但是失去了焦点,onNewIntent()->onResume()
(2).stopped
说明该activity不可见,onNewIntent()->onRestart()->onStart()->onResume()
5.返回栈的清理
如果用户长时间离开一个任务,系统间会清理所有的activity对象除了root Activity,如果用户再次返回该任务,只有root activity被保存!可以通过下面的activity的xml标签去修改适合自己需求的属性。
(1).alwaysRetainTaskState
如果为一个任务的root activity设置该标签为true,上面的默认行为将不会发生,该任务的处在返回栈中所有的activity信息,在很长时间下也能被保存下来。
(2).clearTaskOnLaunch
如果为一个任务的root activity设置该标签为true,该任务栈将被清理。用户总是返回至该任务的初始化状态,即使只离开一会,和alwaysRetainTaskState正好相反。
(3).finishOnTaskLaunch
该属性和clearTaskOnLaunch类似,但是只能操作单个activity而不是整个任务。
6.启动一个任务
(1).设置main activity
You can set up an activity as the entry point for a task by giving it an intent filter with "android.intent.action.MAIN" as the specified action and "android.intent.category.LAUNCHER" as the specified category.
(2).通过设置启动模式
<activity android:name=".ActivityB" android:label="SingleTaskB" android:launchMode="singleTask" > </activity>