`
dengbaoleng
  • 浏览: 1162995 次
文章分类
社区版块
存档分类
最新评论

Activity的常用FLAG

 
阅读更多

接触 Android 以来,一直觉得对 task、affinity 和 launch mode 一知半解,这几天潜心阅读 Dev Guide 中的 Activities and Tasks,简单做下笔记,梳理下这部分的知识。

Android 的一个特色就是 application A 的 activity 可以启动 application B 的 activity,尽管 A 和 B 是毫无干系的,而在用户看来,两个场景紧密联系,视觉上二者构成了一个整体。Android 就是把这种误觉定义为 Task,它既不是 class,也不是 AndroidMainifest.xml 中的一个元素。从表现上看 Task 就像是一个 stack,一个一个的 activity 是构成 stack 的元素,做着入栈 (push) 和出栈 (pop-up)这样简单重复性的劳动。

默认的规则总是满足大多数的应用场景,但是也总会有一些例外打破习以为常的惯例。Task 的默认规则同样并非牢不可破,修改的方法还是有的。借助 Intent 中的 flag 和 AndroidMainifest.xml 中 activity 元素的属性,就可以控制到 Task 里 Activity 的关联关系和行为。

在 android.content.Intent 中一共定义了20种不同的 flag,其中和 Task 紧密关联的有四种:

  1. FLAG_ACTIVITY_NEW_TASK
  2. FLAG_ACTIVITY_CLEAR_TOP
  3. FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
  4. FLAG_ACTIVITY_SINGLE_TOP

在使用这四个 flag 时,一个 Intent 可以设置一个 flag,也可以选择若干个进行组合。

默认情况下,通过 startActivity() 启动一个新的 Activity,新的 Activity 将会和调用者在同一个 stack 中。但是,如果在传递给 startActivity() 的 Intent 对象里包含了 FLAG_ACTION_NEW_TASK,情况将发生变化,–系统将为新的 Activity “寻找”一个不同于调用者的 Task。不过要找的 Task 是不是一定就是 NEW 呢?如果是第一次执行,则这个设想成立,如果说不是,也就是说已经有一个包含此 Activity 的Task 存在,则不会再启动 Activity。

如果 flag 是 FLAG_ACTIVITY_CLEAR_TOP,同时当前的 Task 里已经有了这个 Activity,那么情形又将不一样。Android 不但不会启动新的 Activity 实例,而且还会将 Task 里 该 Activity 之上的所有 Activity 一律结束掉,然后将 Intent 发给这个已存在的 Activity。Activity 收到 Intent 之后,可以在 onNewIntent() 里做下一步的处理,也可以自行结束然后重新创建自己。如果 Activity 在 AndroidMainifest.xml 里将启动模式设置成”standrd”,– 默认模式,并且 Intent 里也没有设置 FLAG_ACTIVITY_SINGLE_TOP,那么它将选择后者。否则,它将选择前者。FLAG_ACTIVITY_CLEAR_TOP 还可以和 FLAG_ACTION_NEW_TASK 配合使用。

如果 flag 设置的是 FLAG_ACTIVITY_SINGLE_TOP,则意味着如果 Activity 已经是运行在 Task 的 top,则该 Activity 将不会再被启动。


接触 Android 以来,一直觉得对 task、affinity 和 launch mode 一知半解,这几天潜心阅读 Dev Guide 中的 Activities and Tasks,简单做下笔记,梳理下这部分的知识。

Android 的一个特色就是 application A 的 activity 可以启动 application B 的 activity,尽管 A 和 B 是毫无干系的,而在用户看来,两个场景紧密联系,视觉上二者构成了一个整体。Android 就是把这种误觉定义为 Task,它既不是 class,也不是 AndroidMainifest.xml 中的一个元素。从表现上看 Task 就像是一个 stack,一个一个的 activity 是构成 stack 的元素,做着入栈 (push) 和出栈 (pop-up)这样简单重复性的劳动。

默认的规则总是满足大多数的应用场景,但是也总会有一些例外打破习以为常的惯例。Task 的默认规则同样并非牢不可破,修改的方法还是有的。借助 Intent 中的 flag 和 AndroidMainifest.xml 中 activity 元素的属性,就可以控制到 Task 里 Activity 的关联关系和行为。

在 android.content.Intent 中一共定义了20种不同的 flag,其中和 Task 紧密关联的有四种:

  1. FLAG_ACTIVITY_NEW_TASK
  2. FLAG_ACTIVITY_CLEAR_TOP
  3. FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
  4. FLAG_ACTIVITY_SINGLE_TOP

在使用这四个 flag 时,一个 Intent 可以设置一个 flag,也可以选择若干个进行组合。

默认情况下,通过 startActivity() 启动一个新的 Activity,新的 Activity 将会和调用者在同一个 stack 中。但是,如果在传递给 startActivity() 的 Intent 对象里包含了 FLAG_ACTION_NEW_TASK,情况将发生变化,–系统将为新的 Activity “寻找”一个不同于调用者的 Task。不过要找的 Task 是不是一定就是 NEW 呢?如果是第一次执行,则这个设想成立,如果说不是,也就是说已经有一个包含此 Activity 的Task 存在,则不会再启动 Activity。

如果 flag 是 FLAG_ACTIVITY_CLEAR_TOP,同时当前的 Task 里已经有了这个 Activity,那么情形又将不一样。Android 不但不会启动新的 Activity 实例,而且还会将 Task 里 该 Activity 之上的所有 Activity 一律结束掉,然后将 Intent 发给这个已存在的 Activity。Activity 收到 Intent 之后,可以在 onNewIntent() 里做下一步的处理,也可以自行结束然后重新创建自己。如果 Activity 在 AndroidMainifest.xml 里将启动模式设置成”standrd”,– 默认模式,并且 Intent 里也没有设置 FLAG_ACTIVITY_SINGLE_TOP,那么它将选择后者。否则,它将选择前者。FLAG_ACTIVITY_CLEAR_TOP 还可以和 FLAG_ACTION_NEW_TASK 配合使用。

如果 flag 设置的是 FLAG_ACTIVITY_SINGLE_TOP,则意味着如果 Activity 已经是运行在 Task 的 top,则该 Activity 将不会再被启动。

分享到:
评论

相关推荐

    android窗口式activity

    3. 快捷工具:提供一些常用功能的快捷入口,如屏幕亮度调节、截屏等。 4. 提示信息:显示临时性的提示信息,如游戏中的得分显示等。 四、注意事项 1. 权限问题:`SYSTEM_ALERT_WINDOW`权限需要用户授权,因此在应用...

    android之intent&activity;生命周期

    一些常见的Flag包括FLAG_ACTIVITY_CLEAR_TASK、FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVITY_NO_HISTORY和FLAG_ACTIVITY_SINGLE_TOP。 Intent的作用非常广泛,可以用来启动Activity、Service、Broadcast等。例如,启动一...

    退出程序提示,退出程序后关闭所有activity

    2. 使用`Intent.FLAG_ACTIVITY_CLEAR_TOP`标志:当启动一个新的Activity时,可以设置`Intent.FLAG_ACTIVITY_CLEAR_TOP`标志。这将把栈中位于目标Activity之上的所有Activity都清除掉,目标Activity会被重新创建并...

    Android Activity之间的跳转

    开发者可以通过 FLAG_ACTIVITY_CLEAR_TOP 或 FLAG_ACTIVITY_NEW_TASK 等标志控制Activity的栈行为。 综上所述,Android Activity之间的跳转涉及Intent的使用、数据传递、启动模式的选择、生命周期的管理等多个方面...

    Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags()

    `Intent.setFlags()` 方法允许开发者为 Intent 设置标志位,其中最常用的是 `Intent.FLAG_ACTIVITY_NEW_TASK`。此标志位用于指示系统将 Intent 发送到一个新的任务栈或现有的任务栈顶部。 - **描述**:当设置 `...

    Android中Activity常用功能设置小结(包括全屏、横竖屏等)

    为了让设备在使用特定Activity时始终保持屏幕亮着,可以使用`FLAG_KEEP_SCREEN_ON`标志: 1. **XML配置**:在布局文件中,可以为根布局添加以下属性: ```xml android:keepScreenOn="true" ...> ``` 2. **...

    安卓开发框架工具类相关-activity生命周期线程优先级异常销毁任务栈.zip

    了解任务栈的概念有助于设计合理的应用导航流程,例如使用FLAG_ACTIVITY_CLEAR_TOP或FLAG_ACTIVITY_NEW_TASK等Intent标志来控制Activity如何在任务栈中移动。 在提供的“JavaApk源码说明.txt”中,可能包含了关于...

    Android开发之利用Activity实现Dialog对话框

    在Android应用开发中,Dialog是一种常用的组件,用于向用户展示临时信息或进行简单的交互。然而,有时为了获得更大的灵活性和避免潜在的问题,开发者会选择将一个Activity设置为Dialog样式来替代传统的Dialog。本文...

    android 活动跳转项目

    - `startActivity()`:最常用的启动Activity方法,用于启动新的Activity并创建回退栈。 - `startActivityForResult()`:当需要从目标Activity获取结果时使用,启动Activity并等待返回结果。 - `finish()`:用于...

    Android常见面试题目汇总以及答案

    14. **Activity常用的标记位Flags**: 如FLAG_ACTIVITY_NEW_TASK用于创建新的任务栈,FLAG_ACTIVITY_CLEAR_TASK清除栈内所有Activity,FLAG_ACTIVITY_SINGLE_TOP确保Activity在栈顶时不会重建。 15. **Activity的...

    面试题 目 精心选择

    - `FLAG_ACTIVITY_CLEAR_TOP`:清除到目标Activity所在任务栈的顶部,使目标Activity位于栈顶。 - `FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET`:当任务被重置时清除Activity。 - `FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS...

    AndroidManifest.xml文件剖析[参考].pdf

    在Activity中,常用的属性包括android:name和android:label,但我们需要了解所有的属性以帮助解决复杂的问题。完整的Activity属性包括: * android:allowTaskReparenting:指定Activity是否可以重新parentTask * ...

    Android面试题,看看你基础如何?

    - **FLAG_ACTIVITY_BROUGHT_TO_FRONT:** 当一个Activity正在运行时,此标志位会让该Activity置于前台并使其变得可见,即使当前Activity已经在前台也会重新激活它。 - **FLAG_ACTIVITY_CLEAR_TOP:** 如果栈顶存在一...

    Android拦截HOME按键

    在AndroidManifest.xml中,我们需要为我们的Activity添加一个特殊的FLAG_ACTIVITY_NEW_TASK标志,这使得Activity可以作为新的任务栈的起点: ```xml <activity android:name=".YourActivity" android:launchMode=...

    android修改状态栏背景颜色、字体颜色,隐藏状态栏,状态栏透明

    activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); ``` 如果你希望在滑动时显示/隐藏状态栏,可以使用`FLAG_LAYOUT_NO_LIMITS`和`SYSTEM_UI_FLAG_IMMERSIVE_STICKY`: ...

    android intent跳转

    `Intent.FLAG_ACTIVITY_CLEAR_TOP`的作用是在当前Activity栈中移除位于目标Activity之上的所有Activity实例。这意味着如果栈中有任何与`MainMenuActivity`相同的实例,它们将被清除,从而确保只有一个实例存在。这样...

    intent的常用方法

    1. **设置Flag**:在创建Intent时,通常需要为Intent设置`FLAG_ACTIVITY_NEW_TASK`标志位。这表示新启动的Activity将在一个新的任务栈中运行。例如: ```java Intent i = new Intent(context, Receivered.class);...

    Android面试题集锦

    它可以携带数据,并通过不同的标志(如FLAG_ACTIVITY_BROUGHT_TO_FRONT、FLAG_ACTIVITY_CLEAR_TOP等)来控制启动行为。理解每个标志的含义是至关重要的,例如FLAG_ACTIVITY_CLEAR_TOP会清除栈顶以上的所有Activity。...

    038集-Intent类的重要成员变量

    - Activity之间的跳转:Intent常用来在Activity之间传递数据,例如启动新Activity、传递用户输入的信息等。 - Service的启动与绑定:Intent也可以用于启动Service或与已启动的Service进行交互,传递数据和控制命令...

    安卓面试shouji

    - `FLAG_ACTIVITY_BROUGHT_TO_FRONT`: 不常用,表示尝试将Activity带到前台,但不保证效果。 - `FLAG_ACTIVITY_MULTIPLE_TASK`: 创建一个新的任务栈,通常配合`FLAG_ACTIVITY_NEW_TASK`使用。 - `FLAG_ACTIVITY_...

Global site tag (gtag.js) - Google Analytics