Android:单击小部件中的按钮时接收自定义广播

Posted

技术标签:

【中文标题】Android:单击小部件中的按钮时接收自定义广播【英文标题】:Android : Receive custom broadcast when a button in a widget is clicked 【发布时间】:2011-03-28 15:28:05 【问题描述】:

我有一个工作正常的BroadcastReceiver,即从 Activity 执行此代码,接收方会收到意图:

Intent toggleIntent = new Intent(this, ToggleServicesReceiver.class);
this.sendBroadcast(toggleIntent);

但我正在尝试通过小部件中的按钮执行相同的操作:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)   
    ...
    Intent toggleIntent = new Intent(context, ToggleServicesReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, toggleIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    remoteView.setOnClickPendingIntent(R.id.widget_button, pendingIntent);

代码被调用(我已经用调试器检查过了),但是当用户点击按钮时,同样的BroadcastReceiver 没有收到Intent

会发生什么?

编辑BroadcastReceiver 是在androidManifest.xml 中定义的,现在我不确定是否需要<intent-filter>

<receiver android:name="foo.receivers.ToggleServicesReceiver">
    <intent-filter>
        <action android:name="foo.intent.action.SERVICES_TOGGLE" />
    </intent-filter>
</receiver>

编辑:我也在论坛上发现了这个,可能和这个问题有关

您根本无法做到这一点。一种 仅广播接收器组件 在通话期间“活着” 到 onReceiveIntent();它不是 允许在其中使用 registerReceiver, 因为当你从 该方法(此时您可以 首先收到你的任何东西 注册),该组件不再 活着,系统可能会在 随时回收内存。

【问题讨论】:

看起来不错。这个BroadcastReceiver 声明在哪里——清单或registerReceiver()?如果是后者,您确定它实际上是在单击应用小部件时注册的吗? 它在清单中声明,但我已经尝试过两种方式。我要重复我的测试,以防我错过了什么。我还在 SO 中找到了一个与相同问题密切相关的问题 (***.com/questions/3044275/…) 【参考方案1】:

考虑一下:

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, toggleIntent, PendingIntent.FLAG_ONE_SHOT);

【讨论】:

以上是关于Android:单击小部件中的按钮时接收自定义广播的主要内容,如果未能解决你的问题,请参考以下文章

单击时如何将按钮值从自定义小部件传递到 tkinter 中的主应用程序

Android 小部件+服务

android小部件的按钮单击事件

如何在活动和小部件之间共享数据和方法

Android Widget 随机停止工作

WordPress小部件中的重复表单字段?