美文网首页Android笔记
Android Activity启动模式和任务栈

Android Activity启动模式和任务栈

作者: Young_Allen | 来源:发表于2018-11-20 10:08 被阅读57次

    每天一篇系列:
    强化知识体系,查漏补缺。
    欢迎指正,共同学习!

    系统提供了两种方式来设置一个Activity的启动模式。一种是在Androidmenifest.xml声明启动模式,另一种是通过Intent的Flag来设置启动模式。

    在Androidmenifest.xml中设置启动模式:

    standard:
    这是默认模式,每次都会创建一个实例,因此onCreate、onStart、onResume都会重复调用。


    在standard模式下,堆栈中可能有多个实例。

    singletop
    如果该实例已经在堆栈的栈顶上则不会重新创建,onCreate、onStart不会被调用,而是会调用onNewIntent;

    如果不在栈顶上,则会重新创建一个实例,onCreate、onStart、onResume都会调用。



    在singletop模式下,堆栈中可能有多个实例。

    singletask
    如果实例已经在栈顶,则复用,调用onNewIntent;

    如果实例不在栈顶,则会destroy其上的所有任务,调用onNewIntent。


    总之在singletask模式下,栈中只会有一个实例。

    singleinstanse
    只有一个实例,自己单独放在了一个任务栈里面,所以这样的模式至少有两个以上的任务栈。

    通过Intent设置启动模式:

        /**
         * 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.
         */
        public static final int FLAG_ACTIVITY_NO_HISTORY = 0x40000000;
    

    使用FLAG_ACTIVITY_NO_HISTORY模式启动的Activity,当该Activity启动其他Activity后,该Activity就消失了,不会保留在Activity栈中

        /**
         * If set, the activity will not be launched if it is already running
         * at the top of the history stack.
         */
        public static final int FLAG_ACTIVITY_SINGLE_TOP = 0x20000000;
    

    使用FLAG_ACTIVITY_SINGLE_TOP模式启动的Activity,效果与配置android:launchMode="singleTop"相同

        /**
         * If set, this activity will become the start of a new task on this
         * history stack.  A task (from the activity that started it to the
         * next task activity) defines an atomic group of activities that the
         * user can move to.  Tasks can be moved to the foreground and background;
         * all of the activities inside of a particular task always remain in
         * the same order.  See
         * <a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">Tasks and Back
         * Stack</a> for more information about tasks.
         *
         * <p>This flag is generally used by activities that want
         * to present a "launcher" style behavior: they give the user a list of
         * separate things that can be done, which otherwise run completely
         * independently of the activity launching them.
         *
         * <p>When using this flag, if a task is already running for the activity
         * you are now starting, then a new activity will not be started; instead,
         * the current task will simply be brought to the front of the screen with
         * the state it was last in.  See {@link #FLAG_ACTIVITY_MULTIPLE_TASK} for a flag
         * to disable this behavior.
         *
         * <p>This flag can not be used when the caller is requesting a result from
         * the activity being launched.
         */
        public static final int FLAG_ACTIVITY_NEW_TASK = 0x10000000;
    

    使用FLAG_ACTIVITY_NEW_TASK模式启动的Activity,会使用一个新的Task来启动一个Activity,且启动的每个Activity都在一个新的Task中

        /**
         * This flag is used to create a new task and launch an activity into it.
         * This flag is always paired with either {@link #FLAG_ACTIVITY_NEW_DOCUMENT}
         * or {@link #FLAG_ACTIVITY_NEW_TASK}. In both cases these flags alone would
         * search through existing tasks for ones matching this Intent. Only if no such
         * task is found would a new task be created. When paired with
         * FLAG_ACTIVITY_MULTIPLE_TASK both of these behaviors are modified to skip
         * the search for a matching task and unconditionally start a new task.
         *
         * <strong>When used with {@link #FLAG_ACTIVITY_NEW_TASK} do not use this
         * flag unless you are implementing your own
         * top-level application launcher.</strong>  Used in conjunction with
         * {@link #FLAG_ACTIVITY_NEW_TASK} to disable the
         * behavior of bringing an existing task to the foreground.  When set,
         * a new task is <em>always</em> started to host the Activity for the
         * Intent, regardless of whether there is already an existing task running
         * the same thing.
         *
         * <p><strong>Because the default system does not include graphical task management,
         * you should not use this flag unless you provide some way for a user to
         * return back to the tasks you have launched.</strong>
         *
         * See {@link #FLAG_ACTIVITY_NEW_DOCUMENT} for details of this flag's use for
         * creating new document tasks.
         *
         * <p>This flag is ignored if one of {@link #FLAG_ACTIVITY_NEW_TASK} or
         * {@link #FLAG_ACTIVITY_NEW_DOCUMENT} is not also set.
         *
         * <p>See
         * <a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">Tasks and Back
         * Stack</a> for more information about tasks.
         *
         * @see #FLAG_ACTIVITY_NEW_DOCUMENT
         * @see #FLAG_ACTIVITY_NEW_TASK
         */
        public static final int FLAG_ACTIVITY_MULTIPLE_TASK = 0x08000000;
    

    使用FLAG_ACTIVITY_MULTIPLE_TASK模式启动的Activity,会无条件的创建新的Task

        /**
         * If set, and the activity being launched is already running in the
         * current task, then instead of launching a new instance of that activity,
         * all of the other activities on top of it will be closed and this Intent
         * will be delivered to the (now on top) old activity as a new Intent.
         *
         * <p>For example, consider a task consisting of the activities: A, B, C, D.
         * If D calls startActivity() with an Intent that resolves to the component
         * of activity B, then C and D will be finished and B receive the given
         * Intent, resulting in the stack now being: A, B.
         *
         * <p>The currently running instance of activity B in the above example will
         * either receive the new intent you are starting here in its
         * onNewIntent() method, or be itself finished and restarted with the
         * new intent.  If it has declared its launch mode to be "multiple" (the
         * default) and you have not set {@link #FLAG_ACTIVITY_SINGLE_TOP} in
         * the same intent, then it will be finished and re-created; for all other
         * launch modes or if {@link #FLAG_ACTIVITY_SINGLE_TOP} is set then this
         * Intent will be delivered to the current instance's onNewIntent().
         *
         * <p>This launch mode can also be used to good effect in conjunction with
         * {@link #FLAG_ACTIVITY_NEW_TASK}: if used to start the root activity
         * of a task, it will bring any currently running instance of that task
         * to the foreground, and then clear it to its root state.  This is
         * especially useful, for example, when launching an activity from the
         * notification manager.
         *
         * <p>See
         * <a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">Tasks and Back
         * Stack</a> for more information about tasks.
         */
        public static final int FLAG_ACTIVITY_CLEAR_TOP = 0x04000000;
    

    使用FLAG_ACTIVITY_CLEAR_TOP模式启动的Activity,效果与配置android:launchMode=:"singleTask"相同

    相关文章

      网友评论

        本文标题:Android Activity启动模式和任务栈

        本文链接:https://www.haomeiwen.com/subject/ufrrzftx.html