什么时候需要在 android 小部件或应用程序中使用 singleTop launchMode?

Posted

技术标签:

【中文标题】什么时候需要在 android 小部件或应用程序中使用 singleTop launchMode?【英文标题】:When is it necessary to use singleTop launchMode in an android widget or application? 【发布时间】:2011-03-17 04:28:34 【问题描述】:

我刚刚被一个小部件烫伤了。我可以看到问题的原因,但我无法确定原因或解决方案。我的小部件正在发出搜索 (SearchManager) 并且活动启动了一个搜索对话框,但是当它回调我的小部件时,它创建了对小部件的另一个引用(即,线程 ID 相同,但小部件 ID从 65 更改为 0)。

这让我相信正在创建一个新实例,我在文档中搜索了适用于该问题的设置。最终,我偶然发现了android:launchMode="singleTop",当我将它设置在 AndroidManifest 中时,中提琴!我的小部件工作正常。

这花了我两天的时间来调试。

还有其他情况,或者我的问题是否有技术上更正确的答案?

【问题讨论】:

我认为问题标题对内容没有用处。我希望看到有关 singleTop 的适当用例的问题和答案。这是一些开发叙述,然后是文档中的引用。 @Lot105 - 很公平。继续并添加一些答案。这是我遇到的一个大问题,所以我按照 SO 的建议做了“提问并回答你自己的问题”。我确信你的回答贡献和其他人会改善这个问答。它的浏览量已超过 3000 次,因此显然引起了人们的兴趣。我怀疑我的答案是 ONLY 答案:) 当然,它是文档的参考和引用,因为这是我得到答案的地方。就个人而言,我发现这种风格问题/答案的真正价值在于它阐明了 DOC。 我应该更清楚。问题主体和答案本身绝对有用且有趣。 【参考方案1】:

我在 Android Docs 中做了更多的阅读——我可以花一辈子的时间阅读他们的文档,并找到一个让我脑洞大开的新细节 :) 这解释了我没有预料到的多个实例,但是,我配置为发生.

Android Doc on Activity definition for AndroidManifest.xml

“标准”和“单顶”模式 仅在一个方面彼此不同 尊重:每次都有新的意图 对于“标准”活动,新的 类的实例被创建为 回应这个意图。每个实例 处理单一意图。同样,一个 “singleTop”活动的新实例 也可以创建来处理一个新的 意图。但是,如果目标任务 已经有一个现有的实例 位于其堆栈顶部的活动, 该实例将收到新的 意图(在 onNewIntent() 调用中);一种 未创建新实例。其他 情况——例如,如果一个 “singleTop”的现有实例 活动在目标任务中,但是 不在堆栈的顶部,或者如果 它在堆栈的顶部,但不在 目标任务——一个新的实例将 被创建并压入堆栈。

【讨论】:

"或者如果它在堆栈的顶部,但不在目标任务中 - 将创建一个新实例并将其推送到堆栈上。"为什么?有人可以进一步解释这个引用的部分吗? @Patrick 我相信这种情况是当您使用 FLAG_ACTIVITY_NEW_TASK 时。在这种情况下,您不关心现有任务,并且正在创建一个新任务,因此您的活动成为新任务中的唯一一个。如果我错了,请纠正我。 @Gokhan Arik 我不认为这是正确的。这是 FLAG_ACTIVITY_NEW_TASK 的文档:“使用此标志时,如果您现在正在启动的 Activity 的任务已经在运行,则不会启动新的 Activity;相反,当前任务将简单地被带到前面屏幕上的状态。有关禁用此行为的标志,请参见 FLAG_ACTIVITY_MULTIPLE_TASK。因此,您会看到 FLAG_ACTIVITY_NEW_TASK 不一定会创建新任务 - 仅在必要时。否则,它会重用现有任务。

以上是关于什么时候需要在 android 小部件或应用程序中使用 singleTop launchMode?的主要内容,如果未能解决你的问题,请参考以下文章

Android开发中实现桌面小部件

为啥我的应用小部件没有在 API 3 或 4 中更新?

重启或升级应用程序后,我的 Android 小部件停止更新

在颤动中,我可以使用Android或iOS小部件,就像反应原生一样

Android桌面小部件AppWidget开发

为Android中的小部件启用小部件设置按钮?