首页/新闻资讯/正文详情

Android AlarmManager - AlarmManager 初识、精确闹钟权限、闹钟覆盖

发布时间:2026/9/26 17:06:28 来源:云帆数科 栏目:资讯中心
Android AlarmManager - AlarmManager 初识、精确闹钟权限、闹钟覆盖
一、AlarmManager 初识1、基本介绍AlarmManager 是 Android 系统提供的全局定时服务用于在指定时间触发任务从 Android 4.4API 19开始系统默认将闹钟调整为不精确的以批量处理任务、减少设备唤醒从而显著省电只有在特殊需求时才应使用精确闹钟例如闹钟应用设置闹钟前需要先确定时间基准主要如下两种类型说明ELAPSED_REALTIME系统启动后经过的时间适用于相对时间间隔的场景RTC真实世界时间适用于特定时刻触发的场景XXX_WAKEUP类型的闹钟例如RTC_WAKEUP能在设备休眠时唤醒 CPU非唤醒版本的闹钟要等到设备下次自然唤醒才能执行2、演示1ReceiverMyAlarmReceiver.javapublicclassMyAlarmReceiverextendsBroadcastReceiver{publicstaticfinalStringTAGMyAlarmReceiver.class.getSimpleName();OverridepublicvoidonReceive(Contextcontext,Intentintent){Log.i(TAG,触发了);}}AndroidManifest.xmlreceiverandroid:name.receiver.MyAlarmReceiverandroid:exportedfalse/2ActivityButtonbtnSetAlarmfindViewById(R.id.btn_set_alarm);btnSetAlarm.setOnClickListener(v-{AlarmManageralarmManager(AlarmManager)getSystemService(ALARM_SERVICE);IntentintentnewIntent(this,MyAlarmReceiver.class);PendingIntentpendingIntentPendingIntent.getBroadcast(this,0,intent,PendingIntent.FLAG_IMMUTABLE);alarmManager.set(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()5*1000,pendingIntent);});二、精确闹钟权限1、基本介绍从 Android 12 开始使用精确闹钟必须声明权限否则报错从 Android 12 开始调用精确闹钟前务必使用 canScheduleExactAlarms 方法检查权限2、演示执行如下代码Android 10 正常执行Android 13 报错错误信息如下ButtonbtnSetAlarmfindViewById(R.id.btn_set_alarm);btnSetAlarm.setOnClickListener(v-{AlarmManageralarmManager(AlarmManager)getSystemService(ALARM_SERVICE);IntentintentnewIntent(this,MyAlarmReceiver.class);PendingIntentpendingIntentPendingIntent.getBroadcast(this,0,intent,PendingIntent.FLAG_IMMUTABLE);alarmManager.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()5*1000,pendingIntent);});# 输出结果 FATAL EXCEPTION: main Process: com.my.alarmmanager, PID: 4754 java.lang.SecurityException: Caller com.my.alarmmanager needs to hold android.permission.SCHEDULE_EXACT_ALARM or android.permission.USE_EXACT_ALARM to set exact alarms.Android 13 执行如下代码检查权限AlarmManageralarmManager(AlarmManager)getSystemService(ALARM_SERVICE);if(Build.VERSION.SDK_INTBuild.VERSION_CODES.S){Log.i(TAG,Android 12 及以上);booleanresultalarmManager.canScheduleExactAlarms();Log.i(TAG,result: result);}else{Log.i(TAG,Android 12 以下);}# 输出结果 Android 12 及以上 result: false3、请求权限在 AndroidManifest.xml 文件中声明权限uses-permission android:nameandroid.permission.SCHEDULE_EXACT_ALARM /检查权限与引导授权publicclassMainActivityextendsAppCompatActivity{publicstaticfinalStringTAGMainActivity.class.getSimpleName();privateAlarmManageralarmManager;SuppressWarnings(all)OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)-{InsetssystemBarsinsets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});alarmManager(AlarmManager)getSystemService(ALARM_SERVICE);if(checkExactAlarmPermission()){next();}else{ActivityResultLauncherIntentintentActivityResultLauncherregisterForActivityResult(newActivityResultContracts.StartActivityForResult(),o-{booleanresultalarmManager.canScheduleExactAlarms();if(result){next();}else{Toast.makeText(this,未获取到相关权限无法使用本功能,Toast.LENGTH_SHORT).show();finish();}});IntentintentnewIntent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM);intentActivityResultLauncher.launch(intent);}}privatebooleancheckExactAlarmPermission(){if(Build.VERSION.SDK_INTBuild.VERSION_CODES.S){Log.i(TAG,Android 12 及以上);booleanresultalarmManager.canScheduleExactAlarms();Log.i(TAG,result: result);returnresult;}else{Log.i(TAG,Android 12 以下);returntrue;}}privatevoidnext(){ButtonbtnSetAlarmfindViewById(R.id.btn_set_alarm);btnSetAlarm.setOnClickListener(v-{AlarmManageralarmManager(AlarmManager)getSystemService(ALARM_SERVICE);IntentintentnewIntent(this,MyAlarmReceiver.class);PendingIntentpendingIntentPendingIntent.getBroadcast(this,0,intent,PendingIntent.FLAG_IMMUTABLE);alarmManager.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()5*1000,pendingIntent);});}}三、闹钟覆盖1、演示1ReceiverTestAlarmReceiver.javapublicclassTestAlarmReceiverextendsBroadcastReceiver{publicstaticfinalStringTAGTestAlarmReceiver.class.getSimpleName();SuppressWarnings(all)OverridepublicvoidonReceive(Contextcontext,Intentintent){LocalDateTimedateTimeLocalDateTime.now();DateTimeFormatterformatterDateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss);StringstrdateTime.format(formatter);Log.i(TAG,onReceive: str);Log.i(TAG,触发了);}}AndroidManifest.xmlreceiverandroid:name.receiver.TestAlarmReceiverandroid:exportedfalse/2ActivityButtonbtnSetAlarmfindViewById(R.id.btn_set_alarm);btnSetAlarm.setOnClickListener(v-{LocalDateTimedateTimeLocalDateTime.now();DateTimeFormatterformatterDateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss);StringstrdateTime.format(formatter);Log.i(TAG,btnSetAlarm click: str);AlarmManageralarmManager(AlarmManager)getSystemService(ALARM_SERVICE);IntentintentnewIntent(this,TestAlarmReceiver.class);PendingIntentpendingIntentPendingIntent.getBroadcast(this,0,intent,PendingIntent.FLAG_IMMUTABLE);alarmManager.set(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()5000,pendingIntent);});3Test连续两次按钮输出如下内容btnSetAlarm click: 2026-06-15 10:01:53 btnSetAlarm click: 2026-06-15 10:01:56 onReceive: 2026-06-15 10:02:01 触发了2、基本介绍AlarmManager 判断两个闹钟是否为同一个任务是通过 PendingIntent 来进行匹配的两次执行时requestCode 都是 0Intent 也都是指向TestAlarmReceiver.class的因此生成的 PendingIntent 都是相同的第二次设置的闹钟会直接覆盖第一次设置的闹钟最终系统只会保留并触发第二次设置的闹钟

