项目开发中的需求:常驻通知栏所用数据来源于后端接口,有时效性,需要定时刷新数据。
常驻通知栏定时刷新:
需求是【6:10,7:10,8:10,9:10,10:10,11:10,12:10,13:10,14:10,15:10,16:10,17:10,18:10,19:10,20:10,21:10,22:10,00:10】这些时间节点主动刷新。
这就涉及到android中的定时任务!
这里我采用AlarmManager来实现这个需求。
思路:
1) app启动进入首页时启动定时服务AlarmService
2) 在定时服务AlarmService的onStartCommand中设置定时闹钟
3)定时闹钟采用AlarmManager实现,通过设置第一次提醒的时间 以及 后续执行提醒的间隔时间,来实现上述需求----每个小时的第10分钟通知一次。
4)达到定时时间后,发送广播来实现通知。在接收到此广播后重启定时服务AlarmService。
备注:因为采用的是startService方式启动服务,所以多次启动该服务,onCreate只会执行一次,而onStartCommand每次都会执行。所以定时提醒的具体任务放在onStartCommand中执行。
具体实现如下:
设置定时器代码:
/**
* 说明:设置定时提醒闹钟---在每个小时的第10分钟通知提醒 第一个8:10,间隔一个小时,则是9:10
*/
fun setAlertAlarm() {
try {
val intent = Intent(CommonManager.getBaseContext(), NotificationReceiver::class.java)
intent.action = BroadcastConfig.ACTION_RESIDENT_NOTIFICATION_ALARM_ALERT
val pi = PendingIntent.getBroadcast(CommonManager.getBaseContext(),
NotificationUtil.NOTIFICATION_RESIDENT_ALARM_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT)
val alarmManager: AlarmManager = CommonManager.getBaseContext().getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmManager.cancel(pi)
var firstTime = System.currentTimeMillis()
val systemTime = System.currentTimeMillis()
val calendar: Calendar = Calendar.getInstance()
calendar.timeInMillis = System.currentTimeMillis()
// 这里时区需要设置一下,不然会有8个小时的时间差
calendar.timeZone = TimeZone.getTimeZone("GMT+8")
calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY))
calendar.set(Calendar.MINUTE, 10)
calendar.set(Calendar.SECOND, 10)
calendar.set(Calendar.MILLISECOND, 0)
// 选择的定时时间-----当前设置的定时时间是每个小时的第10分钟
var selectTime: Long = calendar.timeInMillis
// 计算现在时间到设定时间的时间差
if (systemTime > selectTime) { //如果当前系统时间 大于 设置时间,则小时加1
calendar.add(Calendar.HOUR_OF_DAY, 1)
selectTime = calendar.timeInMillis
}
val time = selectTime - systemTime
firstTime += time
//从firstTime这个时间点开始提醒,然后间隔TIME_DISTANCE 提醒一次
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, firstTime, NotificationUtil.TIME_DISTANCE, pi)
} catch (e: Exception) {
e.printStackTrace()
}
}
接收到广播后,重启服务,执行操作
private fun dealWithResidentNotificationAlarm(context: Context?, intent: Intent?) {
if (context == null || intent == null) {
return
}
AlarmService.startAlarmService(context)
}
这样,就实现了定时刷新常驻通知栏!!!