Android - AppWidget的待定意图未触发

4
我有一个带有Button的应用小部件。 点击按钮时,会触发一个意图(Intent),调用我的广播接收器(Broadcast Receiver)。
虽然它正常工作,但偶尔在使用任务管理器中的“清除内存”按钮后,小部件会卡住 - 点击它没有反应。不过,如果我的应用程序运行,则仍然可以从应用程序获得更新。
我不确定未触发待处理意图是否是清理内存的故障,还是我的问题。 无论如何,以下是代码:
注册待处理意图(应用程序小部件的onUpdate方法)
    Intent intent = new Intent(context, ServiceControl.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget);
    views.setOnClickPendingIntent(R.id.appwidgetbutton, pendingIntent);

然后使用视图更新小部件。

这里是应用程序小部件提供程序的声明:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="72dp"
android:minHeight="72dp"
android:initialLayout="@layout/appwidget"
android:updatePeriodMillis="0">
</appwidget-provider>

我不希望系统调用小部件更新,只想从我的应用程序中更新它。

那么为什么挂起的意图停止触发呢?

提前致谢。


1
我不知道"清除内存"具体是做什么的,因为Android操作系统中没有内置"任务管理器"。你在哪个版本的Android上测试这个功能? - CommonsWare
1
你的代码看起来很好。我能想到唯一可能出现你所描述行为的情况是在Android 3.1+上,如果用户通过任务管理器或设置中的“管理服务”屏幕杀死了你的应用程序。然后你的应用程序就会进入“停止”状态,直到用户再次手动启动你的某个活动,才能接收广播。 “清除内存”可能是任务管理器的某种变体,但我相当确定直到Android 3.1之前没有出现“不再广播”的规则。 - CommonsWare
1
当应用程序停止接收广播后,您必须删除小部件,否则它将永远不会再次接收广播(它将永远不会接收到我的广播。例如APPWIDGET_UPDATE的广播仍然会被接收)。但是我想知道,为什么其他任何小部件都没有出现这种情况?没有其他小部件曾经卡住过,所以我仍然觉得这是我的问题,在某个地方... - Jong
@Jong 我也陷入了和你一样的困境。你有没有碰巧找到真正的错误? - Radu
没有,抱歉 :( - Jong
显示剩余3条评论
1个回答

1

@Jong

@CommonsWare

大家好,我解决了问题。当然这是一个Android问题,接收器应该始终接收到消息。

现在如何解决?显然所有小部件都在工作,所以必须有一个简单的解决方案。

我在SO上读到过(试图找到那个人)提醒我们所有人,小部件类实际上是扩展了BroadcastReceiver。

因此,您可以在清单中注册小部件,以便接收威胁本身。因此,整个系统都包含在AppWidgetProvider类实例中。

现在,为了与应用程序进行通信,您可以在onReceive中调用应用程序的任何静态类,并且如果应用程序处于活动状态,则LocalBroadcastManager不会让您失望。如果它不是活动的,则您的按钮应该启动活动!

如果您需要代码,我可以详细说明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接