Activity 启动模式

来源:互联网 发布:linux 如何查看nat 编辑:程序博客网 时间:2024/06/05 07:53

我们都知道 Activity 有四种启动模式,为什么需要启动模式。我们都知道在默认情况下,当启动一个个相同的Activity,系统会创建一个个实例并将它们放入到任务栈中,当按返回键时,会把它们一一弹出栈。为了避免多个相同实例同时存在,所以有了启动模式,让我们选择,默认是standard,标准模式.

Activity 有四种启动模式:


  1. standard: 标准模式,不管是否已经存在相同的实例,每次启动都会重新创建实例,并将它们压入启动它的 Activity 所在的任务栈。正常调用 Activity 的所有生命周期。
  2. singleTop: 栈顶复用模式。如果 Activity 实例已经位于任务栈栈顶,启动它则不会创建新的实例,会调用 onNewIntent 方法,取出当前请求的信息,不会调用 onCreate,onStart,因为栈顶实例没有发生改变。
  3. singleTask: 栈内复用模式。这是一种单实例模式。我原来的理解是:只要当前栈内有和它相同的实例,则将它上面的实例清除掉,让它重新回到栈顶。如果不存在,才会重新创建。 后来才知道,当启动 Activity,首先检查有没有启动它的任务栈,如果栈不存在,则会创建栈在将实例放入栈顶。
  4. singleInstance :单实例模式。加强的 singleTask 模式。它会让 Activity 单独位于一个任务栈内。

什么是 Activity 所需要的任务栈?
任务栈分为 前台任务栈 和 后台任务栈,后台任务栈的 Activity 处于暂停。
需要两个相关参数: TaskAffinity 和 allowTaskReparenting.
TaskAffinity 属性指定了栈的名字,如果和包名相同,相当于没有指定。 这个属性和 singleTask 模式 或者
allowTaskReparenting 属性配对使用,其他情况下,没有作用。
当 TaskAffinity 和 singleTask 配合使用, 启动的 Activity 会运行在TaskAffinity 指定名称的栈内。如果没有相同栈,则创建。
当 TaskAffinity 和 allowTaskReparenting 配对使用,不会创建栈,当 allowTaskReparenting = true, 启动 Activity A,它会运行在当前栈内,如果在打开 TaskAffinity 指定的栈时,A 会从当前栈内转移到 指定的栈内。比如当在应用 A 启动 应用B 的Activity C, 首先它会在 A 中打开,当按 home 键返回桌面,打开 B ,首先看到的是 C。
有两种方式指定启动模式:

  • 通过 AndroidMinifest
 <activity android:name=".webview.WebViewActivity"                  android:launchMode="singleTop"> </activity>
  • 在 Intent 中设置标志位
        Intent intent = new Intent();        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        startActivity(intent);

在 Intent 中设置标志位的优先级大于在 Minifest 中设置的。同时都设置的话,Intent 中的标示位起作用。但两种都有限定范围:Minifest 中无法指定标示位, Intent 中无法指定启动模式。

Activity 的 Flag
1.FLAG_ACTIVITY_NEW_TASK:为 Activity 指定 singleInstance 启动模式。
2.FLAG_ACTIVITY_SINGLE_TOP:为 Activity 指定 singleTop 启动模式。
3.FLAG_ACTIVITY_CLEAR_TOP:为 Activity 指定 singleTask 启动模式。
4.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS: 等同于在XML中指定 android: excludeFromRecents = true, 具有这个标记的 Activity 不会出现在 Activity 历史列表中,按返回键是看不到这个Activity 的。

原创粉丝点击