通过launchMode设置的四种启动模式仅适用于Activity启动Activity,并且采用的都是默认Intent,没有额外添加任何Flag
Intent.FLAG_ACTIVITY_NEW_TASK:是启动模式中最关键的一个Flag
对于非Activity启动的Activity(比如Service或者通知中启动的Activity)需要显式的设置Intent.FLAG_ACTIVITY_NEW_TASK。singleTask和singleInstance在AMS中被预处理后,自动设置了Intent.FLAG_ACTIVITY_NEW_TASK,standard和singleTop不会自动设置Intent.FLAG_ACTIVITY_NEW_TASK。
Intent.FLAG_ACTIVITY_NEW_TASK这个属性更多的关注点是在Task,可以认为没有设置Intent.FLAG_ACTIVITY_NEW_TASK的情况下,taskAffinity可以不考虑,Intent.FLAG_ACTIVITY_NEW_TASK的初衷是在Activity目标taskAffinity的Task中启动。
如果找不到目标Task自然会启动Task,如果目标Task栈根Activity的Intent同新的将要启动的Activity相同,就不启动新Activity,否则启动Activity
Intent.FLAG_ACTIVITY_NEW_TASKIntent.FLAG_ACTIVITY_CLEAR_TASK:必须配合FLAG_ACTIVITY_NEW_TASK使用
如果目标Task已存在,将清空已存在的目标Task,否则,新建一个Task,之后,新建一个Activity作为根Activity。Intent.FLAG_ACTIVITY_CLEAR_TASK的优先级最高,基本可以无视所有的配置,包括启动模式及Intent Flag,哪怕是singleInstance也会被finish,并重建
Intent.FLAG_ACTIVITY_CLEAR_TASKIntent.FLAG_ACTIVITY_CLEAR_TOP
单独使用Intent.FLAG_ACTIVITY_CLEAR_TOP,如果同一个栈中原来已有
Intent.FLAG_ACTIVITY_CLEAR_TOP如果没有则创建,不会去另一个栈中寻找
如果同时设置了Intent.FLAG_ACTIVITY_SINGLE_TOP,在当前栈已有的情况下就不会重建,而是直接回调onNewIntent方法
同时设置了Intent.FLAG_ACTIVITY_SINGLE_TOP如果同时设置了Intent.FLAG_ACTIVITY_NEW_TASK,目标是Activity设定的Task栈,如果在这个Task中能找到一个Activity实例,则将其上面的自身处理掉,之后重建
同时设置了Intent.FLAG_ACTIVITY_NEW_TASK如果同时再加上Intent.FLAG_ACTIVITY_SINGLE_TOP,此时判断topActivity(当前最顶部Task的栈顶)是不是目标Activity,如果不是就会去目标Task中去找,并唤起
再加上Intent.FLAG_ACTIVITY_SINGLE_TOP如果topActivity是目标Activity,就直接回调topActivity的onNewIntent方法,无论topActivity是不是在目标Task中
topActivity是目标ActivityIntent.FLAG_ACTIVITY_SINGLE_TOP
同launchMode中的singleTop,这里所指的栈顶是最顶部的Task的栈顶
网友评论