写这篇博客的缘由来自一个需求:

每日定时推送通知,提醒用户完成签到。如果后台被清理,则在打开App后立即推送。

众所周知,如今的Android国产ROM想要实现定时操作需要做极强的保活。然而一旦做了保活,那么程序就可能会消耗没有必要的资源,变得很流氓,这并不是我们想要看到的。

于是jobSchedule应运而生,这个库应该是最完美的解决方案,但有api限制,并不能满足我的需要。

后来尝试了AlarmManager,这个工具也能较精确地定时工作,但是一旦程序被杀后台,就再也不起作用。而且由于采用继承Receiver的方式,在8点打开app无法收到本应是7点的通知,因此也无法满足需要。

于是选择了各种情况是否定时推送后台未被清理后台被清理原生ROM推送推送

国产ROM推送打开App后继续推送

在程序没有被杀的情况下,能够完成定时工作。

在程序被杀后,若是原生ROM,不会有影响;若是国产ROM,不会自动推送通知,但会在打开App的第一时间自动调用代码,完成推送。愚以为,微博,知乎App也是用类似这样的操作实现的推送,因为你杀掉后台后并不能接收到推送(一加5t 氢os 8.1),但是一旦重新打开App,会收到之前的提醒。

当然,这样做的缺点就是无法做到精确定时,因为workManager的重复工作间隔必须大于15分钟。因此即使使用最短的时间间隔,也最多只能保证精度为15*2=30分钟。

做到定时的原理就是,每15分钟调用一次,查看时间是否是在指定的时间段。

如果在时间段内,且未推送,那么推送,并记录。如果不在时间段内,则重置记录为未推送。

有点绕,需要理一理=_=。如果说精度大于一小时,就不用判断了。

至于使用方法就很简单了,其他博客也有详细的讲解,这里主要示例定时代码,定时7点-7点30分推送任务。

1.添加依赖implementation "android.arch.work:work-runtime:1.0.0-alpha09"

2.实现Worker的子类import android.app.PendingIntent

import android.content.Intent

import androidx.work.Worker

import com.mredrock.cyxbs.common.utils.extensions.defaultSharedPreferences

import com.mredrock.cyxbs.common.utils.extensions.editor

import com.mredrock.cyxbs.mine.util.NotificationUtil

import java.util.*

/**

* Created by zia on 2018/10/8.

* 每日签到提醒的work

*/

class SignWorker : Worker() {

private val FLAG = "SIGNPUSH"

override fun doWork(): Worker.Result {

//读取是否通知过

val isPush = applicationContext.defaultSharedPreferences.getBoolean(FLAG, false)

if (compareCurrentHour(7)) {

if (!isPush) {

//如果在指定时间段,并且没有推送过通知

applicationContext.defaultSharedPreferences.editor {

//写入已通知

putBoolean(FLAG, true)

}

//继续后面的推送通知代码

} else {

//在指定时间段,已推送过了,则不再推送

return Result.RETRY

}

} else {

//不在时间段,重置标志位false

applicationContext.defaultSharedPreferences.editor {

putBoolean(FLAG, false)

}

return Result.RETRY

}

val resultIntent = Intent(applicationContext, DailySignActivity::class.java)

val intent = PendingIntent.getActivity(applicationContext, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT)

//推送通知

NotificationUtil.makeNotification(applicationContext, "赶快去签到领取积分哦~", CHANNEL_ID = "sign", pendingIntent = intent)

return Worker.Result.SUCCESS

}

private fun compareCurrentHour(targetHour: Int): Boolean {

val current = Calendar.getInstance().get(Calendar.HOUR_OF_DAY)

return current == targetHour

}

}

3.在其他地方调用//获取一个builder

val request = PeriodicWorkRequest

.Builder(SignWorker::class.java, 15, TimeUnit.MINUTES)

.build()

//插入worker队列,并且使用enqueueUniquePeriodicWork方法,防止重复

WorkManager.getInstance().enqueueUniquePeriodicWork(workName,ExistingPeriodicWorkPolicy.KEEP, request)

4.用户取消推送WorkManager.getInstance().cancelUniqueWork(workName)

