返回

震惊!原来 Android 启动模式没我想的那么简单

Android

作为一个混迹 Android 江湖多年的老司机,我自以为对 Android 的四大启动模式了如指掌,直到有一天,一个看似简单的问题却把我问住了。

那天,一位小伙伴私信我,提出了一个问题,乍一看很简单,但仔细一琢磨,我竟然答不上来。问题是这样的:

如果一个 Activity A 在任务栈中,然后通过 Intent 启动了一个 Activity B,并且 B 的启动模式是 singleTask,那么当 B 退出后,A 会不会被销毁?

当时我信誓旦旦地回答:“不会!”然而,小伙伴接下来的一句话却让我大跌眼镜:

我测试了一下,发现 A 竟然被销毁了!

我一脸懵逼,赶紧自己也试了一下,结果和小伙伴说的一样,A 确实被销毁了。这让我大为震惊,因为在我的认知里,singleTask 启动模式下,如果任务栈中已经存在一个符合 Intent Filter 的 Activity,那么就会复用该 Activity,而不会创建新的 Activity。

经过一番深入探究,我才恍然大悟,原来我对 singleTask 启动模式的理解还存在盲区。为了避免更多的小伙伴踩坑,我决定好好剖析一下 Android 的四大启动模式,并结合小伙伴提出的案例,深入理解启动模式的实际应用。

Android 四大启动模式

Android 提供了四种启动模式,分别为:

  • standard: 这是默认的启动模式,每次启动一个 Activity 都会创建一个新的任务栈。
  • singleTop: 如果任务栈顶部的 Activity 符合 Intent Filter,则复用该 Activity,否则创建新的 Activity。
  • singleTask: 如果任务栈中已经存在一个符合 Intent Filter 的 Activity,则复用该 Activity 并将其置于栈顶,否则创建新的 Activity。
  • singleInstance: 与 singleTask 类似,但更加严格,任务栈中只能存在一个符合 Intent Filter 的 Activity,如果不存在则创建新的 Activity,如果存在则复用该 Activity 并将其置于栈顶。

案例分析

我们回到小伙伴提出的案例:

  1. 首先,Activity A 在任务栈中。
  2. 通过 Intent 启动 Activity B,并且 B 的启动模式是 singleTask。
  3. 当 B 退出后,A 被销毁了。

根据 singleTask 的定义,我们本以为 B 会复用 A,而不会销毁 A。然而,事实却并非如此。这是因为,在 Android 中,任务栈和 Activity 之间存在着松散的耦合关系。当一个 Activity 退出时,它不会自动将其任务栈中的其他 Activity 销毁。

在这个案例中,当 B 退出时,它只是从任务栈中移除了自己,而任务栈中仍然存在 A。因此,当用户再次按下返回键时,就会销毁 A。

避免常见坑

为了避免在使用启动模式时踩坑,我们需要牢记以下几个要点:

  • 启动模式只影响 Activity 的创建和销毁,不影响 Task 的创建和销毁。
  • 如果一个 Activity 的启动模式是 singleTask 或 singleInstance,那么它只能存在于一个任务栈中。
  • 如果一个 Task 中存在多个 Activity,那么销毁该 Task 中的最后一个 Activity 不会销毁 Task 本身。

结语

通过对 Android 启动模式的深入理解,我们可以避免在开发过程中遇到一些常见的问题。熟练掌握启动模式的应用,可以帮助我们设计出更加健壮、用户体验更好的 Android 应用。