浅谈Flag模式

来源:互联网 发布:罗盘软件 编辑:程序博客网 时间:2024/05/16 01:56

讲Flag之前,先有一个概念,taskAffinity(任务栈亲和力)。taskAffinity跟Flag是配合使用的。我们在manifest清单文件中给某些activity的标签设置上这个属性,后面跟的值是包名,那么就使得这些activity在同一个任务栈中(即taskID是相同的)。

1.FLAG_ACTIVITY_NEW_TASK模式(要求在不同应用中使用)

1.1概念:这个标志通常会启动一个新的任务栈task,但不是必须。如果存在一个任务栈task中的activity的affinity跟新的activity的affinity相同,那么这个新的activity就会加入到该task中。反之,如果不存在,就会创建一个新的任务栈。
1.2特点:系统默认所有的activity的affinity都相同(即在同一个任务栈中)。
1.3Demo示例:
1)在AActivity中通过intent意图一次性地分别启动BActivity,CActivity和DActivity。

Intent intent = new Intent(AActivity.this,BActivity.class);        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        startActivity(intent);        Intent intent1 = new Intent(AActivity.this,CActivity.class);        intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        startActivity(intent1);        Intent intent2 = new Intent(AActivity.this,DActivity.class);        intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        startActivity(intent2);

2)在manifest清单文件中给BActivity和CActivity设置taskAffinity,注意后面的包名。

<activity            android:name=".BActivity"            android:label="@string/title_activity_b"            android:taskAffinity="com.tao.demo1020_flagmode.friend">        </activity>

3)运行结果解析:BActivity和CActivity通过设置taskAffinity,使得它们在同一个任务栈中。这里需要注意一个细节,B,C,D事实上都设置了Flag,在A启动B时,因为B的taskAffinity跟A是不同的,所以此时会创建一个新的任务栈,而B就在这个新的任务栈中。接着再启动C,因为新的taskAffinity已经存在了,所以启动C时就不会再创建任务栈了,而是跟B同享任务栈。D跟A都是默认的模式,所以D跟A在同一个任务栈中。
4)注意:该模式一般不在自身app中使用,而是提供给第三方使用。比如微信的分享界面。

2.FLAG_ACTIVITY_CLEAR_TOP模式(要求在同一应用中使用)

这里就先不说概念。直接上Demo。
2.1 场景:AActivity,BActivity,CActivity,DActivity在同一应用中。
2.2 操作:AActivity启动BActivity,BActivity启动CActivity,CActivity启动DActivity(此时任务栈中的对象是ABCD)。然后,DActivity启动BActivity,注意在DActivity中给intent设置FLAG_ACTIVITY_CLEAR_TOP。
2.3 运行结果:DActivity启动BActivity后,发现C和D都从任务栈中移除了(此时任务栈中只有A和B)。这样的效果跟上文提到的SingleTask相似。
2.4 应用:可以用来做返回,做动态更新UI。在上述Demo中,可以在BActivity中使用onNewIntent(Intent intent),在此方法中更新UI界面。

3.FLAG_ACTIVITY_SINGLE_TOP模式

该模式等价于Activity启动模式中的SingleTop模式。
概念:如果当前栈顶的activity就是要启动的activity,那么则复用此activity。请参照上文的“独享堆栈栈顶模式”。

4.FLAG_ACTIVITY_BROUGHT_TO_FRONT模式(不同的应用)

4.1 场景:AActivity在名称为“TaskA应用”的应用中,CActivity和DActivity在名称为“TaskB应用”的应用中。
4.2 操作:在AActivity中启动CActivity,给intent设置FLAG_ACTIVITY_NEW_TASK。此时会开辟一个新的任务栈,我们把它叫做“TaskB”,然后我们在CActivity中启动DActivity。(此时任务栈TaskB中的对象有C和D)。接着我们点击Home键,重新选择AActivity。再次启动CActivity。(注意:AActivity中有两个点击事件启动CActivity)给第二次启动CActivity的intent设置FLAG_ACTIVITY_BROUGHT_TO_FRONT。这时TaskB被带到前台,TaskB中的对象只剩下C。

5.FLAG_ACTIVITY_MULTIPLE_TASK模式

该模式要与FLAG_ACTIVITY_NEW_TASK配合使用。
场景&操作:启动一个activity,为其intent设置FLAG_ACTIVITY_NEW_TASK,则会开辟一个新的任务堆栈。接着再启动同一个activity,为其intent设置FLAG_ACTIVITY_MULTIPLE_TASK,则又会创建一个新的任务栈。
(未完待续)

0 0
原创粉丝点击