效果图

来看分析和讲解之前,先看看效果吧,效果图如下:

设置界面 
 
闹钟提醒界面 

AlarmManager

对于AlarmManager里的方法我就不逐一介绍了,如果都介绍讲完估计就天黑了。AlarmManager这个类提供对系统闹钟服务的访问接口。 
在API 19 以前,AlarmManager的常用方法有三个: 
* set(int type,long startTime,PendingIntent pi); 
该方法用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动作。 
* setRepeating(int type,long startTime,long intervalTime,PendingIntent pi); 
该方法用于设置重复闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟首次执行时间,第三个参数表示闹钟两次执行的间隔时间,第三个参数表示闹钟响应动作。 
* setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi); 
该方法也用于设置重复闹钟,与第二个方法相似,不过其两个闹钟执行的间隔时间不是固定的而已。

从API 19开始,AlarmManager的机制都是非准确传递,操作系统将会转换闹钟,来最小化唤醒和电池使用。targetSdkVersion在API 19之前应用仍将继续使用以前的行为,所有的闹钟在要求准确传递的情况下都会准确传递。

从API 19以后,则采用了如下方法: 
* setWindow(int, long, long, PendingIntent) 
* setExact(int, long, PendingIntent) 
从上面的两个方法我们可以看出,没有了repeat,就是设置了闹钟只能响一次了,而且这两种方法都可以设置精确的,第一个相对于第二种方法来说,应该是比较省电的。因为setWindow这个方法允许应用程序利用电池优化来自交货批处理即使它适度的及时性要求警报。

主要问题

  1. API 19以后没有了重复设置,那如果设置一个闹钟每天都准确提醒呢?
  2. 手机重启之后,设置的闹钟是否还有效?
  3. 应用程序被杀死之后,闹钟是否还有效?

说实话,这些问题我相信大家肯定都遇到过,而且解决起来相当费劲,确实是。来看我们如何一一解决吧。

解决遇到的坑

API 19以后如何设置重复闹钟

我们知道,我们在使用AlarmManager设置了提醒之后,是通过广播接收的,设置的提醒时间一到,系统发送我们自定义的广播,我们接收到,应用程序提醒。那提醒的时候,我们可以再重新设置一次嘛,这就解决了API 19设置重复闹钟的问题。

PendingIntent sender = PendingIntent.getBroadcast(context, id, intent, PendingIntent.FLAG_CANCEL_CURRENT);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {am.setWindow(AlarmManager.RTC_WAKEUP, calMethod(week, calendar.getTimeInMillis()),intervalMillis, sender);} else {if (flag == 0) {am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);} else {am.setRepeating(AlarmManager.RTC_WAKEUP, calMethod(week, calendar.getTimeInMillis()), intervalMillis, sender);}}

根据判断系统版本,使用不同的设置闹钟的方法,进行设置。接下来我们通过广播接收系统发来的通知,进行闹钟提醒。

public class LoongggAlarmReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubString msg = intent.getStringExtra("msg");long intervalMillis = intent.getLongExtra("intervalMillis", 0);if (intervalMillis != 0) {AlarmManagerUtil.setAlarmTime(context, System.currentTimeMillis() + intervalMillis,intent);}int flag = intent.getIntExtra("soundOrVibrator", 0);Intent clockIntent = new Intent(context, ClockAlarmActivity.class);clockIntent.putExtra("msg", msg);clockIntent.putExtra("flag", flag);clockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(clockIntent);}
}

通过上面的广播,我们可以看到,我是通过那个时间间隔是否为零来判断API 19之后是否是重复闹钟,不为0,就再重新设置一遍。我们来一起看看setAlarmTime()这个方法。如下:

 public static final String ALARM_ACTION = "com.loonggg.alarm.clock";public static void setAlarmTime(Context context, long timeInMillis, Intent intent) {AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);PendingIntent sender = PendingIntent.getBroadcast(context, intent.getIntExtra("id", 0),intent, PendingIntent.FLAG_CANCEL_CURRENT);int interval = (int) intent.getLongExtra("intervalMillis", 0);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {am.setWindow(AlarmManager.RTC_WAKEUP, timeInMillis, interval, sender);}}

就这样,重复的问题就解决了。

手机重启之后,闹钟失效怎么解决

对,手机重启之后,闹钟确实是失效了,要想解决这个问题,那就再设置一个监听手机重启的广播,等手机重启的时候,再重新设置一遍,即可解决上面的问题。

看看我在手机重启广播里调用了我封装的重新设置闹钟的方法。这样就解决了手机重启之后,闹钟失效的问题。 
注意:广播需要在清单文件注册,小伙伴们别忘记了哈。我在这里就不贴出代码来了。

应用程序被杀死,闹钟失效

可以告诉你们的是,这个还真的没有什么好的解决方案,如果你们程序里写了服务,可以在服务重启的时候,判断重新再把闹钟注册一次,或者在打开应用的时候重新注册一次,反正就是能有利于闹钟注册的地方,进行重新设置。如果闹钟设置的id是一样的,后边设置的会自动覆盖先前设置的闹钟。如果谁有比较好的解决应用程序被杀死后,闹钟失效的问题,欢迎大家提供出来分享。

这个封装的类库的好处