相关推荐

性能分析工程实践:从CodeWarrior Profiler看经典工具的核心原理与优化策略
性能分析工程实践:从CodeWarrior Profiler看经典工具的核心原理与优化策略

1. 项目概述:性能分析的价值与CodeWarrior Profiler的角色在桌面应用、嵌入式系统乃至游戏开发的早期黄金年代,性能优化与其说是一门科学,不如说是一门艺术。你无法凭空猜测哪段代码是拖慢整个应用的罪魁祸首,尤其是在资源受限的6… · 2026/9/25 7:17:48

CIO 的第一视角:旧式企业 IM 正在拖慢业务决策的三重死结
CIO 的第一视角:旧式企业 IM 正在拖慢业务决策的三重死结

CIO 的第一视角:旧式企业 IM 正在拖慢业务决策的三重死结 当 CIO 审视 2026 年的数字化投入时,会发现一个被长期忽视的短板:沿用多年的企业 IM,正在成为业务决策链条中最隐蔽的减速器。这不是功能缺失的问题,而是定位错… · 2026/9/25 22:11:34

强烈推荐:智能电视最全ADB软件合集!可以给电视或者盒子安装软件的工具!安卓端电脑端都有
强烈推荐:智能电视最全ADB软件合集!可以给电视或者盒子安装软件的工具!安卓端电脑端都有

