Activity启动模式设置方法:
在AndroidManifest.xml文件<activity>节点中设置android:launchMode属性
Activity的启动模式有4种,分别为standard、singleTop、singleTask、singleInstance;
standard 默认值,标准的,特点是:启动一个Activity就进栈一个Activity
singleTop 独占顶端,特点是Activity在顶端的时候,启动Activity会自动重用Activity,不会进栈,只有在顶端才会被重用
singleTask 单任务,特点是单任务,同一个栈不会有两个Activity引用,Activity一旦进栈 就不会再次进栈了
singleInstance 单实例,特点就是:单独开启一个任务栈,再次启动Activity的时候都会重用
Intent Flag相关
FLAG_ACTIVITY_BROUGHT_TO_FRONT
当launchMode为singleTask时系统会默认设置这个标志。
FLAG_ACTIVITY_CLEAR_TASK 清空任务标志
如果Intent中设置了这个标志,会导致含有待启动Activity的Task在Activity被启动前清空。这个Activity会成为一个新的root,并且所有任务栈内旧的activity都被finish掉,这个标志只能与FLAG_ACTIVITY_NEW_TASK 一起使用。
FLAG_ACTIVITY_CLEAR_TOP 清空任务中在其之上的Activity
如果设置了这个标志,并且待启动的Activity已经存在于当前的task中,那就不会再给这个activity新起一个实例,而是将task中在它之上的其它activity全部关闭,然后把Intent作为一个新的Intent传给这个Activity(当前已在栈顶)。
FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 任务重置时将任务中在此标记之后的Activity清空
设置这个标志在activity栈中做一个标记,在Task重置的时候栈就把从标记往上的activity都清除。也就是说,下次这个Task被通过FLAG_ACTIVITY_RESET_TASK_IF_NEEDED调到前台时(通常是由于用户从桌面重新启动),这个activity和它之上的activity都会被finish掉,这样用户就不会再回到他们,而是直接回到在它们之前的activity。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 不显示在近期任务中
如果设置这个标志,这个Activity就不会在近期任务中显示。
FLAG_ACTIVITY_FORWARD_RESULT 转发结果
如果Activity A 在启动 Activity B时设置了这个标志,那A的答复目标目标会传递给B,这样一来B就可以通过调用setResult(int) 将返回结果返回给A的答复目标。
注意:这个标志不能与startActivityForResult()一起使用。
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY 从近期任务中启动的标志
这个标志通常情况下不会通过应用的代码来设置,而是在通过最近任务启动activity时由系统设置的。
FLAG_ACTIVITY_MULTIPLE_TASK Activity可在多任务运行的标志
除非你实现了自己的顶级应用启动器,否则不要使用这个标志。与 FLAG_ACTIVITY_NEW_TASK 一起使用可以不再把已存在的任务唤起到前台。 当被设置时,系统总会为Intent的Activity启动一个新的task,而不管是否已经有已存在的任务在做同样的事情。
因为默认系统不包含图形化的任务管理功能,所以除非你给用户提供了返回到已启动任务的方法,否则就不要用这个标志。
如果FLAG_ACTIVITY_NEW_TASK没有设置,则这个标志也被忽略。
FLAG_ACTIVITY_NEW_TASK 尝试在新任务中启动Activity的标志
设置这个标志可以为待启动的Activity创建一个新的任务。一个任务(从启动它的Activity到任务中的下一个Activity)就是用户可以跳转到的Activity的原子群。任务可以在前台与后台之间切换;在某一特定任务之中的所有Activity一直会保持同样的顺序。
这个标志通常被用来呈现一种"laucher"类型的行为:为用户提供一个可单独解决的事情列表,完全独立于启动他们的Activity之外运行。
使用这个标志时,如果有一个任务已经运行了你要启动的Activity,那就不会在创建新的Activity,而是将现有的任务保持之前的状态直接唤到前台。参见FLAG_ACTIVITY_MULTIPLE_TASK这个标志,可以禁用掉这个行为。
这个标志不能在调用者向待启动Activity请求返回结果时使用。
注意:假设A启动B,如果要让B在新的task中创建,要求这两个Activity的taskAffinity不同。也就是说,设置了这个标志后,新启动的activity并非就一定在新的task中创建,如果A和B在属于同一个package,而且都是使用默认的taskAffinity,那B还是会在A的task中被创建。 所以,只有A和B的taskAffinity不同时,设置了这个标志才会使B被创建到新的task。
FLAG_ACTIVITY_NO_ANIMATION 禁用切换动画
禁用掉系统默认的Activity切换动画。
FLAG_ACTIVITY_NO_HISTORY 不保存Activity的历史状态
如果设置这个标志,新的Activity就不会在历史栈中保存。用户一旦离开,这个Activity就会finish掉。也可以使用noHistory属性设置。
FLAG_ACTIVITY_NO_USER_ACTION 不响应onUserLeaveHint方法
如果设置了这个标志,可以在避免用户离开当前Activity时回调到 onUserLeaveHint(). 通常,Activity可以通过这个回调表明有明确的用户行为将当前activity切出前台。 这个回调标记了activity生命周期中的一个恰当的点,可以用来“在用户看过通知之后”将它们清除,如闪烁LED灯。
如果Activity是由非用户驱动的事件(如电话呼入或闹钟响铃)启动的,那这个标志就应该被传入Context.startActivity,以确保被打断的activity不会认为用户已经看过了通知。
FLAG_ACTIVITY_PREVIOUS_IS_TOP
如果启动Activity时设置了这个标志,那当前这个 Activity 不会被当作顶部的 Activity 来判断是否之后新Intent应该被传给栈顶Activity而不是启动一个新的Activity。之前一个的Activity会被当作栈顶,假定当前的Acitvity会立即自己finish掉。
我们经常与FLAG_ACTIVITY_FORWARD_RESULT 一起使用。
FLAG_ACTIVITY_REORDER_TO_FRONT 任务中的Activity顺序重排
如果设置了这个标志,而且被启动的Activity如果已经在运行,那这个Activity会被调到栈顶。
如果使用了标志 FLAG_ACTIVITY_CLEAR_TOP,那这个FLAG_ACTIVITY_REORDER_TO_FRONT标志会被忽略。
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
如果已设置,并且此活动正在新任务中启动,或者正在将现有任务置于首位,则它将作为任务的前门启动。这将导致应用使该任务处于正确状态所需的任何亲缘关系(将活动移动到该任务或从该任务移出),或者在需要时简单地将该任务重置为其初始状态。
FLAG_ACTIVITY_SINGLE_TOP 不会被再次启动
设置这个标志之后,如果被启动的Activity已经在栈顶,那它就不会被再次启动。
FLAG_ACTIVITY_TASK_ON_HOME 直接返回桌面
这个标志可以将一个新启动的任务置于当前的home任务(home activity task)之上(如果有的话)。也就是说,在任务中按back键总是会回到home界面,而不是回到他们之前看到的activity。这个标志只能与FLAG_ACTIVITY_NEW_TASK标志一起用。
FLAG_DEBUG_LOG_RESOLUTION 打开Activity解析的Log开关
可以用来启用调试的标志:设置以后,在intent的处理过程中log信息会打印出来,可以看到都找到了些什么来创建最终的解析列表。
FLAG_EXCLUDE_STOPPED_PACKAGES 排除已停止的包
设置之后,Intent就不会再匹配那些当前被停止的包里的组件。如果没有设置,默认的匹配行为会包含这些被停止的包。
FLAG_FROM_BACKGROUND 后台启动Activity
可以给调用者用来标识这个Intent是来自后台操作,而不是用户的交互行为。
FLAG_GRANT_READ_URI_PERMISSION 给Activity授权
如果设置,Intent的接收者会被授予读权限,用来读取Intent中包含的或是在ClipData中指定的Uri。当被用于Intent中的ClipData时,被授予的是Intent中其它ClipData中的所有Uri和它们递归遍历到的Uri的读权限。只有顶级Intent中的授予标志会被使用。
FLAG_INCLUDE_STOPPED_PACKAGES 包含已停止的包
设置之后Intent总是会去匹配那些已被停止的包里的组件。如果没有设置 FLAG_EXCLUDE_STOPPED_PACKAGES 标志,那这个就是默认行为。如果两个标志都被设置,那这个会生效(在框架中一些地方可能会自动设置exclude标志,这些标志可以被覆盖掉)。
FLAG_RECEIVER_FOREGROUND 接受器以前台优先级运行
当发送广播的时候设置了这个标志,会允许接收者以前台的优先级运行,有更短的时间间隔。正常广播的接受者是后台优先级,不会被自动提升。
FLAG_RECEIVER_REGISTERED_ONLY 只调用手动注册的接收器
如果发送广播时设置了这个标志,那只会调用注册了的接收器BroadcastReceiver组件不会被启动。
FLAG_RECEIVER_REPLACE_PENDING 替换掉等待中的广播
如果设置,发送广播时,新的广播将被替换

本文详细介绍了Android中Activity的四种启动模式(standard、singleTop、singleTask、singleInstance)及其特点,以及Intent Flag的各种用法,包括FLAG_ACTIVITY_BROUGHT_TO_FRONT、FLAG_ACTIVITY_CLEAR_TASK等,解释了如何通过设置这些标志来控制Activity的启动和任务栈管理。此外,还讲解了FLAG_ACTIVITY_FORWARD_RESULT、FLAG_ACTIVITY_NO_HISTORY等特殊标志的作用。
960

被折叠的 条评论
为什么被折叠?



