Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AlarmManager does not always execute BroadcastReceiver

So I've got a BroadcastReceiver and the AlarmManager.

Let's say I create the Pending Intents like so:

Intent i;
i = new Intent(context, MyReceiver.class);
i.setAction(MyReceiver.ACTION_1);
i.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
pendingIntent1 = PendingIntent.getBroadcast(context, 1, i, PendingIntent.FLAG_UPDATE_CURRENT);

i = new Intent(context, MyReceiver.class);
i.setAction(MyReceiver.ACTION_2);
i.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
pendingIntent2 = PendingIntent.getBroadcast(context, 2, i, PendingIntent.FLAG_UPDATE_CURRENT);

And schedule the alarms like so:

now = SystemClock.elapsedRealtime();
long time1 = now + 10 * 1000;
long time2 = time1 + 60 * 1000;

am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, time1, pendingIntent1);
am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, time2, pendingIntent2);

I am now experiencing that my broadcast receiver gets the broadcast for ACTION_1 quite reliably, while ACTION_2 is often not being delivered. So onReceive is rarely or never executed with an intent holding the action ACTION_2. How comes that? I thought, *_WAKEUP makes sure that broadcasts are being delivered anyway?

[Update 09/15/2015] - For testing purposes I'm trying to print out a Log message in my onReceive method. Still not working. - I've tried using setExact on AlarmManager now. Still not working. - I've even tried using WakefulBroadcastReceiver. Still not working. - I've found out, however, that the device reliably wakes up when in battery charged state. What could cause this problem? I've read everywhere that broadcast receivers are guaranteed to be executed if triggered by the alarm manager via a pending intent (and not doing too much stuff in onReceive). Do I maybe have some aggressive energy saving policy on my phone which I can't really work against (without acquiring a long wake lock, see comments)?

[Update 09/19/2015] I have just tested some alarm clock app (https://play.google.com/store/apps/details?id=com.alarmclock.xtreme.free) on Google Play and it does not reliably wake up the phone, too. I guess, it's really a bug and not my fault. I'll stick to the wake lock solution then, I guess.

like image 382
flxapps Avatar asked Aug 12 '15 17:08

flxapps


1 Answers

I encountered the same problem, the solution i found is to create the intent only by action string, and register that receiver action in manifest. try changing the intent to something like this:

i = new Intent("com.app.ACTION_ONE");

then in your manifest file add to your receiver the following:

<intent-filter>
    <action android:name="com.app.ACTION_ONE" />
</intent-filter>

My guess is if you dont register at least 1 action to the recevier he just dies when the application procces is terminated.

Hope it works, good luck.

like image 120
Itay Sued Avatar answered Nov 15 '22 21:11

Itay Sued