Intent 启动相关FLAG

2019-08-23  本文已影响0人  柴西卡夫卡

常用FLAG标志

FLAG_ACTIVITY_CLEAR_TASK

清空任务栈,常用

FLAG_ACTIVITY_SINGLE_TOP

与启动模式"singleTop"一致

FLAG_ACTIVITY_NEW_TASK

标志启动在一个新的Task中。当与FLAG_ACTIVITY_CLEAR_TOP一起用,与启动模式"singleTask"一致

FLAG_ACTIVITY_CLEAR_TOP

在同一个任务栈中所有位于它上面的Activity都要出栈。此模式一般需要和FLAG_ACTIVITY_NEW_TASK配合使用。在这种情况下,被启动Activity的实例已经存在,那么系统就会调用它的onNewIntent。 如果被启动的Activity采用standard模式启动,那么连同它之上的Activity都要出栈,系统会创建新的Activity实例并放入栈顶。 singleTask启动模式就具有此标记位的效果。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

Activity不会出现在历史Activity列表中,等同于manifest中指定Activity属性 android:excludeFromRecents="true"

FLAG_ACTIVITY_FORWARD_RESULT

/**
* If set and this intent is being used to launch a new activity from an
* existing one, then the reply target of the existing activity will be
* transfered to the new activity. This way the new activity can call
* {@link android.app.Activity#setResult} and have that result sent back to
* the reply target of the original activity.
*/

这个标志位用于A启动B,B启动C,C要把result返回给A,这个时候B启动C的时候带上这个标志位就可以了。这个时候C finish()的时候必须带上 setResult 方法,否则系统会抛出异常。

FLAG_ACTIVITY_PREVIOUS_IS_TOP

即 A---> B --->C,若B启动C时用了这个标志位,那在启动时B并不会被当作栈顶的Activity,而是用A做栈顶来启动C。
此过程中B充当一个跳转页面。典型的场景是在应用选择页面,
如果在文本中点击一个网址要跳转到浏览器,而系统中又装了不止一个浏览器应用,
此时会弹出应用选择页面。在应用选择页面选择某一款浏览器启动时,就会用到这个Flag。
然后应用选择页面将自己finish,以保证从浏览器返回时不会在回到选择页面。
经常与FLAG_ACTIVITY_FORWARD_RESULT 一起使用。

FLAG_ACTIVITY_NO_HISTORY

/**
* If set, the new activity is not kept in the history stack. As soon as
* the user navigates away from it, the activity is finished. This may also
* be set with the {@link android.R.styleable#AndroidManifestActivity_noHistory
* noHistory} attribute.
*
* <p>If set, {@link android.app.Activity#onActivityResult onActivityResult()}
* is never invoked when the current activity starts a new activity which
* sets a result and finishes.
*/

当标记该FLAG后启动的activity不会存在ActivityTask ,例如A启动B,B启动C,C finish()后看到的界面是A,这个时候B也同时被 finish()了

FLAG_ACTIVITY_NO_USER_ACTION

禁止activity调用onUserLeaveHint()。onUserLeaveHint()作为activity周期的一部分,它在activity因为用户要跳转到别的activity而退到background时使用。比如,在用户按下Home键(用户的操作),它将被调用。比如有电话进来(不属于用户的操作),它就不会被调用。注意:调用finish() 该activity销毁时不会调用该函数。

FLAG_ACTIVITY_REORDER_TO_FRONT

/**
* If set in an Intent passed to {@link Context#startActivity Context.startActivity()},
* this flag will cause the launched activity to be brought to the front of its
* task's history stack if it is already running.
*
* <p>For example, consider a task consisting of four activities: A, B, C, D.
* If D calls startActivity() with an Intent that resolves to the component
* of activity B, then B will be brought to the front of the history stack,
* with this resulting order: A, C, D, B.
*
* This flag will be ignored if {@link #FLAG_ACTIVITY_CLEAR_TOP} is also
* specified.
*/
  1. 如果新活动已在任务中,用本flag启动会将它移到任务的历史栈的前面。
  2. 如果用了FLAG_ACTIVITY_CLEAR_TOP,本flag就无效。

FLAG_ACTIVITY_NO_ANIMATION

