Android API 15 及更高版本上的准确计时器

Accurate Timers on Android APIs 15 and higher

我正在更新客户的应用程序,并且遇到了他们采用的计时器机制的问题。之前他们一直在使用 AlarmManager.setRepeating 创建一个在指定时间间隔后重复出现的警报。

AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, OnAlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);    
mgr.setRepeating(
        AlarmManager.ELAPSED_REALTIME_WAKEUP, 
        SystemClock.elapsedRealtime() + interval, 
        interval, 
        pi
);

从 Android 4.4 开始,这会导致计时不准确,因此我尝试用精确的计时器替换它。

mgr.setExact(
        AlarmManager.ELAPSED_REALTIME_WAKEUP, 
        SystemClock.elapsedRealtime() + interval, 
        pi
);

但是 setExact 仅适用于 API19。目前 MinSDK 设置为 15,Target 设置为 21。虽然我相信我可以简单地将最小 API 设置为 19,但客户仍然希望支持运行 APIs 15-18.

的设备

有什么方法可以同时支持这两个过程,在 API 15-18 岁时使用 setRepeating,然后在 19 岁以上时使用 setExact?

编辑:将目标 API 从 21 降低到 18 是否会丢失任何东西,这会解决问题吗?

您可以使用 Build.VERSION.SDK_INT (Retrieving Android API version programmatically)

获取安装的 os 版本
if (Build.VERSION.SDK_INT >= 19)
    mgr.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + interval, pi);
else if (Build.VERSION.SDK_INT >= 15)
    mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + interval, interval, pi);