android – 适用于API 17和19的AlarmManager

我有以下代码,每小时都会调用我的“警报接收器”进行检查
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent notificationIntent = new Intent("android.media.action.disPLAY_NOTIFICATION");
    notificationIntent.addCategory("android.intent.category.DEFAULT");

    PendingIntent broadcast = PendingIntent.getbroadcast(context,100,notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);

    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.HOUR,1);
    alarmManager.setExact(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(),broadcast);

这适用于Android API 19(Android 4.4)

但是,我想允许Android API 17(4.2)能够使用我的应用程序,因为不是每个人都可以在他们的手机上获得4.4

问题是API 17不支持setExact

是否有一种方法可以调用调用的Intent,这是由API 17支持的,或者我必须以某种方式找出android运行的verison并执行一段代码或其他代码

谢谢

解决方法

AlarmManager的工作方式是 changed in API level 19,以帮助节省电池寿命.这样事件就可以批量化了.这意味着set()和setRepeating()在API 19上将是不精确的.

在19版之前的API版本中,您可以使用set,它将为确切的时间安排警报.

不幸的是,这意味着您需要在代码添加一个检查,以确保使用正确的方法来设置确切的警报:

@SuppressLint("NewApi")
private void setSingleExactAlarm(long time,PendingIntent pIntent) {
    if (android.os.Build.VERSION.SDK_INT >= 19) {
        mAlarmManager.setExact(AlarmManager.RTC_WAKEUP,time,pIntent);
    } else {
        mAlarmManager.set(AlarmManager.RTC_WAKEUP,pIntent);
    }
}

此外,它应该值得在Marshmallow中引入reading about Doze,并决定您希望您的应用程序如何与它一起工作.

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...