Activity的四种启动模式及其应用

来源:互联网 发布:百合 知乎 编辑:程序博客网 时间:2024/05/29 07:32

1、任务和返回栈

返回栈

Activity 启动另一个 Activity 时,该新 Activity 会被推送到栈顶。按返回键时当前Activity出栈。
返回栈

任务栈

Android系统通过栈结构保存整个App的Activity,栈底的元素是整个任务栈的发起者。当一个App启动时,如果当前环境不存在该App的任务栈,则系统会创建一个任务栈,此后,这个App所启动的Activity(也会启动其他App的Activity,比如一个应用想发邮件,它就会启动邮件App的发邮件的那个Activity)都将在这个任务栈进行管理,这个栈也被称为一个Task(完成一项任务所需要的所有Activity的集合)。一个Task中的Activity可以来自不同的App,同一个App中的Activity也可能不在一个Task中。

Activity的多次实例化
返回栈中只有推入弹出操作,因此若 Activity可以被多个Activity启动,该Activity就会被多次实例化并被推入栈中。一般一个应用会拥有一个任务栈。

2、四种启动模式

Activity的四种启动模式与Intent的flag就是用来管理任务的,也就是启动Activity时对任务栈和返回栈的特定操作。
给< activity>标签指定android:launchMode属性来选择启动模式。

standard

默认模式,Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例。

singleTop

如果当前任务栈的顶部已存在 Activity 的一个实例,不会创建 Activity 的新实例。但是,系统会通过调用该实例的 onNewIntent() 方法向其传送 Intent。

应用:
搜索功能。创建一个搜索框,点击搜索的时候将导航到一个显示搜索结果列表的SearchActivity中,这个搜索框一般也会在SearchActivity中,便于用户再次搜索而不用按返回键。

QQ消息显示界面:当接收多条消息时,不会弹出多个消息显示界面

在实际编程时, 在singleTop模式下需要同时在onCreate() 和 onNewIntent()中处理发来的intent,以满足不同情况

singleTask

singleTop是检测栈顶有没有要启动的Activity,而singleTask是检测整个栈有没有要启动的Activity。该模式下,一个任务栈Task内只能有一个该Activity的实例,所以叫singleTask。启动该Activity时若任务栈中没有该Activity则实例化一个放在栈顶,若有则让该实例以上的所有Activity出栈销毁,即将该实例置为栈顶。

应用
退出整个应用:将主Avtivity设置为SingleTask模式,在要退出得Activity转到主Activity,从而将主Activity之上的Activity都清除。然后,重写主Activity的onNewIntent方法,加入finish方法,将自己,也就是最后一个Activity清除掉。

如果启动模式为singleTask的Activity已经处在后台的一个任务栈中,那么当它被启动后,它所在的后台的这个任务栈将一起被切换到前台。

如下图所示:本来ActivityY和ActivityX所处的任务栈在后台,但是Activit2启动了singleTask模式的ActivityY,它所在的任务栈被切换到前台,因此按返回键时,ActivityX获得焦点,显示给用户。

singleInstance

持有这个Activity的任务栈只能有一个Activity:即这个单例本身。

应用:
浏览器:与浏览器的工作原理类似。若浏览器已经被打开,只需要共享使用即可。

如果在一个singleTop或singleInstance的ActivityA通过startActivityForResult方法启动另一个ActivityB,则会直接返回Activity.RESULT_CANCELED,Android系统默认不允许不同Task之间传递数据,如果一定要传递,那就只能通过Intent绑定数据。(吗意思?)

3、Intent Flag启动模式

  1. Intent.FLAG_ACTIVITY_NEW_TASK:使用一个新的task来启动Activity,一般用在service中启动Activity的场景,因为service中并不存在Activity栈。
  2. Intent.FLAG_ACTIVITY_SINGLE_TOP:类似andoid:launchMode=”singleTop”
  3. Intent.FLAG_ACTIVITY_CLEAR_TOP:类似andoid:launchMode=”singleTask”
  4. Intent.FLAG_ACTIVITY_NO_HISTORY:使用这种模式启动Activity,当该Activity启动其他Activity后,该Activity就消失了,不会保留在task栈中。例如A B,在B中以这种模式启动C,C再启动D,则当前的task栈变成A B D。

4、清空任务栈

  1. clearTaskOnLaunch:每次返回该Activity时,都将该Activity之上的所有Activity都清除。通过这个属性可以让task每次在初始化的时候都只有这一个Activity。
  2. finishOnTaskLaunch:clearTaskOnLaunch作用在别的Activity身上,而finishOnTaskLaunch作用在自己身上。通过这个属性,当离开这个Activity所在的task,那么当用户再返回时,该Activity就会被finish掉。 [暂时还不明白这个有什么作用]
  3. alwaysRetainTaskState:如果将Activity的这个属性设置为true,那么该Activity所在的task将不接受任何清理命令,一直保持当前task状态,相当于给了task一道”免死金牌”。
0 0
原创粉丝点击