我刚刚被一个小部件烧伤了。我可以看到问题的原因,但无法确定原因或解决方案。我的小部件正在发出搜索(SearchManager)并且活动启动了一个搜索对话框,但是当它回调我的小部件时,它创建了对该小部件的另一个引用(即,线程ID是相同的,但是小部件ID从 65 更改为 0)。
这让我相信正在创建一个新实例,并且我在文档中搜索了适用于该问题的设置。最终,我偶然发现了
android:launchMode="singleTop"
,当我将它设置到 AndroidManifest 中时,中提琴!我的小部件工作了。
这花了我两天的时间来调试。
还有其他情况或者对我的问题有技术上更正确的答案吗?
我在 Android Docs 中做了更多阅读——我可以花一辈子的时间阅读他们的文档,并找到一个让我大吃一惊的新的微妙细节:)这解释了我没想到的多个实例,但是,我配置了发生。
AndroidManifest.xml 的 Activity 定义的 Android 文档
“标准”和“单顶”模式 彼此只有一处不同 尊重:每次有新意图时 对于“标准”活动,一个新的 该类的实例被创建为 回应这个意图。每个实例 处理单一意图。同样,一个 “singleTop”活动的新实例 也可以创建来处理新的 意图。然而,如果目标任务 已经有一个现有实例 堆栈顶部的活动, 该实例将收到新的 意图(在 onNewIntent() 调用中); A 未创建新实例。其他 情况——例如,如果 “singleTop”的现有实例 活动在目标任务中,但是 不在堆栈顶部,或者如果 它位于堆栈的顶部,但不在堆栈中 目标任务 - 一个新实例将 被创建并压入堆栈。
意味着如果标记为“singleTop”的活动/实例不在堆栈顶部并且您尝试调用它,则会创建一个新实例并将其放在堆栈顶部。在标准模式下,您可以一直创建实例,而无需查看堆栈。