从Android 4.4 Kitkat设置闹钟

在Android 4.4 API页面中,我读到:

将应用程序的targetSdkVersion设置为“19”或更高时,使用set()或setRepeating()创建的警报将不准确。

[切]

这种不精确的批处理行为仅适用于更新的应用程序。 如果您已将targetSdkVersion设置为“18”或更低,则在Android 4.4上运行时,您的警报将继续像以前的版本一样运行。

在我的应用程序中,我需要准确的时间警报,我将targetSdkVersion更新为“19”。 以下代码是否正确? 另外,如果我在手机中将targetSdkVersion设置为“19”并使用以前的版本,那么“旧”方法AlarmManager.set是否会以相同的方式继续工作?

private void setAlarm (long ms){ final AlarmManager am = (AlarmManager) mCtx.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(this, BroadcastReceiverAlarm.class); PendingIntent pi = PendingIntent.getBroadcast(this, ALARM_REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT); if (Build.VERSION.SDK_INT<Build.VERSION_CODES.KITKAT) { am.set(AlarmManager.RTC, ms, pi); } else { setAlarmFromKitkat(am, ms, pi); } } @TargetApi(19) private void setAlarmFromKitkat(AlarmManager am, long ms, PendingIntent pi){ am.setExact(AlarmManager.RTC, ms, pi); } 

是的,这是正确的。 谷歌未能详细描述:

  1. 对于targetSDKVersion <19,无论设备是在KitKat还是早期版本上运行,“set”都是准确的。
  2. 对于targetSDKVersion> = 19,“set”对于运行

我从ADT下载了4.1.2并卸载了4.4。 我将“Build Target”设置为4.1.2并清理并重建了我的应用程序并重新安装了apk到手机。

但是,这种行为仍然不准确。

我粘贴adb shell dumpsys alarm的输出如下:

RTC_WAKEUP#0:报警{426941b0 type 0 net.coolbie.alarmclock}

  type=0 when=+4m46s480ms repeatInterval=0 count=0 operation=PendingIntent{42553668: PendingIntentRecord{42a6cc38 net.coolbie.alarmclock broadcastIntent}} 

你可以看到“when”在那里是+ 4m,但是triggerTime只有8秒。

 long triggerTime = calendar.getTimeInMillis(); long currentTime = System.currentTimeMillis(); Toast.makeText(mContext, "gap is:"+(triggerTime-currentTime)/1000,Toast.LENGTH_LONG).show(); Intent intent = new Intent(mContext.getApplicationContext(), AlarmReceiver.class); PendingIntent pendIntent = PendingIntent.getBroadcast(mContext.getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, pendIntent);