Android:从小部件打开错误的活动

Posted

技术标签:

【中文标题】Android:从小部件打开错误的活动【英文标题】:Android: Opening wrong Activity from the widget 【发布时间】:2011-11-26 17:05:56 【问题描述】:

我已经为这个问题苦苦挣扎了一段时间。我有一个显示烹饪食谱摘要的小部件。该小部件是可单击的,因此每当用户单击它时,都会打开带有该配方的完整描述的新活动。问题是,有时单击小部件时会打开错误的活动。举个例子吧:

    用户点击小部件并打开活动 A 用户从活动 A 开始活动 B(例如食谱索引)。 用户从活动 B 开始活动 C。 用户按下主页按钮。 用户再次点击小部件,显示活动 C 而不是 A

我尝试设置这三个标志的组合,这仅有助于解决一半的问题:

openIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

通过使用上述标志,我设法显示正确的活动 (A),直到我执行以下操作:

    用户从小部件打开活动 A 用户移动到活动 B 并通过单击新配方打开活动 A 向用户显示新配方 用户单击主页按钮并单击小部件。 活动 A 已显示(右侧),但配方不同。 从现在开始,如果我移动到不同的活动 B 或 C 并单击主页,然后再次单击小部件,则活动 A 不会显示,而是在按下主页按钮之前可见。

我希望我解释得足够详细。我真的很感谢你的帮助,因为这件事让我发疯了!

更新:

这是我的pendingIntent:

Intent openIntent = new Intent(context, ProfanityDefinition.class);

openIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
openIntent.setData(Uri.parse(openIntent.toUri(Intent.URI_INTENT_SCHEME)));

Bundle bundle = new Bundle();
bundle.putBoolean("widgetRequest", true);
openIntent.putExtras(bundle);
PendingIntent openPendingIntent = PendingIntent.getActivity(context, 0, openIntent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.widget_content, openPendingIntent);

谢谢

【问题讨论】:

【参考方案1】:

显示创建PedningIntent 的代码。如果您将额外内容传递给您的活动,请注意只有额外内容不同的两个意图被视为等效。您可能希望在创建 PendingIntent 时传递 PendingIntent.FLAG_CANCEL_CURRENT 以确保您的意图不会被重用。

【讨论】:

由于您的任务活动已经在运行,FLAG_ACTIVITY_NEW_TASK 只会将正在运行的活动带到前台。在 androidManifest.xml 中为 ProfanityDefinition 活动设置 android:taskAffinity="" 以使其在单独的任务中运行。然后,您将在单击小部件时获得一个新实例。 这没有帮助...我仍然得到活动 B 而不是 A 或 A 内容不同...这很奇怪 它有效,请检查您的代码。您是否使用 Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_CLEAR_TOP` 作为标志? 'activity A' 的类名是什么? 我缺少 Intent.FLAG_ACTIVITY_CLEAR_TOP 标志 - 它有效!谢谢!

以上是关于Android:从小部件打开错误的活动的主要内容,如果未能解决你的问题,请参考以下文章

onActivityResult 从未从小部件启动的活动中调用

如果活动在后台运行,则无需通过启动器即可从小部件恢复现有活动

Android - 如何从小部件访问房间数据库

当小部件具有配置活动时,无法从小部件启动活动

下载数据后如何处理更新小部件然后打开活动

如何使用来自小部件的不同附加功能打开相同的活动