setAlarmClock在android marshmallow中并不精确

时间:2016-09-07 07:15:51

标签: android alarmmanager android-alarms

我使用setAlarmClock Alarmmanager方法进行闹钟应用。 当我从早上6点设置闹钟并在6.01 AM闹钟时。它延迟而且不准确。

setAlarmClock时的代码。

Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
intent.putExtra(AppConstant.REMINDER, note.convertToString());
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
        note.getId(), intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    alarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(getTargetTime().getTimeInMillis(),pendingIntent),pendingIntent);
}

setCalander报警时的代码

  private Calendar getTargetTime() {
    Calendar calNow = Calendar.getInstance();
    Calendar calSet = (Calendar) calNow.clone();
    calSet.set(Calendar.DAY_OF_MONTH, sDay);
    calSet.set(Calendar.HOUR_OF_DAY, sHour);
    calSet.set(Calendar.MINUTE, sMinute);
    calSet.set(Calendar.SECOND, 0);
    calSet.set(Calendar.MILLISECOND, 0);

    return calSet;
}

好的,我从这个项目https://github.com/googlesamples/android-DirectBoot实施。

此项目在使用时会使用setAlarmClock进行警报。

更新:我将setAlarmClock更改为setExact

此代码:

 alarmManager.setExact(AlarmManager.RTC_WAKEUP, getTargetTime().getTimeInMillis(), pendingIntent);

它对我不起作用,但延迟了同样的setAlarmClock。

以毫秒为单位的当前时间:1473318858628 我使用http://www.ruddwire.com/handy-code/date-to-millisecond-calculators/#.V9EPXfmLRD8

更改为默认格式

Thu Sep 08 2016 14:14:18 GMT + 0700

以毫秒为单位设置闹钟时间:1473318960000

Thu Sep 08 2016 14:16:00 GMT + 0700

现在是14:16:00,它没有报警。

它在14.20:00发出警报,所以延迟大约4分钟。 (以毫秒为单位的时间= 1473319200207)

感谢

2 个答案:

答案 0 :(得分:1)

您应该阅读文档。这是根据摘录的文档设计的:

  

注意:从API 19(KITKAT)开始,警报传递不准确:操作系统将移动警报以最小化唤醒和电池使用。有新的API支持需要严格交付保证的应用程序;请参阅setWindow(int,long,long,PendingIntent)和setExact(int,long,PendingIntent)。 targetSdkVersion早于API 19的应用程序将继续查看之前在请求时准确传递所有警报的行为。

参考

https://developer.android.com/reference/android/app/AlarmManager.html

答案 1 :(得分:0)

如果在闹钟中使用setAlarmClock而不是setExact。

在您的代码中:

alarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(getTargetTime().getTimeInMillis(),pendingIntent),pendingIntent);

您的getTargetTime()可能有问题。尝试通过添加

手动将时间减少1分钟
alarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(getTargetTime().getTimeInMillis()-60*1000,pendingIntent),pendingIntent);