У меня есть 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>
Редактировать : Я также нашел это на форуме, это может быть связано с этой проблемой
Вы просто не можете этого сделать.
Только компонент BroadcastReceiver
«живет» во время разговора
onReceiveIntent (); это не
разрешено использовать в нем registerReceiver,
потому что к тому времени, когда вы вернетесь из
этот метод (в какой момент вы могли бы
сначала получить что-нибудь от вашего
зарегистрироваться), компонента больше нет
живой, и система может убить в
в любое время вернуть память.