android 定时推送提醒,使用workManager实现每日定时推送通知相关推荐

  1. 有什么软件能每天提醒自己坚持吗?每日定时提醒做某事的便签

    对于上班族来说,每天都有处理不完的事情,上班时间忙工作,下了班还要通过学习提高自己.有时候下班想玩一下,结果一玩就好几个小时,原本的学习计划也泡汤了.那么有没有什么软件,能每日定时提醒自己做某事,帮助 ...

  2. 微信每日早安推送 Windows版

    应诸多网友要求,这次上一个windows版的. 使用方法就是双击打开,立即就会推送一次.需要定时执行,可以使用windows的 任务计划程序 实现.帮大家百度好了 windows如何定时运行程序htt ...

  3. 企业微信每日给女友推送早安,5分钟快速部署,腾讯云部署版本,每日定时发送,天气,鸡汤,纪念日等信息,可自定义通知提醒名称,聊天界面可置顶,内容可查图片。

    企业微信每日给女朋友推送早安,5分钟快速部署,每日定时发送,天气,鸡汤,纪念日等信息,可自定义通知提醒名称,聊天界面可置顶,内容可查图片. 先看效果 直接开搞 准备工作 1.企业id 2.企业应用se ...

  4. android信鸽推送demo_【厚积薄发】手游推送方案

    这是第155篇UWA技术知识分享的推送.今天我们继续为大家精选了若干和开发.优化相关的问题,建议阅读时间10分钟,认真读完必有收获. UWA 问答社区:answer.uwa4d.com UWA QQ群 ...

  5. 微信每日早安推送,快来给你女友做爱心提醒吧,自定义推送名称,企业号通知非订阅号测试号,后台python,精简无第三方网站注册、无第三方接口,无基础快速上不了手

    每日定时推送给女友,微信消息推送后,锁屏可提醒,聊天界面可顶置,可自定义聊天框名称,聊天头像可修改,内容可增加图片~每日推送python源码自取 手把手教你微信每日推送早安,目前为止效果最好版本. 企 ...

  6. Android极光、小米、百度、jpush等一些推送简介

    Android系统由google提供的推送的服务在国内并不能很好的运作,因此不能像 iOS能提供统一管理的推送服务.为了节约开发成本,目前主流的提供第三方推送服务的有:极光推送.个推.友盟.小米推送. ...

  7. 极光推送android 区分开发测试,给自己的项目做极光推送的步骤

    极光推送(对客户端的app如天猫进行消息推送) 第一种:利用网页进行推送(下面按这种来介绍) 第二种:利用javase代码进行消息推送 使用步骤 1\登陆极光网址 2\注册后并登陆 3.点击用户名下的 ...

  8. android 统一推送平台,工信部实验室成立安卓统一推送联盟:推送服务将实现统一...

    据微信公众号" 泰尔终端实验室"7月19日消息,移动互联网时代,消息推送是移动应用(APP)的一项重要功能,目前中国安卓系统生态环境尚不成熟,设备碎片化现象严重,导致不同应用与操作 ...

  9. 微信每日定时推送消息新闻到群聊或朋友

    本项目使用python来完成每日在群聊中或者给朋友推送新闻.主要使用python的wxauto库来完成此功能. 想要完成以上任务,需要安装3.8.10版本的python和最新版本的PC端微信. 另外, ...

最新文章

  1. 浏览器市场占有率_分水岭初现 全球浏览器市场现状及竞争格局分析
  2. 以服务的方式提供站点基础功能支持
  3. 【中文模板】Latex如何写中文文档
  4. 根据皮肤亮度来区分salmon和sea bass,这个比较好
  5. Spring Boot————Web应用启动时自动执行ApplicationListener用法
  6. 十句保你职场不败的名言
  7. as3.0 mysql_RedhatAS3.0上安装Apache2+PHP5+MySQL+Resin+SSL+GD+weba_PHP教程
  8. 计算机组成原理 mov(r0),-(sp),第三章作业
  9. [leetcode] Power of Two 判断一个数是否是2的平方
  10. 【图解】QT 布局、 sizeHint和SizePolicy概念
  11. 关于安装Turn服务器:coturn,TurnServer,Restund,reTurnServer
  12. 十分钟快速自制CMSIS_DAP仿真器~将ST-LINK-V2变身DAP仿真器~
  13. WindowsMac本地搭建Code-Push-Server热更新服务器
  14. [Unity小游戏]打砖块(打方块)教程(超详细)
  15. idea 重启之后 IntelliJ IDEA 一直在indexing
  16. go-excel文档
  17. 【内卷数据结构】顺序表超详细解析 | 从零开始步步解读 | 画图理解+调试分析 | 菜单制作
  18. [高数][高昆轮][高等数学上][第一章-函数与极限]08.函数的连续性与间断点
  19. 2022-2028全球与中国侧装车载摄像头市场现状及未来发展趋势
  20. 用C 绘制实时曲线图

热门文章

  1. 计算机毕业设计Java在线选课系统设计(系统+程序+mysql数据库+Lw文档)
  2. SLAM流程之视觉前端
  3. 服务器阻止程序运行怎么破,Discuz论坛对服务器的请求已遭到某个扩展程序的阻止问题解决方法...
  4. 东南亚痴狂诈骗的背后,意外暴露一个大型“围猎”程序员的现场
  5. 面试进行曲之技术面试(项目经验)
  6. 怎么备份VMware虚拟磁盘文件或移植到其他虚拟机
  7. Linux定时重启任务示例
  8. OOM系列之一:java.lang.OutOfMemoryError: Java堆空间问题详解
  9. C# 使用反射获取私有属性的方法
  10. 杰普实训日记 授课内容 第一天 讲师:李春雨