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

标签 android timer alarmmanager android-4.4-kitkat

我正在更新客户的应用程序,并且遇到了他们采用的计时器机制的问题。以前,他们一直使用 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 仅适用于 API 19。目前 MinSDK 设置为 15,Target 设置为 21。虽然我相信我可以简单地将最小 API 设置为 19,但客户仍然希望支持运行 API 15 的设备 - 18.

有没有办法支持这两个进程,在 API 15-18 上使用 setRepeating,然后在 19+ 上使用 setExact?

编辑:将目标 API 从 21 降低到 18 是否会丢失任何内容,这是否可以解决问题?

最佳答案

您可以使用 Build.VERSION.SDK_INT ( Retrieving Android API version programmatically ) 获取已安装操作系统的版本

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

关于android - Android API 15 及更高版本上的准确计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27844957/

相关文章:

C# - System.Timers.Timer 的替代方案,在特定时间调用函数

c - 根据 settimeofday 调整基于 CLOCK_REALTIME 的计时器

Python - 基于计时器更新绘图

java - AlarmManager 膨胀布局

android - 在特定时间取消重复闹钟

android - AlarmManager 警报立即触发

当我使用移动数据时,带有 admob 的 Android 广告不显示

c# - java.lang.IllegalArgumentException : Upsert affected multiple rows 异常

java - 如何更改 Android java/xml 中的 numberPicker 速度

java - Random.nextInt 创建越界整数