当前位置: 首页 > news >正文

Android 周期任务

AlarmManager使用

1.创建意图

// 创建意图,启动MonthlyTaskServiceIntent intent = new Intent(getContext(), TimeTaskService.class);
// 传递数据intent.putExtra(TimeTaskService.KEY_TITLE,userRemind.getTitle());intent.putExtra(TimeTaskService.KEY_DEC,userRemind.getDescription());

TimeTaskService.class 是任务执行的具体内容。是一个服务

public class TimeTaskService extends Service {public static final String KEY_TITLE = "key_title";public static final String KEY_DEC = "key_dsc";public TimeTaskService() {}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// 执行任务逻辑LogUtil.i("shawn", "onStartCommand 任务执行");String string = intent.getStringExtra(KEY_TITLE);String dec = intent.getStringExtra(KEY_DEC);// 任务完成后,停止服务stopSelf();return START_NOT_STICKY;}@Overridepublic IBinder onBind(Intent intent) {return null;}
}

创建通知

private void showNotification(String title, String description) {if (StringUtils.isEmpty(title) || StringUtils.isEmpty(description)) {return;}NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);// 设置通知点击事件Intent notificationIntent = new Intent(getContext(), MainActivity.class);notificationIntent.putExtra(NotificationConstants.NOTIFICATION_KEY, NotificationConstants.NOTIFICATION_VALUE);PendingIntent pendingIntent = PendingIntent.getActivity(getContext(), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);Notification.Builder notificationBuilder;// 创建通知渠道if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {NotificationChannel channel = new NotificationChannel(NotificationConstants.NOTIFICATION_CHANNEL_ID, NotificationConstants.NOTIFICATION_CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);channel.setDescription(NotificationConstants.NOTIFICATION_CHANNEL_DESC);notificationManager.createNotificationChannel(channel);// 构建通知notificationBuilder = (new Notification.Builder(getContext(), NotificationConstants.NOTIFICATION_CHANNEL_ID))
//                    .setLargeIcon(BitmapFactory.decodeResource(this.getResources(), R.drawable.app_icon)).setSmallIcon(R.drawable.app_icon).setContentTitle(title).setContentText(description).setContentIntent(pendingIntent).setAutoCancel(true);// 设置点击通知后自动取消通知// 启动前台服务startForeground(NotificationConstants.FOREGROUND_ID, notificationBuilder.build());} else {// 构建通知notificationBuilder = new Notification.Builder(getContext())
//                    .setLargeIcon(BitmapFactory.decodeResource(this.getResources(), R.drawable.app_icon)).setSmallIcon(R.drawable.app_icon).setContentTitle(title).setContentText(description).setContentIntent(pendingIntent).setPriority(Notification.PRIORITY_DEFAULT).setAutoCancel(true);// 设置点击通知后自动取消通知}// 发送通知notificationManager.notify(NotificationConstants.NOTIFICATION_ID, notificationBuilder.build());}

注意:在android 8.0以上 启动服务时,要启动前台通知。告知用户。否则会崩溃

2.创建PendingIntent

PendingIntent pendingIntent;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {pendingIntent = PendingIntent.getForegroundService(getContext(),(int) requestCode,intent,PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);} else {pendingIntent = PendingIntent.getService(getContext(),(int) requestCode,intent,PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);}

注意:在使用场景中,经过测试发现。如果把进程杀掉,则任务不执行。所以,在上面的代码中,判断当前版本,大于等于 android 26时,使用PendingIntent.getForegroundService 启动前台服务的方式获取pendingIntent 。经测试,就算杀掉进程,任务也可以执行。

3.启动任务

闹钟触发方式

