Android 小部件 - 使用带有远程视图的 setOnClickPendingIntent 未收到 Intent
Posted
技术标签:
【中文标题】Android 小部件 - 使用带有远程视图的 setOnClickPendingIntent 未收到 Intent【英文标题】:Android widget - Intent not received using setOnClickPendingIntent with remoteviews 【发布时间】:2014-10-03 11:00:16 【问题描述】:我目前正在使用三个ImageButtons
创建我的第一个小部件。
我已经非常密切地遵循Clickable widgets in android 描述的答案,但是我无法让它发挥作用。
我已经定义了三个字符串,它们是我的操作:
private String playAction = "playService";
private String stopAction = "stopService";
private String resetAction = "resetService";
接下来在我的OnUpdate()
函数中添加setOnclickPendingIntent
:
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
remoteViews.setOnClickPendingIntent(R.id.widget_play, getPendingSelfIntent(context, playAction));
remoteViews.setOnClickPendingIntent(R.id.widget_pause, getPendingSelfIntent(context, stopAction));
remoteViews.setOnClickPendingIntent(R.id.widget_reset, getPendingSelfIntent(context, resetAction));
manager = appWidgetManager;
// Build the intent to call the service
Intent intent = new Intent(context.getApplicationContext(), UpdateWidgetService.class);
// Update the widgets via the service
context.startService(intent);
getPendingSelfIntent
函数定义如下:
protected PendingIntent getPendingSelfIntent(Context context, String action)
Intent intent = new Intent(context, MyWidgetProvider.class);
intent.setAction(action);
return PendingIntent.getBroadcast(context, 0, intent, 0);
但是onReceive
函数不接收上述定义的任何操作。我目前记录传入意图的所有动作,但唯一通过的是android.appwidget.action.APPWIDGET_UPDATE
动作。
为了完整起见,这就是我在 Manifest 中定义操作的方式:
<receiver
android:name="MyWidgetProvider"
android:icon="@drawable/ic_launcher"
android:label="My Widget">
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_info" />
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="playService" />
<action android:name="stopService" />
<action android:name="resetService" />
</intent-filter>
</receiver>
我在 Android 文档中读到,不能使用 setOnClickPendingIntent
函数设置属于集合(ListView
等)的元素。我的布局中有三个按钮。为了确保这不会导致错误,下面是 XML 的样子:
<LinearLayout
android:layout_
android:layout_>
<ImageButton
android:id="@+id/widget_play"
android:layout_
android:layout_
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_marginRight="5dp"
android:src="@drawable/run"/>
<ImageButton
android:id="@+id/widget_pause"
android:layout_
android:layout_
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:layout_marginRight="5dp"
android:src="@drawable/pause"/>
<ImageButton
android:id="@+id/widget_reset"
android:layout_
android:layout_
android:scaleType="fitCenter"
android:adjustViewBounds="true"
android:src="@drawable/reset"/>
</LinearLayout>
感谢您对此事的任何帮助,因为我完全没有想法。我已经搜索过类似的问题,但它们都描述了我已经尝试过的内容。
【问题讨论】:
发布您的 UpdateWidgetService 类 我认为你应该使用PendingIntent.FLAG_UPDATE_CURRENT
作为PendingIntent.getBroadcast(...)
的最后一个参数。尝试将return PendingIntent.getBroadcast(context, 0, intent, 0);
替换为return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
。
【参考方案1】:
我认为您在设置 pendingintents 后错过了对小部件的更新:
appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
如果这没有帮助,您也应该发布您的 UpdateWidgetService.class。
顺便说一句,UpdateWidgetService.class 是做什么的?
【讨论】:
这个答案是正确的,需要调用updateAppWidget
。我创建了一个gist,其中包含工作文件。此外,无需在清单文件中添加自定义操作,如 documentation 中指定的那样。如果这个答案被 OP 接受,这个评论内容可以附加到答案中。
你能解释一下这个函数在内部是做什么的吗?该文档并未向我提供整个故事。我现在就试试你的建议。
此函数对小部件本身进行更新。您准备远程视图,并使用此函数将其传递给具有给定 ID 的小部件。您可以使用相同的内容更新所有小部件,或者使用不同的内容更新每个小部件,这取决于您传递数组中的所有 id-s 还是一个 id。你可以在这里查看文档:link,它的源代码在这里:link
我可以在 5 小时内提供赏金,但你可以指望它。以上是关于Android 小部件 - 使用带有远程视图的 setOnClickPendingIntent 未收到 Intent的主要内容,如果未能解决你的问题,请参考以下文章
Android:小部件 - 在远程视图上使用 setOnclickPendingIntent 时出现空指针异常?
如何将图像从 url 加载到小部件的 android 远程视图中