实例讲解launchMode的启动模式和intent的Flag

实例1(极光推送的Service处理类跳转到XXXActivity):

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);

实例2(LoginActivity跳转到MainActivity):

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

实例3(调用第三方app):

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACITIVTY_CLEAR_TASK);

实例4(XXXActivity跳转到MainActivity):

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP| Intent.FLAG_ACTIVITY_CLEAR_TOP);
Flag一般是组合使用:
1、FLAG_ACTIVITY_NEW_TASK和FLAG_ACITIVTY_CLEAR_TOP
效果:如果栈中存在该Activity,那么则将要跳转的Activity及其之上的Actviity全部清除,然后将创建要跳转的Activity放入栈中。因为跳转的Activity是重新创建的,所以不会走onNewIntent方法。
2、FLAG_ACTIVITY_NEW_TASK和FLAG_ACITIVTY_CLEAR_TASK
效果:跳转Activity所在的任务栈中所有Activity全部清除,然后创建要跳转的Activity并放入栈中。例如:调起第三方的app,使得第三方的app从launcher页面重新打开(就像杀掉app,重新进来app一样)。
3、FLAG_ACTIVITY_SINGLE_TOP和FLAG_ACTIVITY_CLEAR_TOP
效果:如果跳转Activity所在的任务栈中存在该Activity,那么将该Activity以上的Activity全部清除,然后调用跳转Activity的onNewIntent()方法。
4、Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP
效果:如果栈顶存在将要跳转的Activity,调用onNewIntent,不存在的话,在栈顶重建。

任务栈id:int TaskId = mActivity.getTaskId();

launchMode的启动模式:

1、standard:默认模式,出栈规则是后进先出,每次创建新的实例。默认只在当前task启动
2、singletop:默认只在当前task启动
栈顶复用模式
当当前task的栈顶的已经有一个相同的Activity在栈顶了,则不会创建新的activity,而是会调用栈顶activity的onNewIntent()方法;栈顶不存在相同Activity时,会新建一个activity实例放到栈顶。
3、singleTask:
默认可以在其他task启动,根据taskAffinity具体分析。
当当前task中已经存在一个相同的Activity时,会将task中位于该Activity实例上方的activity出栈直到该Activity实例位于栈顶。对一个singleTask的Activity类,该task中只会存在一个实例。
注:(FLAG_ACTIVITY_NEW_TASK | FLAG_ACITIVTY_CLEAR_TOP)的组合使用能让普通的Activity以singleTask模式启动,这是错误的。普通的Activity以singleTask模式启动需要使用(FLAG_ACTIVITY_SINGLE_TOP | FLAG_ACITIVTY_CLEAR_TOP)。
注:singleTask的使用。当Task中存在Activity实例,不会创建Activity,而是销毁Activity上面所有其他的Activity,以此来使将要跳转的Activity至于栈顶显示,如果不存在,则在栈顶创建一个Activity实例(所以假如有人问如何快速关闭100个Activity,只要给跳转的Activity设置singleTask即可)。单独的使用singleTask,并不会创建一个新的Task。singleTask的Activity如果设置了独立的taskAffinity属性值,启动时就会在新的Task中,否则会在已有Task中。所以基于以上特性,比较适合主架构Activity(例MainActivity)设置为singleTask,或者一些经常使用,但是关闭和跳转不规律的Activity。
4、singleInstance:独享task
默认新建task,并独占该task。singleInstance的Activity中启动的task会在其他task,系统中同样只会存在一个实例。

intent的Flag:

常用的四种flag:
1、FLAG_ACTIVITY_NEW_TASK :activity具有了在其他task启动的能力。注意一点:在非Activity中使用context.startActivity()的时候,需要在Intent中设置FLAG_ACTIVITY_NEW_TASK,否则会报错。FLAG_ACTIVITY_NEW_TASK不等于Activity指定了singleTask模式。
2、FLAG_ACTIVITY_SINGLE_TOP:效果和launchMode的singletop类似。 如果设置,当这个Activity位于历史stack的顶端运行时,不再启动一个新的。
3、FLAG_ACTIVITY_CLEAR_TOP:效果和launchMode的singleTask相同是错误的说法, (FLAG_ACTIVITY_SINGLE_TOP | FLAG_ACITIVTY_CLEAR_TOP)才相当于SingleTask。 FLAG_ACTIVITY_CLEAR_TOP不会走onNewIntent(),是关闭重建activity。
4、FLAG_ACTIVITY_CLEAR_TASK:这个flag会在启动这个activity之前,清理掉与这个activity相关的任何任务.也就是说,这个activity会在其他空任务中的成为新根activity,且任何旧的activity会被销毁. 注意,这个flag只能和FLAG_ACTIVITY_NEW_TASK结合使用。

参考文章:https://www.jianshu.com/p/44d2f057dd5f
https://blog.csdn.net/singwhatiwanna/article/details/9294285
https://www.jianshu.com/p/f32b40db6141

发布了38 篇原创文章 · 获赞 11 · 访问量 8818

猜你喜欢

转载自blog.csdn.net/u013750244/article/details/98634622