AlarmManager是提供一种访问系统闹钟服务的方式,允许你去设置在将来的某个时间点去执行你的应用程序。当你的闹钟响起(时间到)时,在它上面注册的一个意图(Intent)将会被系统以广播发出,然后自动启动目标程序,如果它没有正在运行。注册的闹钟会被保留即使设备处于休眠中(如果闹钟在给定时间响起可以选择是否唤醒设备)。如果闹钟关闭或者重启,闹钟将被清除。

比如说我想在在每天的八点钟给用户一个通知,这里都必须用到PendingIntent,PendingIntent可以理解为Intent的封装包,简单的说就是在Intent上在加个指定的动作:

 
private static final int INTERVAL = 1000 * 60 * 60 * 24;// 24h
AlarmManager alarmService = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar instance = Calendar.getInstance();
instance.set(Calendar.HOUR_OF_DAY, 8);
instance.set(Calendar.MINUTE, 0);
instance.set(Calendar.SECOND, 0);
Intent alarmIntent = new Intent(this, AlarmclockReceive.class);
PendingIntent broadcast = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);
if(Build.VERSION.SDK_INT>=Build.VERSION.KITKAT){

alarmService.setWindow(AlarmManager.RTC_WAKEUP,calMethod(instance.getTimeInMillis()),INTERVAL,broadcast);}else{alarmService.setRepeating(AlarmManager.RTC_WAKEUP,calMethod(instance.getTimeInMillis()),INTERVAL,broadcast);

}

PendingIntent的getBroadcast中的参数的含义:

这个主要讲解第四个参数Flags:

PendingIntent的Flags为0代表该PendingIntent不带数据

Flags为FLAG_CANCEL_CURRENT :如果AlarmManager管理的PendingIntent已经存在,那么将会取消当前的PendingIntent,从而创建一个新的PendingIntent

Flags为PendingIntent.FLAG_UPDATE_CURRENT,

PendingIntentcontentIntent = PendingIntent.getBroadcast(context, num,intent,PendingIntent.FLAG_UPDATE_CURRENT);

对于FLAG_UPDATE_CURRENT,如果上面的num为常量, 则所有对应的Intent里面的数据被更新为最新的, 就是全部为最后一次的。 
相反,如果num每次不一样,则里面的Intent的数据没被更新。

所以要通过extra数据来区分intent,应采用PendingIntent.FLAG_UPDATE_CURRENT),且每次num不一样

AlarmManager的常用方法有三个:

(1)set(int type,long startTime,PendingIntent pi);

该方法用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动作。

(2)setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);

该方法用于设置重复闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟首次执行时间,第三个参数表示闹钟两次执行的间隔时间,第三个参数表示闹钟响应动作。

(3)setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi);

该方法也用于设置重复闹钟,与第二个方法相似,不过其两个闹钟执行的间隔时间不是固定的而已。

这里主要讲解第一种方法:

set(int type,long startTime,PendingIntent pi))方法里面有三个参数:

type: 闹钟的类型,有五种:

AlarmManager.ELAPSED_REALTIME表示闹钟在手机睡眠状态下不可用,该状态下闹钟使用相对时间(相对于系统启动开始);

AlarmManager.ELAPSED_REALTIME_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟也使用相对时间;

AlarmManager.RTC表示闹钟在睡眠状态下不可用,该状态下闹钟使用绝对时间,即当前系统时间( 让定时任务的触发时间从1970年1月1日0点开始算起);

AlarmManager.RTC_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用绝对时间,状态值为0;

AlarmManager.POWER_OFF_WAKEUP表示闹钟在手机关机状态下也能正常进行提示功能,所以是5个状态中用的最多的状态之一,该状态下闹钟也是用绝对时间;不过本状态好像受SDK版本影响,某些版本并不支持;

intervalTime:闹钟的第一次执行时间,以毫秒为单位,它必须和type相对应,比如type是AlarmManager.ELAPSED_REALTIME_WAKEUP类型,代表是使用的是相对时间,所以intervalTime必须也得是相对时间:

SystemClock.elapsedRealtime()。

SystemClock.elapsedRealtime()方法可以获取到系统开机至今所经历时间的毫秒数,

System.currentTimeMillis()方法可以获取到1970年1月1日0点至今所经历时间的毫秒数

就讲解到这里下面是我的写的例子:

 
private static final int INTERVAL = 1000 * 60 * 60 * 24;// 24h 
 AlarmManager alarmService = (AlarmManager) getSystemService(ALARM_SERVICE);Calendar instance = Calendar.getInstance();instance.set(Calendar.HOUR_OF_DAY, 8);//小时instance.set(Calendar.MINUTE, 0);//分钟instance.set(Calendar.SECOND, 0);//秒
