是的,您可以做到这一点。我的建议是你的闹钟管理器,你把它设置为setExact,你还需要检查日历是否是今天,如下所示:
//check whether the time is earlier than current time. If so, set it to tomorrow. Otherwise, all alarms for earlier time will fire
if (calendar.before(now)) {
calendar.add(Calendar.DATE, 1)
}
val timeTrigger = calendar.timeInMillis
if (Build.VERSION.SDK_INT >= 23) {
alarmManagerActivity.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
timeTrigger, //timeTrigger is Systemtimeinmillis
pendingIntentActivity
)
} else if (Build.VERSION.SDK_INT >= 19) {
alarmManagerActivity.setExact(
AlarmManager.RTC_WAKEUP,
timeTrigger,
pendingIntentActivity
)
} else {
alarmManagerActivity[AlarmManager.RTC_WAKEUP, timeTrigger] = pendingIntentActivity
}
将方法 AlarmManager 用于晚上 8:30 与 AlarmManager 重复 20 分钟。确保您使用相同的BroadcastReceiver,这样它就会在此处触发它们。请参阅下面的示例:
fun alarmManager20Minutes(context: Context) {
val calendar = Calendar.getInstance()
calendar[Calendar.HOUR_OF_DAY] = 0
calendar[Calendar.MINUTE] = 0
calendar[Calendar.SECOND] = 0
val intent = Intent(context, BroadcastReceiverHealthDeclaration::class.java)
val timeTrigger = System.currentTimeMillis() + 20 * 60 * 1000 //20 mins
val pendingIntentActivity = PendingIntent.getBroadcast(
context,
ALARM_MANAGER_ID_20_MINUTES,
intent,
PendingIntent.FLAG_UPDATE_CURRENT
)
val alarmManagerActivity = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
if (Build.VERSION.SDK_INT >= 23) {
alarmManagerActivity.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
timeTrigger,
pendingIntentActivity
)
} else if (Build.VERSION.SDK_INT >= 19) {
alarmManagerActivity.setExact(
AlarmManager.RTC_WAKEUP,
timeTrigger,
pendingIntentActivity
)
} else {
alarmManagerActivity[AlarmManager.RTC_WAKEUP, timeTrigger] = pendingIntentActivity
}
}
接下来,在您的BroadcastReceiver、onReceive,一旦触发今天上午 8.30,您需要再次调用您的Alarm Manager 方法,并且不要忘记调用alarmManager20Minutes()。
override fun onReceive(context: Context?, intent: Intent?) {
//Check if user want to receive the daily or not
val receiveNotification = QuickSave.instance.getBoolean(
Constant.RECEIVE_NOTIFICATION,
true
)
if (receiveNotification) {
AlarmManagerUtil.alarmManager20Minutes(context)
//And then call method for 8:30AM
AlarmManagerUtil.alarmManager830AM(context)
}
}
所以,当onReceive 触发时,调用方法alarmManager20minutes。它将在接下来的 20 分钟内再次调用 onReceive,并将设置为第二天的 alarmManager830AM。