Android | launchMode启动模式详解

💡 原文中文,约6000字,阅读约需15分钟。
📝

内容提要

本文讨论了Android中Activity的任务栈和启动模式,包括任务栈的管理和启动模式的五种类型。还介绍了任务栈亲和性的修改和常用的Intent.FLAG标志位。最后提到了FLAG_ACTIVITY_REORDER_TO_FRONT和FLAG_ACTIVITY_CLEAR_TASK标志位的使用。

🔎

延伸解读

静态配置与动态标志的优先级

文章指出,当在manifest中设置的Activity任务行为与Intent.FLAG标志不一致时,Intent标志的优先级更高。这意味着在启动Activity时,动态设置的标志会覆盖静态配置。开发者在调试任务栈行为时,应优先检查启动Intent中是否携带了相关标志,避免因优先级问题导致预期外的任务栈变化。

taskAffinity生效的条件

单独设置taskAffinity并不能改变Activity的亲和性,文章通过实验证明,必须结合singleTask、singleInstance等启动模式,或配合FLAG_ACTIVITY_NEW_TASK标志,才能让Activity进入新的任务栈。因此,若想实现Activity的独立任务栈,需同时配置taskAffinity和相应的启动模式或标志。

FLAG_ACTIVITY_CLEAR_TOP与singleTask的等效性

文章通过实验对比发现,FLAG_ACTIVITY_CLEAR_TOP单独使用会销毁目标Activity及其之上的所有Activity并重新创建目标Activity;而结合FLAG_ACTIVITY_SINGLE_TOP使用时,则不会重新创建,而是调用onNewIntent()。这一组合的效果与launchMode中的singleTask相同,为动态控制任务栈提供了灵活选择。

FLAG_ACTIVITY_REORDER_TO_FRONT的注意事项

FLAG_ACTIVITY_REORDER_TO_FRONT会将已存在的Activity重新调到栈顶,并调用其onNewIntent()方法,但不会销毁其他Activity。需要注意的是,如果Intent中同时指定了FLAG_ACTIVITY_CLEAR_TOP,则REORDER_TO_FRONT标志会被忽略。开发者在使用时需避免标志冲突,以确保达到预期的任务栈调整效果。

❓

Q&A

Android中的launchMode有哪些类型?

Android中的launchMode有五种类型:standard、singleTop、singleTask、singleInstance和singleInstancePerTask。

如何通过manifest文件设置Activity的任务栈行为?

可以通过manifest文件中的<activity>标签配置launchMode、taskAffinity、allowTaskReparenting等属性来设置任务栈行为。

FLAG_ACTIVITY_NEW_TASK标志位的作用是什么?

FLAG_ACTIVITY_NEW_TASK标志位用于在新任务栈中启动Activity,通常与taskAffinity结合使用。

什么是taskAffinity,它的作用是什么?

taskAffinity用于修改Activity之间的亲和性,决定它们属于哪个任务栈,默认情况下同一应用中的所有Activity具有相同的亲和性。

如何使用FLAG_ACTIVITY_CLEAR_TOP标志位?

FLAG_ACTIVITY_CLEAR_TOP会销毁目标Activity及其上面的所有Activity,并重新创建目标Activity,常用于返回到某个Activity时清理栈。

allowTaskReparenting属性的作用是什么?

allowTaskReparenting属性允许Activity在特定条件下从一个任务栈移动到另一个任务栈,前提是目标任务栈在前台。

🏷️

标签

➡️

继续阅读