【问题标题】:WidgetProvider Intent extras sent with button click not found in onReceive在 onReceive 中找不到通过按钮单击发送的 WidgetProvider Intent 额外内容
【发布时间】:2014-10-11 07:59:36
【问题描述】:

我正在尝试检测何时单击小部件按钮,但 onReceive 方法中没有显示任何 Intent 额外内容。

onReceive 每次点击都会被调用,但我的 Intent 额外内容都没有出现。

我的代码如下:我只在更新时连接切换按钮,所以不确定这是否正确。尽管我设置了这个,但没有任何附加内容出现,并且类别为 null

onUpdate(上下文上下文等):

RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
                                R.layout.my_widget);

Intent buttonIntent = new Intent(context, MyWidgetProviderClass.class);
buttonIntent.setAction(ACTION_WIDGET_RECEIVER);
buttonIntent.putExtra("BUTTON_CLICKED", "buttonClick");
buttonIntent.putExtra("BUTTON",899);

PendingIntent muPendingIntent = PendingIntent.getBroadcast(context, 0, 
                                        buttonIntent, 
                                        PendingIntent.FLAG_CANCEL_CURRENT);
buttonIntent.addCategory("buttonclick");
remoteViews.setOnClickPendingIntent(R.id.ToggleImageButton, myPendingIntent);
appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);

onReceive():

intent.getIntExtra("BUTTON",-1);    ---> 1
intent.getCategories()   --- > null

【问题讨论】:

    标签: android widget android-intent broadcastreceiver


    【解决方案1】:

    尝试使用FLAG_UPDATE_CURRENT 而不是FLAG_CANCEL_CURRENT

    另外,您的代码可能有错字:您使用的是muPendingIntent 而不是myPendingIntent

    另外,请不要将buttonclick 用作类别。请为其命名(例如,com.something.whatever.buttonclick),或将其删除,因为我不确定您为什么需要它。

    Here is a sample project 演示了一个应用小部件,该小部件在单击时会触发自身更新,并带有一个额外的(用于提供应用小部件 ID)。

    【讨论】:

    • 我正在寻找一种方法来查看该按钮实际上是在 onReceive 中单击的。他们仍然没有出现在 onReceive 中。就像它的不同意图一样,没有任何额外内容?
    • 我需要一种方法来查看它是触发的按钮,因为在接收时获得了其他意图
    • 我确实尝试了 FLAG_UPDATE_CURRENT 但没有效果,只是没有显示任何额外内容或我所做的任何设置。
    • @Androider:我只能告诉你我链接的代码是有效的。由您来确定您的方法与我的不同之处。
    • 其实我也有同样的问题。额外的东西在某个时候被分离了。他们第一次工作,但没有额外的。
    【解决方案2】:

    Android 显然不喜欢重复使用名称 ACTION_WIDGET_RECEIVER 并删除这些参数。为切换按钮创建了另一个 ACTION,在清单中注册,现在参数显示出来了。

    【讨论】:

      【解决方案3】:

      我发现,如果用于创建 Pending Intent 的 Intent 中已经有任何附加内容,那么新 Intent 的附加内容将被忽略。例如,如果您按照 Android 文档中的示例构建这样的小部件

      Intent toastIntent = new Intent(context, StackWidgetProvider.class);
      toastIntent.setAction(StackWidgetProvider.TOAST_ACTION);
      toastIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
      intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
      PendingIntent toastPendingIntent = PendingIntent.getBroadcast(context, 0, toastIntent,
      PendingIntent.FLAG_UPDATE_CURRENT);
      rv.setPendingIntentTemplate(R.id.stack_view, toastPendingIntent);
      

      然后一行

      toastIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
      

      将防止您的新意图的附加内容粘住。我删除了那条线,我的新意图奏效了。

      【讨论】:

        猜你喜欢
        • 2013-08-04
        • 1970-01-01
        • 2014-03-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-31
        • 2018-09-10
        • 1970-01-01
        • 2013-11-02
        相关资源
        最近更新 更多