Android 开发必备!10 个 LaunchMode 问题,面试轻松通关
2023-05-10 18:46:07
Android 开发人员的 LaunchMode 大全
什么是 LaunchMode?
LaunchMode 是 Android 系统中一个决定 Activity 启动方式的重要概念。它规定了当用户采取某种操作(例如点击图标)时,Activity 如何被创建和显示。
LaunchMode 的值
LaunchMode 有以下几个值:
- standard: 标准模式,每次启动 Activity 都会创建一个新的实例。
- singleTop: 栈顶复用模式,如果要启动的 Activity 已经在栈顶,则复用该实例,否则创建新的实例。
- singleTask: 栈内复用模式,如果要启动的 Activity 已经在栈内,则复用该实例,否则创建一个新的实例,并将其置于栈顶。
- singleInstance: 单例模式,无论要启动的 Activity 是否已经存在,都创建一个新的实例,并将其置于栈顶。
任务栈
任务栈是 Android 系统管理 Activity 的一种方式。每个任务栈都有一个根 Activity,其他 Activity 都以此为根,依次入栈。用户可以有多个任务栈,每个任务栈都代表一个独立的任务。
LaunchMode 如何影响 Activity 的启动方式
LaunchMode 决定了 Activity 在不同情况下的启动方式。例如:
- 当用户点击一个图标时,如果 Activity 的 LaunchMode 为 standard,系统会创建一个新的 Activity 实例;如果 LaunchMode 为 singleTop,系统会检查栈顶 Activity 是否与此 Activity 相同,如果是,则复用该实例,否则创建一个新的实例。
- 当 Activity 从另一个 Activity 通过 Intent 启动时,如果 LaunchMode 为 singleTask,系统会检查该 Activity 是否已经在栈内,如果是,则复用该实例,否则创建一个新的实例并置于栈顶。
任务亲和性
任务亲和性是 Android 系统分配 Activity 到任务栈的一种策略。每个 Activity 都可以指定一个任务亲和性,系统会根据这个亲和性来决定将 Activity 分配到哪个任务栈。
Intent 过滤器
Intent 过滤器是一种声明,用于指定 Activity 可以响应哪些 Intent。当系统收到一个 Intent 时,会根据 Intent 过滤器来决定将 Intent 转发给哪个 Activity。
隐式 Intent
隐式 Intent 是不指定具体 Activity 的 Intent。当系统收到一个隐式 Intent 时,会根据 Intent 过滤器来决定将 Intent 转发给哪个 Activity。
显式 Intent
显式 Intent 是指定具体 Activity 的 Intent。当系统收到一个显式 Intent 时,会直接将 Intent 转发给指定的 Activity。
PendingIntent
PendingIntent 是一个可以延迟执行的 Intent。它可以存储在一个 Bundle 中,并在以后某个时间点执行。
ActivityFlags
ActivityFlags 是一个包含标志位的集合,用于指定 Activity 的启动方式。这些标志位可以控制 Activity 是否需要任务栈、是否可以复用实例等。
TaskAffinity
TaskAffinity 是一个字符串,用于指定 Activity 的任务亲和性。每个 Activity 都可以指定一个 TaskAffinity,系统会根据这个 TaskAffinity 来决定将 Activity 分配到哪个任务栈。
结论
LaunchMode 是 Android 开发人员必须掌握的一个概念。它决定了 Activity 在不同情况下的启动方式,从而影响应用程序的整体行为。深入理解 LaunchMode 不仅有助于你顺利通过面试,更重要的是,可以让你成为一名更优秀的开发人员。
常见问题解答
-
如何设置 Activity 的 LaunchMode?
<activity android:name=".MainActivity" android:launchMode="singleTask" />
-
如何创建显式 Intent?
Intent intent = new Intent(this, MainActivity.class);
-
如何创建隐式 Intent?
Intent intent = new Intent(Intent.ACTION_VIEW);
-
如何检查 Activity 是否已经在栈内?
if (isTaskRoot()) { // Activity 已经在栈内 }
-
如何获取当前 Activity 所属的任务栈?
TaskStack taskStack = getTask();