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 远程视图中

Android 无法使用列表视图加载主屏幕小部件

是否有带有文本框和 2 个旋钮的默认 Android 视图小部件?

带有 ListView 自定义项的 Android 小部件

带有集合(ListView)的Android小部件不显示项目