1

I used AlarmManager to set time and expect to do some work in the future. Almost case it work well without problem. But sometimes (just sometimes), the alarm not fired. It is difficult to reproduce the issue and I still do not know the reason. I got this issue on several OS version : 4.4, 5.1, 6.0, 6.1, 7.0.

I already used WakefulBroadcastReceiver to start a service with Wakelock, but the issue still happen.

Below is my code to schedule a alarm.

 Intent alarmIntent = new Intent(context, AlarmReceiver.class);
        alarmIntent.putExtra("todo_id", myTodo.getId());
        alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, myTodo.getId(), alarmIntent, PendingIntent.FLAG_ONE_SHOT);

        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(calendar.getTimeInMillis(), pendingIntent);
            alarmManager.setAlarmClock(alarmClockInfo, pendingIntent);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
        } else {
            alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
        }


public class AlarmReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        LogUtil.debug("onReceive()");
        if (null != intent.getExtras()) {
            int id = intent.getIntExtra("todo_id", -1);
            if (id != -1) {
                Intent myIntent = new Intent(context, AlarmService.class);
                myIntent.putExtra("todo_id", id);
                LogUtil.debug("Receiver receive todo id: "+id );
                startWakefulService(context, myIntent);
            }
        }



    }
}





public class AlarmService extends Service {

   @Override
   public void onCreate() {
       super.onCreate();

   }

   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
       LogUtil.debug("Service onStartCommand");

       int id = intent.getIntExtra("todo_id", -1);
       LogUtil.debug("Service receive todo id: " + id);

       // do some stuff here


       AlarmReceiver.completeWakefulIntent(intent);
       return START_REDELIVER_INTENT;
}

Does anyone have the same issue like me ? And what is your solution ? Maybe this issue come from Android SDK, they made AlarmManager work unstable.

CauCuKien
  • 1,027
  • 2
  • 15
  • 26

1 Answers1

1

I had the same issue , i solved this issue by doing all my logic in AlarmReceiver. I was also starting service in receiver which hold my alarm logic. But once i move my code into alarm receiver it works fine. Mine issue was i wasn't ending my service , it kept on running and causing some issue or might be other reasons but it solved my issue. You should try and let me know if this help.

Hassan Munir
  • 419
  • 7
  • 24