//这里是八点钟提醒一次
//这里也可以指定哪一年的那一天
//c.set(Calendar.YEAR,2016);//年
//c.set(Calendar.MONTH,3);//月
//c.set(Calendar.DAY_OF_MONTH, 12);//天
        Intent alarmIntent = new Intent(this, AlarmclockReceive.class);PendingIntent broadcast = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);alarmService.setRepeating(AlarmManager.RTC_WAKEUP, instance.getTimeInMillis(), INTERVAL,broadcast);//这里一定要注意,一定要相对时间对应相对时间,
绝对时间对应绝对时间,要不然通知你是收不到的,我就是在这里试了好几次都不行,最后发现这里写错了
 
取消闹钟:
 
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE); Intent i = new Intent(this, AlarmclockReceive.class); PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0); manager.cancel(pi);

Android中设置定时闹钟以及AlarmManager详解相关推荐

  1. android中怎么网络判断,Android中判断网络是否连接实例详解

    Android中判断网络是否连接实例详解 在android中,如何监测网络的状态呢,这个有的时候也是十分重要的,方法如下: public class ConnectionDetector { priv ...

  2. android sqlite自定义函数,Android中自定义一个View的方法详解

    本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到 ...

  3. Android中attrs.xml文件的使用详解

    $*********************************************************************************************$ 博主推荐 ...

  4. android中的mvp模式怎么定义,详解MVP模式在Android开发中的应用

    一.MVP介绍 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Mode ...

  5. android 图库开发实例,Android中从图库中选取图片实例详解

    android 从图库中选取图片 在android中,如何从图库gallary中挑选图片呢,其实很简单,步骤如下 1) 设计一个imageview,用来显示图库选出来的图片 android:orien ...

  6. android自定义闹钟铃声,如何在android中设置自定义闹钟铃声

    试试这个 添加任何.MP3文件中的原始文件夹位置该文件的名称 public void setAlarm() { File file = new File(Environment.getExternal ...

  7. android progressbar icon,android中ProgressDialog与ProgressBar的使用详解

    一 .ProgressDialogProgressDialog与ProgressBar在UI中动态显示一个加载图标显示程序运行状态.ProgressDialog是继承自Android.app.Prog ...

  8. android中edittext属性,Android中EditText的inputType属性的详解

    xml的inputtype的值. Android:inputType="none" android:inputType="text" android:input ...

  9. Android中ExpandableListView控件的用法详解

    <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widge ...

最新文章

  1. Python开发基础总结之套接字+字符串+正则表达式
  2. shell函数的返回值不能大于255的问题
  3. 开发中最基本的对数据的增删改查SQL
  4. 【转载】解决Windows和Ubuntu时间不一致的问题
  5. Malta中any函数
  6. TensorFlow 深度学习中文第二版(初稿)
  7. 【转】打开,另存为,属性等14个javascript代码
  8. ❤️Python Django网站开发 2021年最新版教程 合集❤️
  9. 《王道》数据结构笔记整理2022
  10. 从GSM-GPRS-WCDMA-LTE网络结构的变化,分析话音和数据交换技术的演进过程
  11. win7安装VScode(Visual Studio Code)
  12. Android反编译工具绿色版V2.0(改进版)
  13. 谷粒商城 - 微服务分布式电商项目
  14. 阿里云ACA、ACP和ACE认证考试有什么区别?考生应该如何选择?-阿里云开发者社区
  15. matlab多重积分如何使用方法,MATLAB在《高等数学》中的应用_多重积分
  16. 两款WEB防火墙软件介绍
  17. ubuntu可爱的玩具:小猫咪 oneko
  18. matlab中datax,菜鸟学飞--matlab系列1
  19. 【大数据】Sqoop使用常见问题
  20. 在vmware/virtualBox 虚拟机中使用adsl拨号上网

热门文章

  1. Laravel实现google-authenticator--Google二维码验证器
  2. 【作品分享】一次函数计算器
  3. Github标星超级牛,免费又好用的Redis客户端工具!
  4. 计算机科学人生观和价值观,我的人生观和价值观
  5. Canvas可以画出任何你想要的效果
  6. 年终奖,最能体现一家公司的格局
  7. React中JSX的用法和理解
  8. 达人评测i711800h和r55600h哪个好
  9. h5端登录是什么意思_关于app、小程序和h5之间的区别
  10. 备战一年,终于斩获腾讯T3,我坚信成功是可以复制的