AlarmManager不稳定

时间:2017-02-02 05:13:11

标签: android alarmmanager wakelock

我使用AlarmManager来设定时间并期望将来做一些工作。几乎没有问题,它运作良好。但有时(有时候),警报没有被解雇。很难重现这个问题,我仍然不知道原因。 我在几个操作系统版本上遇到了这个问题:4.4,5.1,6.0,6.1,7.0。

我已经使用 WakefulBroadcastReceiver 来启动与Wakelock的服务,但问题仍然存在。

以下是我安排闹钟的代码。

 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;
}

有没有人像我这样有同样的问题?你的解决方案是什么? 也许这个问题来自Android SDK,它们使AlarmManager工作不稳定。

1 个答案:

答案 0 :(得分:1)

我有同样的问题,我通过在AlarmReceiver中完成所有逻辑解决了这个问题。我也在接收器中启动服务,保持我的警报逻辑。但是,一旦我将我的代码移动到警报接收器,它工作正常。我的问题是我没有结束我的服务,它继续运行并导致一些问题或可能是其他原因但它解决了我的问题。如果有这个帮助,你应该试着告诉我。