本flag会阻止系统展示活动的当前状态到另一个状态之间的转移动画。这并不意味着永远没有动画 -- 如果另一项活动的改变在当前展示的活动启动前发生并且没有使用本flag,那么动画还会展示。当你要进行一系列活动操作,但是用户看到的动画不应该由第一项改变来驱动,而是由下一项。

FLAG_ACTIVITY_TASK_ON_HOME

该flag启动的activity,点击返回键会回到launcher.需要与FLAG_ACTIVITY_NEW_TASK一起使用,并且FLAG_ACTIVITY_NEW_TASK模式生效后,该flag才会起作用.

FLAG_ACTIVITY_RETAIN_IN_RECENTS

  1. 默认情况下由FLAG_ACTIVITY_NEW_DOCUMENT创建的新纪录,用户关闭时(按返回键或其他方式结束)它在最近任务中的入口会被移除。如果你想保留入口,就用本flag。
  2. 接收的Activity可以用autoRemoveFromRecents属性或者调用Activity.finishAndRemoveTask()来覆盖本请求。

FLAG_ACTIVITY_NEW_DOCUMENT

  1. 本flag会给启动的活动开一个新的任务记录。使用了本flag或documentLaunchMode属性时,相同Activity的多实例会在最近任务列表中产生不同的记录。
  2. 使用本flag比使用documentLaunchMode属性更好,因为documentLaunchMode属性会跟Activity绑定,而flag只在需要时添加。
  3. 注意本flag的默认词义,Activity销毁后最近任务列表中的入口不会移除。这跟使用FLAG_ACTIVITY_NEW_TASK不一样,后者活动销毁后入口会马上移除。你可以用FLAG_ACTIVITY_RETAIN_IN_RECENTS改变这个行为。
  4. 本flag可以跟FLAG_ACTIVITY_MULTIPLE_TASK联合使用。单独使用时跟manifest Activity中定义documentLaunchMode="intoExisting"效果相同,联合使用时跟manifest Activity中定义documentLaunchMode="always"效果相同。

DocumentLaunchMode介绍(recent tasks screen):

"intoExisting" - The activity reuses the existing task for the document (The one that creates it). Using this value is the same as setting the FLAG_ACTIVITY_NEW_DOCUMENT flag, without setting the FLAG_ACTIVITY_MULTIPLE_TASK flag.
"always" - The activity creates a new task for the document, even if the document is already opened. This is the same as setting both the FLAG_ACTIVITY_NEW_DOCUMENT and FLAG_ACTIVITY_MULTIPLE_TASK flags.
"none" - (Default) - The activity does not create a new task for the activity. This creates a new task only when FLAG_ACTIVITY_NEW_TASK is set. The overview screen treats the activity as it would by default: it displays a single task for the app, which resumes from whatever activity the user last invoked.
"never" - This activity is not launched into a new document even if the Intent contains FLAG_ACTIVITY_NEW_DOCUMENT. Setting this overrides the behavior of the FLAG_ACTIVITY_NEW_DOCUMENT and FLAG_ACTIVITY_MULTIPLE_TASK flags, if either of these are set in the activity, and the overview screen displays a single task for the app, which resumes from whatever activity the user last invoked.

FLAG_ACTIVITY_LAUNCH_ADJACENT

/**
 * This flag is only used in split-screen multi-window mode. The new activity will be displayed
 * adjacent to the one launching it. This can only be used in conjunction with
 * {@link #FLAG_ACTIVITY_NEW_TASK}. Also, setting {@link #FLAG_ACTIVITY_MULTIPLE_TASK} is
 * required if you want a new instance of an existing activity to be created.
 */

本flag只在分屏多窗口模式下使用。新活动会显示在旧活动旁边。本flag只能跟FLAG_ACTIVITY_NEW_TASK联合使用。并且如果你想创建一个已存在活动的新实例,那么要设置FLAG_ACTIVITY_MULTIPLE_TASK。

应用:

移除任务栈中之前所有的Activity

Intent.setFlag(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLREA_TASK)
ActivityCompat.finishAffinity()

其他:

全面分析Activity的LaunchMode和20种flags

上一篇下一篇

猜你喜欢

热点阅读