使用 AlarmManagerCompat 支持库

JF0*_*001 0 android alarmmanager android-alarms

如果使用支持库 android.support.v4.app.AlarmManagerCompat 的 AlarmManagerCompat 类,则可以使用以下单一语法调用警报(适用于所有设备,无论安装的 API 级别如何,支持库提供所有以前版本的 API 的向后兼容性):

alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), alarmIntent);
Run Code Online (Sandbox Code Playgroud)

或者仍然需要先验证设备上安装的 API 级别,然后根据所使用的 API 级别使用适当的语法调用警报,例如:

        if (VERSION.SDK_INT >= 23) {
            alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), alarmIntentMain);
            // Adding manual re-scheduling for repetition
        }
        else if (VERSION.SDK_INT >= 19) {
            alarmMgr.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), alarmIntentMain);
            // Adding manual re-scheduling for repetition
        }
        else if (VERSION.SDK_INT <= 18) {
            alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 60 * 60 * 24 * 7 * 1000, alarmIntentMain);
        }
Run Code Online (Sandbox Code Playgroud)

根据我的理解,支持库旨在能够将更新的类与旧版本的 API 一起使用,而不必为不同的 API 编写相同功能的不同语法。我的理解正确吗?

ian*_*ake 6

查看 AlarmManagerCompat源代码,它完全按照您所说的 API 级别检查:

public static void setExactAndAllowWhileIdle(@NonNull AlarmManager alarmManager, int type,
        long triggerAtMillis, @NonNull PendingIntent operation) {
    if (Build.VERSION.SDK_INT >= 23) {
        alarmManager.setExactAndAllowWhileIdle(type, triggerAtMillis, operation);
    } else {
        AlarmManagerCompat.setExact(alarmManager, type, triggerAtMillis, operation);
    }
}

public static void setExact(@NonNull AlarmManager alarmManager, int type, long triggerAtMillis,
        @NonNull PendingIntent operation) {
    if (Build.VERSION.SDK_INT >= 19) {
        alarmManager.setExact(type, triggerAtMillis, operation);
    } else {
        alarmManager.set(type, triggerAtMillis, operation);
    }
}
Run Code Online (Sandbox Code Playgroud)

因此您可以使用AlarmManagerCompat而不必担心 API 级别。