ADB工具其实特别实用,要是你刚好碰到下面这几种情况,强烈建议先收藏备用: 清理手机自带的流氓软件:现在新手机出厂总塞一堆App,说白了就是厂商为了赚推广费。用ADB就能把这些占地方又卸不掉的预装软件给干掉。 搞定电… · 2026/9/26 4:16:51

SpringBoot+Vue+MySQL招聘系统毕设全解析:从设计到部署
SpringBoot+Vue+MySQL招聘系统毕设全解析:从设计到部署

也到了每年毕设季扎堆的时候了。每次都有学弟学妹拿着类似的选题来问我:SpringBootVue招聘系统行不行、好不好做、有没有完整的源码项目可以抄作业。说实话,这种“SpringBootVueMySQL”三段式的全栈项目,在Java方向的毕业设计里,确… · 2026/9/26 17:06:27

macOS原生QMC解密方案:TeaCipher+动态密钥实战
macOS原生QMC解密方案:TeaCipher+动态密钥实战

简介:本资源是一款专为macOS平台开发的QQ音乐QMC加密音频格式批量转换工具,面向计算机科学、电子工程等专业学生及Python/Swift初学者,解决QMC专属格式(如qmcflac、qmc0、qmc3、mflac)无法被通用播放器识别的核心问题&… · 2026/9/26 17:06:27

基于PHP的短网址生成系统:自增ID与62进制映射原理及部署指南
基于PHP的短网址生成系统:自增ID与62进制映射原理及部署指南

简介:黑色简洁的PHP短网址/短链接生成源码是一套可直接部署的完整项目,面向需要自建短链服务的站长、网络爱好者与PHP开发者,可解决长链接冗长难记、外链地址分散、访问效果无法统计等问题。前端提供简洁优雅的响应式设计,支持创建… · 2026/9/26 17:06:27

Flutter第三方库鸿蒙化实战:音频流下载与元数据透传
Flutter第三方库鸿蒙化实战:音频流下载与元数据透传

年初接到一个跨平台音乐项目的鸿蒙化任务时,我原本以为只是把 Flutter 工程在 HarmonyOS 上重新编译一遍。真正开始碰soundcloud_explode_dart这个第三方库才发现,鸿蒙化的难点根本不在“能不能跑起来”,而在“跑起来之后,解析、下… · 2026/9/26 17:06:27

OpenClaw 70+技能完全指南:用 TaoToken 统一 Key 从 0 到 1 搭建 AI 自动化帝国
OpenClaw 70+技能完全指南:用 TaoToken 统一 Key 从 0 到 1 搭建 AI 自动化帝国

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 17:06:27

PHP+Node.js+Vue三件套:数据库原理课程平台开发实战
PHP+Node.js+Vue三件套:数据库原理课程平台开发实战

明知是个课程平台,我接手时还是被标题里的三件套组合震了一下:Node.js、PHP、Vue,外加数据库原理这门课。第一反应是“是不是过度设计了”,等项目真正拆完才发现,这种组合恰恰是高校和培训机构里数据库原理课程平台的典… · 2026/9/26 17:06:17

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码