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

问题描述 投票:0回答:2

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

这让我相信正在创建一个新实例,并且我在文档中搜索了适用于该问题的设置。最终,我偶然发现了

android:launchMode="singleTop"
,当我将它设置到 AndroidManifest 中时,中提琴!我的小部件工作了。

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

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

android android-widget android-searchmanager
2个回答
60
投票

我在 Android Docs 中做了更多阅读——我可以花一辈子的时间阅读他们的文档,并找到一个让我大吃一惊的新的微妙细节:)这解释了我没想到的多个实例,但是,我配置了发生。

AndroidManifest.xml 的 Activity 定义的 Android 文档

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


0
投票

意味着如果标记为“singleTop”的活动/实例不在堆栈顶部并且您尝试调用它,则会创建一个新实例并将其放在堆栈顶部。在标准模式下,您可以一直创建实例,而无需查看堆栈。

© www.soinside.com 2019 - 2024. All rights reserved.