【问题标题】:About android launchmode "singleTask"关于android启动模式“singleTask”
【发布时间】:2012-07-26 11:19:05
【问题描述】:

我阅读了 android 开发者指南和互联网上的一些文章,我仍然对 singleTask launchmode 感到困惑。举个例子:

用户启动 App1,android 启动一个新任务。假设 App1 按以下顺序创建活动:

ActivityA -> ActivityB -> ActivityC

这就是 task1 的样子。

然后用户点击主页按钮并选择启动App2,因此task1进入后台,android启动一个新任务:task2,用户做某事:

ActivityD -> ActivityE

现在假设 ActivityE 尝试启动 ActivityB ,而 ActivityB 具有启动模式 singleTask

我的理解是 task1 再次进入前端,而 task2 进入后台。 task1 现在看起来像这样:

ActivityA -> ActivityB

这意味着:

  1. ActivityC 将从 task1 中删除,而 ActivityB 将成为顶部 Activity。

  2. 如果用户现在点击“返回”按钮,他将来到task1的ActivityA,而不是回到task2的ActivityE

我说的对吗?

谢谢

【问题讨论】:

    标签: android android-activity launchmode


    【解决方案1】:

    你说得对。

    你为什么不测试一下。

    还有这个应用可以帮助解释启动模式:

    https://play.google.com/store/apps/details?id=com.novoda.demos.activitylaunchmode

    来源在https://github.com/gnorsilva/Activities-LaunchMode-demo

    【讨论】:

    • 谢谢,但让我困惑的是这个文档:developer.android.com/guide/topics/manifest/… 它说:相比之下,“singleTask”和“singleInstance”活动只能开始一个任务。它们始终位于活动堆栈的根部。
    • demo中有一个错误。当你启动一个languch-mode为'singleTask'的新activity时,这个activity总是会在一个新的task中创建。但实际上,它只会被创建如果您为活动设置 taskAffinity,则在新任务中。
    【解决方案2】:
    The ActivityC will be removed from task1 and ActivityB becomes the top Activity.
    

    是的,你是对的……

    ActivityC 将是 removed,即 ActivityC 的 onDestroy 方法将被调用。因此,当用户再次启动任务 1 时,会显示 ActivityB 而不是 ActivityC。

    已创建 2 个任务(项目)并上传了相同的 @SendSpace。试试看……

    如果你看 androids documentation 它会说

    ” “singleTask”活动允许其他活动成为其任务的一部分。它始终位于其任务的根部,但其他活动(必须是“标准”和“singleTop”活动)可以在其中启动任务。”

    这意味着当您单击主页按钮时,单任务活动(在您的情况下为 ActivityB)之上的所有活动都将从堆栈中删除。

    在示例中,如果您只是运行项目“AndroidTest”并单击日志中的主页按钮,那么在我之前为您提供的应用程序中,您可以看到第二个 Activity 处于暂停状态,当您再次启动它时“最近的应用程序”列表中的第二个 Activity 已被销毁。

    在单实例活动(ActivityB)之上的 Activity 没有从 Back Stack 中移除的情况下,并且另一个应用程序请求此 Activity(ActivityB),它可能不会显示并且可能会丢弃 Intent。但这发生的机会极少,因为用户必须按下 Home 按钮,但在 BackStack 中的当前 Task\App 才能导航到另一个 Task\App。

    因此警告

    其他模式(singleTask 和 singleInstance)不适用于大多数应用程序,因为它们会导致用户可能不熟悉的交互模型,并且与大多数其他应用程序非常不同。 em>

    我希望这能解决你的疑惑。

    【讨论】:

    • 谢谢,但这篇文章中的答案让我感到困惑:stackoverflow.com/questions/3219726/… "singleTask" 或 "singleInstance" 活动的实例永远不会超过一个,因此该实例有望处理所有新意图...但是,“singleTask”活动在堆栈中可能有也可能没有其他活动。如果是这样,它就无法处理该意图,并且该意图被丢弃。 (即使意图被丢弃,它的到来也会导致任务来到前台,它会保留在那里。)
    • “这意味着当您单击主页按钮时,单个任务活动(在您的情况下是 ActivityB)之上的所有活动都将从堆栈中删除。”刚刚在一个项目中发现,是这样的。谢谢。
    • “Sendspace”链接已损坏
    • "其他模式 — singleTask..."? “singleTask”是“singleTask”之外的另一种模式?这里一定有问题……
    • 我刚刚创建了一个应用演示来测试语句“这意味着当您单击主页按钮时,单个任务活动(在您的情况下是 ActivityB)之上的所有活动都将从堆栈中删除。”但是与答案相反,单任务活动以上的活动仍然留在记忆中
    【解决方案3】:

    正确,每当 singleTask 活动启动时,它都会在前台清除当前存在于其上方的所有活动,如果您的 singleTask 活动在顶部,则其行为与 singleTop 相同。

    P.S - onCreate 不是第二次调用,而是调用 onNewIntent。

    检查这个链接,很好地解释了启动模式。 https://medium.com/android-news/android-activity-launch-mode-e0df1aa72242

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 2021-10-30
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多