AlarmManager For API 17& 19

时间:2015-10-22 08:47:51

标签: android api

我有以下代码,可以调用我想要的警报接收器'每小时进行一次检查

    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正在运行并执行一段代码或其他代码?

谢谢

3 个答案:

答案 0 :(得分:17)

AlarmManager的工作方式是changed in API level 19,以帮助节省电池寿命。这样事件就可以进行批量处理。这意味着{19} + set()setRepeating()将不准确。

在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, time, pIntent);
    }
}

此外,在Marshmallow中引入reading about Doze并确定您希望应用如何与其一起工作。

答案 1 :(得分:4)

如果您想触发确切的警报,您应该使用以下内容:

if (android.os.Build.VERSION.SDK_INT >= 19) {
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, NEXT_TIME_IN_MILLISECONDS, operation);
} else {
    alarmManager.set(AlarmManager.RTC_WAKEUP, NEXT_TIME_IN_MILLISECONDS, operation);
}

考虑到Android 6中的打盹功能已发生变化,因此请随时查看documentation

答案 2 :(得分:0)

您最好使用AlarmManagerCompat.setExact(...),它可以处理警报设置,以实现向后兼容性和任何API版本。例如:

AlarmManagerCompat.setExact(alarmManager, AlarmManager.RTC_WAKEUP, NEXT_TIME_IN_MILLISECONDS, operation);