我使用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工作不稳定。
答案 0 :(得分:1)
我有同样的问题,我通过在AlarmReceiver中完成所有逻辑解决了这个问题。我也在接收器中启动服务,保持我的警报逻辑。但是,一旦我将我的代码移动到警报接收器,它工作正常。我的问题是我没有结束我的服务,它继续运行并导致一些问题或可能是其他原因但它解决了我的问题。如果有这个帮助,你应该试着告诉我。