Android中实现工作日与周末差异化本地通知的完整教程

千涛酱_5276

千涛酱_5276

2026-09-24

456人浏览

原创

Android中实现工作日与周末差异化本地通知的完整教程

本文详解如何基于用户选择的时间,在android中通过alarmmanager精准调度工作日(周一至周五)和周末(周六、周日)两类差异化本地通知,并提供calendar判断逻辑、闹钟设置策略及关键注意事项。

本文详解如何基于用户选择的时间,在android中通过alarmmanager精准调度工作日(周一至周五)和周末(周六、周日)两类差异化本地通知,并提供calendar判断逻辑、闹钟设置策略及关键注意事项。

在Android中实现“工作日 vs 周末”差异化本地通知,核心在于动态解析目标时间所属的星期类型,并据此配置不同的重复触发规则。虽然AlarmManager本身不直接支持“仅工作日”或“仅周末”重复模式,但可通过组合使用setRepeating()(已弃用)或更推荐的setExactAndAllowWhileIdle() + 手动重设机制,配合Calendar.DAY_OF_WEEK判断,实现高精度调度。

✅ 步骤一:获取并解析用户选择的时间

假设你已通过TimePicker获取小时(hourOfDay)和分钟(minute),需将其与当前日期(或指定基准日期)结合,构建目标触发时刻:

fun buildTargetCalendar(hour: Int, minute: Int): Calendar {
    val calendar = Calendar.getInstance()
    calendar.timeInMillis = System.currentTimeMillis()
    calendar.set(Calendar.HOUR_OF_DAY, hour)
    calendar.set(Calendar.MINUTE, minute)
    calendar.set(Calendar.SECOND, 0)
    calendar.set(Calendar.MILLISECOND, 0)
    // 若当前时间已过,则顺延至明日
    if (calendar.timeInMillis <h3>✅ 步骤二:判断星期类型并设置对应闹钟</h3><p>关键逻辑:使用<code>Calendar.DAY_OF_WEEK</code>获取整数值(<code>Calendar.MONDAY=2</code>, <code>SUNDAY=1</code>, <code>SATURDAY=7</code>),再按需分发:</p><div class="aritcle_card flexRow artxards">
											<div class="artcardd flexRow">
												<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill3166" title="Tiktok Android"><img
														src="https://img.php.cn/upload/skill/000/000/081/178947023855064.jpg" alt="Tiktok Android" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
												<div class="aritcle_card_info flexColumn">
													<a rel="nofollow" href="/xiazai/skill3166" title="Tiktok Android" class="overflowclass">Tiktok Android</a>
													<p class="overflowclass">使用ADB自动化Android上的TikTok互动。搜索话题,使用AI或模板评论,包含设置向导。用于TikTok自动化营销和通过策略性评论建立社交影响力。</p>
												</div>
												<a rel="nofollow" href="/xiazai/skill3166" title="Tiktok Android" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
												</a>
											</div>
										</div><pre class="brush:php;toolbar:false;">private fun scheduleNotificationForDayType(
    hour: Int,
    minute: Int,
    isWeekdaysOnly: Boolean = true // true→仅周一至五;false→仅周六、日
) {
    val baseCalendar = buildTargetCalendar(hour, minute)
    val dayOfWeek = baseCalendar.get(Calendar.DAY_OF_WEEK)
    val isWeekend = dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY

    // 根据业务需求决定是否跳过/触发本次通知
    if (isWeekdaysOnly && isWeekend) return
    if (!isWeekdaysOnly && !isWeekend) return

    // 设置单次精确闹钟(推荐替代已废弃的setRepeating)
    val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
    val intent = Intent(this, NotificationReceiver::class.java).apply {
        putExtra("NOTIFICATION_TYPE", if (isWeekdaysOnly) "WEEKDAY" else "WEEKEND")
    }
    val pendingIntent = PendingIntent.getBroadcast(
        this, 
        0, 
        intent, 
        PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_ONE_SHOT
    )

    alarmManager.setExactAndAllowWhileIdle(
        AlarmManager.RTC_WAKEUP,
        baseCalendar.timeInMillis,
        pendingIntent
    )

    // ⚠️ 重要:通知触发后,需在BroadcastReceiver中重新计算下一次符合规则的时间并再次setExactAndAllowWhileIdle
    // (实现“智能重复”,例如:若今天是周五,下次应设为下周一而非周六)
}

✅ 步骤三:在BroadcastReceiver中实现智能重调度

NotificationReceiver.onReceive()中,根据当前触发类型(WEEKDAY/WEEKEND),计算下一个有效日期:

override fun onReceive(context: Context, intent: Intent) {
    val type = intent.getStringExtra("NOTIFICATION_TYPE") ?: return
    val calendar = Calendar.getInstance()
    calendar.timeInMillis = System.currentTimeMillis()

    // 计算下一个匹配日期:例如,若今日是周五且为WEEKDAY通知,则+3天到下周一
    when (type) {
        "WEEKDAY" -> {
            val day = calendar.get(Calendar.DAY_OF_WEEK)
            val addDays = when (day) {
                Calendar.FRIDAY -> 3
                Calendar.SATURDAY -> 2
                Calendar.SUNDAY -> 1
                else -> 1
            }
            calendar.add(Calendar.DAY_OF_MONTH, addDays)
        }
        "WEEKEND" -> {
            val day = calendar.get(Calendar.DAY_OF_WEEK)
            val addDays = when (day) {
                Calendar.FRIDAY -> 1
                Calendar.SATURDAY -> 2
                Calendar.SUNDAY -> 1 // 周日→下周六需+6天?按需调整逻辑
                else -> 1
            }
            calendar.add(Calendar.DAY_OF_MONTH, addDays)
        }
    }

    // 重设闹钟(同上setExactAndAllowWhileIdle逻辑)
    rescheduleAlarm(context, calendar)

    // 发送通知...
    showLocalNotification(context)
}

⚠️ 关键注意事项

  • Android 8.0+ 后台限制:setRepeating() 在后台可能失效,必须使用 setExactAndAllowWhileIdle() + 手动重设;
  • Doze模式兼容:setExactAndAllowWhileIdle() 可绕过Doze延迟,但每9分钟最多触发1次,高频场景需权衡;
  • 权限声明:Android 12+ 需声明 <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"></uses-permission> 并请求用户授权;
  • 测试建议:使用 adb shell dumpsys alarm 检查闹钟注册状态,避免因时间计算错误导致漏触发。

通过上述结构化实现,你不仅能区分工作日与周末发送不同内容的通知,还能确保在现代Android版本中稳定、合规地长期运行。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

android

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

2023.08.14

862

4

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.22

2487

5

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

2023.09.19

4557

7

android重启应用的方法有哪些
android重启应用的方法有哪些

android重启应用有通过Intent、PendingIntent、系统服务、Runtime等方法。本专题为大家提供Android相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

565

5

Android语音播放功能实现方法
Android语音播放功能实现方法

实现方法有使用MediaPlayer实现、使用SoundPool实现两种。可以根据具体的需求选择适合的方法进行实现。想了解更多语音播放的相关内容,可以阅读本专题下面的文章。

2024.03.01

904

5

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

60

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

20

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

20

15

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

2026.09.22

20

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 43.3万人学习

Java 教程
Java 教程

共578课时 | 186.7万人学习

Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共64课时 | 9.3万人学习