// 注意:在实际应用中,你可能需要根据实际需求选择合适的触发方式,// 例如使用RTC_WAKEUP替代RTC,确保在设备休眠时也能唤醒系统执行任务// 闹钟类型// ELAPSED_REALTIME - 基于自设备启动以来所经过的时间触发待定 intent,但不会唤醒设备。经过的时间包括设备处于休眠状态期间的任何时间。// ELAPSED_REALTIME_WAKEUP - 唤醒设备,并在自设备启动以来特定时间过去之后触发待定 Intent。// RTC - 在指定的时间触发待定 Intent,但不会唤醒设备。// RTC_WAKEUP - 唤醒设备以在指定的时间触发待定 Intent。

执行1次性任务

// 获取AlarmManager实例AlarmManager alarmManager = (AlarmManager) getApplication().getSystemService(Context.ALARM_SERVICE);if (repetitionType == MyConstants.REPEAT_NO) {if (alarmManager != null && pendingIntent != null) {// 设置一次性闹钟LogUtil.i("shawn", "设置一次性闹钟");
//                alarmManager.set(
//                        AlarmManager.RTC_WAKEUP,
//                        triggerAtMillis,
//                        pendingIntent
//                );
// 设置精确闹钟
// 设置精确重复闹钟//低电耗模式和应用待机模式的影响//为了延长设备的电池续航时间,我们在 Android 6.0(API 级别 23)中引入了低电耗模式和应用待机模式。// 当设备处于低电耗模式时,所有标准闹钟都会推迟,直到设备退出低电耗模式或维护期开始。// 如果必须让某个闹钟在低电耗模式下也能触发,// 可以使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()。// 您的应用将在处于空闲状态时(即用户在一段时间内未使用应用,并且应用没有前台进程时)进入应用待机模式。// 当应用处于应用待机模式时,闹钟会像设备处于低电耗模式一样被延迟。// 当应用不再处于空闲状态或者当设备接通电源时,该限制便会解除alarmManager.setExact(AlarmManager.RTC_WAKEUP,triggerAtMillis,pendingIntent);}return;}

上面代码有2种任务执行类型,alarmManager.set 设置的不精确闹钟,setExact设置的是精确闹钟,如果对任务的执行时间没有严格的要求,建议使用set方法,对设备的电量友好。

triggerAtMillis:任务执行的时间

设置重复闹钟