好处就是我把方法都给你们封装好了,直接就可以调用。 
* 直接传入时分的值就可以了。比如:直接传入某个时间点:12:30,然后传入是否是每天提醒,还是周几提醒等 
* 闹钟提醒的界面我也已经封装到里面了,还算好看,懒的同学不需要再写了,不满意的同学可以直接下载类库修改。 
* 取消闹钟的方法,我也已经进行了封装。

总之,就是非常方便,到底有多方便大家直接看demo就知道了,不满意的同学可以直接下载类库进行修改。

demo和类库地址:https://github.com/loonggg/Android-AlarmManagerClock

Android中关于闹钟提醒的解决方案相关推荐

  1. android+记事提醒,android记事本备忘录+闹钟提醒

    [实例简介] android 记事本 备忘录 + 闹钟提醒完整代码,可直接运行 [实例截图] [核心代码] notePad └── notePad7 ├── AndroidManifest.xml ├ ...

  2. 解剖android中的闹钟app 一

    首先,看一看android市场上有哪些主流的闹钟app了,我们来进行一个简单的评测: 一.正点闹钟 这是一款源自金山技术的闹钟app,其主力创始团队都是来自于金山,其装机量,下载量都是排名第一.老样子 ...

  3. Android MIUI日历闹钟提醒功能实现

    产品经理要求添加日历事件,并给此事件增加日历闹钟提醒功能,MIUI系统闹钟提醒无法自动设置,而oppo/vivo中日历中也没有闹钟提醒的功能. 解决思路 1)查找数据库表结构是否存在提醒字段 Andr ...

  4. Android中的闹钟与通知(附Demo)

    闹钟 闹钟管理器Alarm Manager 可以使用闹钟管理器触发事件,这些事件可以在特定的时刻或以固定的时间间隔发生 获得闹钟管理器:AlarmManager am=(AlarmManager)th ...

  5. Java怎么搞安卓日历提醒,Android日历有闹钟提醒功能记事功能等

    [实例简介] 好看的Android日历,里面有闹钟.提醒功能.记事功能等等 [实例截图] [核心代码] Calenda └── Calenda ├── AndroidManifest.xml ├── ...

  6. Android中DNS域名劫持问题-解决方案

    前言 在客户端进行业务接口请求时,往往会在线上出现解析JSON响应内容失败而导致的应用崩溃,但是在实际开发测试过程中却没有遇到此问题.解决办法就是对JSON解析进行异常捕获,然后将实际响应内容上报到服 ...

  7. Android中Apk签名文件不一致问题解决方案

    解决方案: 1.创建.jks签名文件.(步骤自行百度) 2.在app下的build.gradle文件里,添加签名配置signingConfigs. signingConfigs {debug {sto ...

  8. Android中使用AlarmManager设置闹钟

    场景 设置闹钟 闹钟提醒 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 新 ...

  9. android sdcard 不存在,在android中显示sdcard上不存在的文件的提醒

    以下代码可正常运行,并播放sd卡上的音乐文件. 我想在sdcard上不存在音乐文件("不存在的音乐文件")时显示警报. 我该写些什么?在android中显示sdcard上不存在的文 ...

最新文章

  1. python之路---迭代器和生成器
  2. 真相揭露:BCH开发活跃度比(Bitcoin Core)BCE低吗?
  3. 传统企业-全渠道营销解决方案-1
  4. php实现变声,PHP:用UTF-8字符串中最接近的7位ASCII等效替换变音符号
  5. linux命令(7)—— 管道符|、ps
  6. 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波15 - 锐化高通滤波器 -拉普拉斯核(二阶导数)
  7. [C++STL]map容器用法介绍
  8. 为什么要有周考?周考是用来干什么的?
  9. ancestral 箭头符号,译林版《牛津高中英语》模块五 高二上学期
  10. Spark on YARN 两种模式yarn-cluster yarn-client 面试题
  11. 【Matlab学习笔记】【函数学习】size参数
  12. CRM 客户资源管理 (一)
  13. 想进外企你应该知道的七大基本面试知识
  14. SVM 超平面计算例题
  15. termux python turtle_如何在termux上安装Python的turtle库?
  16. 神盾局第二季麦克机器人_神盾局特工第四季分集剧情介绍(1-22集)大结局
  17. springboot At least one base package must be specified的解决方式
  18. Oracle常见ORA错误及解决办法
  19. 常见企业拓扑Cisco配置:三层交换机互联、DHCP配置、路由器交换机配置、NAT静态地址转换、DMZ区域的ACL配置
  20. html 5 时代来了 视频播放还用falsh 还要找播放器 你out 了

热门文章

  1. 菜鸡的数据库基础知识
  2. FreeRadius : rlm_files
  3. AFS结束使命新产品FMS上市
  4. 数据分析方法01对比分析法
  5. 基于 Swarm 的 Docker 集群管理
  6. amd显卡关闭垂直同步 linux,A卡、N卡通用,教你如何真正的关闭垂直同步
  7. Godot Engine:多重采样抗锯齿(MultiSampling Anti-Aliasing)设置
  8. Web --- 电影网站
  9. Android之微信开放平台实现分享(分享好友和朋友圈)
  10. (7)UVM objection机制