天天看点

定时任务之定时刷新常驻通知栏

项目开发中的需求:常驻通知栏所用数据来源于后端接口,有时效性,需要定时刷新数据。

常驻通知栏定时刷新:
需求是【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)
    }
           

这样,就实现了定时刷新常驻通知栏!!!