if (alarmManager != null && pendingIntent != null) {// 设置重复闹钟alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,triggerAtMillis,intervalMillis,pendingIntent);}

参数解释:

AlarmManager.RTC_WAKEUP:闹钟触发方式
triggerAtMillis:执行时间
intervalMillis:间隔时间
pendingIntent:任务执行内容

4.任务取消

Intent intent = new Intent(getContext(), TimeTaskService.class);intent.setAction("com.calendar.timeTaskService");AlarmManager alarmManager = (AlarmManager) getApplication().getSystemService(Context.ALARM_SERVICE);PendingIntent pendingIntent;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {pendingIntent = PendingIntent.getForegroundService(getContext(),(int) aLong,intent,PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);LogUtil.i("shawn","getForegroundService job");} else {pendingIntent = PendingIntent.getService(getContext(),(int) aLong,intent,PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);LogUtil.i("shawn","getService job");}if (pendingIntent != null) {LogUtil.i("shawn","cancel job");alarmManager.cancel(pendingIntent);} else {LogUtil.i("shawn","pendingIntent is null");}

5.任务查看

adb shell dumpsys alarm > abc.txt

通过使用adb命令,可以查看当前系统的所有alarm任务,然后筛选包名,查看任务

 u0a647:com.calendar.master.gp +11ms running, 1 wakeups:+11ms 1 wakes 1 alarms, last -2m15s264ms:*walarm*:com.calendar.master.gp/.ui.calendar.TimeTaskService

6.参考

关于Android中设置闹钟的相对完善的解决方案

相关文章:

Android 周期任务

AlarmManager使用 1.创建意图 // 创建意图,启动MonthlyTaskServiceIntent intent new Intent(getContext(), TimeTaskService.class); // 传递数据intent.putExtra(TimeTaskService.KEY_TITLE,userRemind.getTitle());intent.putExtra(TimeTaskService.KEY_DEC,u…...

修改第三方组件默认样式

深度选择器 修改el-input的样式&#xff1a; <el-input class"input-area"></el-input>查看DOM结构&#xff1a; 原本使用 /deep/ 但是可能不兼容 使用 :deep .input-area {:deep(.el-input__inner){background-color: blue;} }将 input 框背景色改为…...

【游戏客户端】制作你玩我猜Like玩法

【游戏客户端】制作你玩我猜Like玩法 大家好&#xff0c;我是Lampard猿奋~~ “你画我猜”相信大家都不陌生&#xff0c;当初这款小游戏可谓茶余饭后必玩之选&#xff0c;风头一时无二。今天要和大家分享如何实现一个你玩我猜Like的玩法。 我们可以简单的把需求拆成两个个部分&…...

分页查询从接口到实现,统一对日期类型进行格式化处理

编写Service实现类编写Mapper的sql&#xff0c;但复杂的sql语句需要写到mapper对应的xml文件中日期类型格式化处理 /*** 扩展springmvc框架的消息转换器* param converters*/Overrideprotected void extendMessageConverters(List<HttpMessageConverter<?>> conve…...

栈和队列详解(1)

目录 一、什么是栈&#xff1f; 二、创建一个我们自己的栈 1.前置准备 1.1需要的三个文件 1.2结构体的创建和头文件的引用 2.接口的实现 2.1初始化栈结构体 2.2尾插(压栈) 2.3栈存放的元素个数和判断栈是否为空 2.4获取栈顶元素 2.5出栈 2.6摧毁栈 2.7测试接口 三、…...

苏州OV泛域名RSA加密算法https

RSA加密算法是一种非对称加密算法&#xff0c;它被广泛应用于信息安全领域。与对称加密算法不同&#xff0c;RSA加密算法使用了两个密钥&#xff0c;一个公钥和一个私钥。公钥可以公开&#xff0c;任何人都可以使用它加密信息&#xff0c;但只有私钥的持有者才能解密信息。RSA加…...

凯迪正大—微机继电保护校验仪

一、继电保护测试仪产品概述 KDJB-802继电保护测试仪是在参照电力部颁发的《微机型继电保护试验装置技术条件&#xff08;讨论稿&#xff09;》的基础上&#xff0c;听取用户意见&#xff0c;总结目前国内同类产品优缺点&#xff0c;充分使用现代的微电子技术和器件实现的一种新…...

Linux文件属性与权限管理(可读、可写、可执行)

Linux把所有文件和设备都当作文件来管理&#xff0c;这些文件都在根目录下&#xff0c;同时Linux中的文件名区分大小写。 一、文件属性 使用ls -l命令查看文件详情&#xff1a; 1、每行代表一个文件&#xff0c;每行的第一个字符代表文件类型&#xff0c;linux文件类型包括&am…...

Centos7.9安装lrzsz进行文件传输---Linux工作笔记059

这里咱们lrzsz命令,需要用来进行文件传输,因为如果不安装这个命令的话,那么 传输安装包什么的就不方便因为只有少数传输工具,才支持,直接拖拽的.没有的时候就可以用这个工具,用命令来传输 直接就是: sz 文件名 就可以把文件下载下来 rz 选择一个文件, 就可以把文件上传到当…...

酒吧座位全解析 小白必看

相信还有很多第一次去酒吧的朋友们还不了解吧台、散台、卡座的区分&#xff0c;下面我简单解说一下&#xff0c;如有错漏&#xff0c;欢迎指正&#xff01;一、吧台吧台是酒吧的核心部位&#xff0c;走进酒吧门&#xff0c;首先映入眼帘的就是吧台&#xff0c;一排人围着吧台几…...

DAY19

题目一 空间尝试模型 一个样本做行一个样本做列 范围尝试模型 以....做分隔 dp[i][j] 为以i为左界限 以j为右界限 求这个范围内的计算值(不对 是方法数) 这& | ^ 都是双目运算符 观察一下规律 整体字符数量一定为奇数(包括运算符和数字) 对应到数组中 数组的位一定是偶数…...

Data analysis|Tableau基本介绍及可实现功能

一、基础知识介绍 &#xff08;一&#xff09;什么是tableau tableau 成立于 2003 年&#xff0c;是斯坦福大学一个计算机科学项目的成果&#xff0c;该项目旨在改善分析流程并让人们能够通过可视化更轻松地使用数据。Tableau可以帮助用户更好地理解和发现数据中的价值&#x…...

单元测试优化:为什么要对程序进行测试?测试有什么好处?

单元测试&#xff08;Unit Testing&#xff09;又称为模块测试, 是针对程序模块&#xff08;软件设计的最小单位&#xff09;来进行正确性检验的测试工作。 程序单元是应用的最小可测试部件。简单来说&#xff0c;就是测试数据的稳定性是否达到程序的预期。 我们日常开发时可能…...

自动装配在Spring Boot中的重要性及实现方式

这里写目录标题 自动装配在Spring Boot中的重要性及实现方式什么是自动装配&#xff1f;如何实现自动装配&#xff1f;如何使用自动装配自动装配的优势总结 手写自动装配的Java代码示例原理 自动装配在Spring Boot中的重要性及实现方式 Spring Boot是基于Spring框架的开源框架…...

校对软件在司法系统中的应用:加强刑事文书审查

校对软件在司法系统中的应用可以加强刑事文书审查&#xff0c;提高文书的准确性和可靠性。 以下是校对软件在刑事文书审查方面的应用&#xff1a; 1.语法和拼写检查&#xff1a;校对软件可以自动检查刑事文书中的语法错误和拼写错误。这包括句子结构、主谓一致、动词形式等方面…...

微信小程序上传图片和文件

1.从微信里选择图片或文件上传 使用的vant的上传组件 原生用 wx.chooseMessageFile() html <!-- 从微信上面选择文件 --><van-uploader file-list"{{ file }}" bind:after-read"afterRead" max-count"{{3}}" deletable"{{ true…...

拥抱AIGC浪潮,亚信科技将如何把握时代新增量?

去年底&#xff0c;由ChatGPT带起的AIGC浪潮以迅雷不及掩耳之势席卷全球。 当互联网技术的人口红利逐渐消退之际&#xff0c;AIGC就像打开通用人工智能大门的那把秘钥&#xff0c;加速开启数智化时代的到来。正如OpenAI CEO Sam Altman所言&#xff1a;一个全新的摩尔定律可能…...

【opencv】指定宽或高按比例缩放图片 拼接图片

指定宽或高按比例缩放图片 import cv2def resize_by_ratio(image, widthNone, heightNone, intercv2.INTER_AREA):img_new_size None(h, w) image.shape[:2] # 获得高度和宽度if width is None and height is None: # 如果输入的宽度和高度都为空return image # 直接返回原图…...

使用C#加载TOOLBLOCK

前言 因为Vpp文件类型包含了以下三种 QuickBuidJobToolBlock 不同类型的打开方式不同&#xff0c;需要提前知道vpp是什么类型 例如 这个TB.vpp文件是TOOLBLOCK&#xff0c;就不能直接在visionpro中打开&#xff08;直接打开需要QuickBuid文件&#xff09;&#xff0c; 可以…...

MPAS-A原理及陆面模式的基本概念

跨尺度预测模式&#xff08;The Model for Prediction Across Scales - MPAS&#xff09;是由洛斯阿拉莫斯实验室和美国国家大气研究中心(NCAR)共同开发&#xff0c;其由3个部分组成&#xff0c;分别称为 MPAS-A&#xff08;大气模型&#xff09;、MPAS-O&#xff08;海洋模型&…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...