Tom
Tom

Reputation: 208

Correct way of handling (pending) intents in AppWidgets

I have a question regarding AppWidget intent handling. I have a widget which is clickable, and on click I want to send an intent to the AppWidgetProvider itself for further processing.

The problem: I receive the intents initially in onReceive(), but after a while (not sure what causes it), onReceive() is no longer called.

I have the following code, all in MyWidgetProvider extends AppWidgetProvider.

a) register for receiving broadcasts:

in onEnabled(...):
  context.getApplicationContext().registerReceiver(this, new IntentFilter(MY_ACTION));

b) set intent to be fired on click:

in onUpdate(...)
  Intent intent= new Intent(MY_ACTION);
  PendingIntent pendingIntent= PendingIntent.getBroadcast(context, 0/*notusedanyway*/, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  views.setOnClickPendingIntent(R.id.widget_root, pendingIntent);

c) react to event and do something:

in onReceive(...)
  if (MY_ACTION.equals(intent.getAction())
    doSomething();

When I deploy + add a widget, it works fine. However, after a while - not sure what exactly causes the problem, but a phone call, for example, seems to affect it - I no longer get any notifications in onReceive().

I am completely stumped why this is the case. Can someone point out to me the correct way of doing this?

Thanks!

Tom

Upvotes: 0

Views: 242

Answers (1)

Femi
Femi

Reputation: 64700

You should use a BroadcastReceiver registered in your AndroidManifest.xml file. When you register it in onEnable it is tied to the process. Whenever Android kills your process (for example, when a phone call is received) then your receiver no longer exists and (as you observed) no longer works.

Upvotes: 1

Related Questions