开发者

Android : Receive custom broadcast when a button in a widget is clicked

I have a BroadcastReceiver that works fine, i.e. executing this code from an Activity, the receiver receives the intent:

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

But I am trying to do the same from a button in a Widget:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {  
    ...
    Intent toggleIntent = new Intent(context, ToggleServicesReceiver.class);
    Pendin开发者_Python百科gIntent pendingIntent = PendingIntent.getBroadcast(context, 0, toggleIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    remoteView.setOnClickPendingIntent(R.id.widget_button, pendingIntent);
}

The code is called (I've checked it with the debugger), but when the user clicks the button, the same BroadcastReceiver does not receive the Intent.

What could be happening?

Edit: The BroadcastReceiver is defined in AndroidManifest.xml, and now I'm not sure if the <intent-filter> is needed:

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

Edit: I've also found this in a forum, it could be related with this problem

You simply can not do this. A BroadcastReceiver component only "lives" for the duration of the call to onReceiveIntent(); it is not allowed to use registerReceiver in it, because by the time you return from that method (at which point you could first receive anything from your register), the component is no longer alive, and the system could kill at any time to reclaim memory.


Consider this:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