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

    技术2022-07-10  118

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

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

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

    Processed: 0.612, SQL: 9