Android闹钟机制实现定时任务功能
作者:ckdroid 发布时间:2021-08-06 07:36:03
Android的闹钟实现机制, 需要调用AlarmManager.set()将闹铃时间记录到系统中,当闹铃时间到后,系统会给应用程序发送广播,我们只需要去注册广播 * 就可以了。
本文分三部分讲解如何实现闹钟:
目录:
1. 设置闹铃时间;
2. 接收闹铃事件广播;
3. 重开机后重新计算并设置闹铃时间;
1. 设置闹铃时间(毫秒)
private void setAlarmTime(Context context, long triggerAtMillis) {
AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent("android.alarm.demo.action");
PendingIntent sender = PendingIntent.getBroadcast(
context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
//闹铃间隔, 这里设为1分钟闹一次,在第2步我们将每隔1分钟收到一次广播
//int interval = 60 * 1000;
//am.setRepeating(AlarmManager.RTC_WAKEUP, timeInMillis, interval, sender);
am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis, sender);
}
第二个参数它大致分为两种类型 一种是相对时间 一种是绝对时间。
所以,根据使用的类型不同 triggerAtTime设置也有所不同。
如果使用ELAPSED_REALTIME_WAKEUP类型 应该调用SystemClock.elapsedRealtime()获取相对时间在加上你设定的延迟时间。
2. 接收闹铃事件广播
public class AlarmReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if ("android.alarm.demo.action".equals(intent.getAction())) {
// 第1步中设置的闹铃时间到,这里可以弹出闹铃提示并播放响铃
Toast.makeText(context, "hello alarm", Toast.LENGTH_LONG).show();
System.out.println("hello alarm");
// 可以继续设置下一次闹铃时间;
return;
}
}
}
当然,Receiver是需要在Manifest.xml中注册的:
<receiver android:name="AlarmReceiver">
<intent-filter>
<action android:name="android.alarm.demo.action" />
</intent-filter>
</receiver>
3. 重开机后重新计算并设置闹铃时间
当然要有一个BootReceiver:
public class BootReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
//重新计算闹铃时间,并调第一步的方法设置闹铃时间及闹铃间隔时间
}
}
}
当然,也需要注册:
<receiver android:name="BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
我在设置时钟的时候遇到一点问题
我开始的代码是这样写的
alarmManager.set(AlarmManager.RTC_WAKEUP, (5*1000), sender);
我的本意是设定五秒后启动闹钟 但是每次都是我设置完闹钟之后立马就启动了。
后来我发现问题出在第二个参数上 我对他的理解是错误的
我之前以为它是“延迟”时间,而实际它是“启动”时间。
要理解这个参数还要看type这个参数
public static final int ELAPSED_REALTIME
//当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3 (0x00000003)。
public static final int ELAPSED_REALTIME_WAKEUP
//能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。
public static final int RTC
//当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用 System.currentTimeMillis()获得。系统值是1 (0x00000001) 。
public static final int RTC_WAKEUP
//能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。
它大致分为两种类型 一种是相对时间 一种是绝对时间。
所以,根据使用的类型不同 triggerAtTime设置也有所不同。
如果使用ELAPSED_REALTIME_WAKEUP类型 应该调用SystemClock.elapsedRealtime()获取相对时间在加上你设定的延迟时间。
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+5000, sender);
如果使用RTC_WAKEUP类型 应该调用System.currentTimeMillis()获取从1970.1.1号以来的时间在加上你设定的延迟时间
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+5000, sender);
setRepeating方法有4个参数,这些参数的含义如下:
type:表示警报类型,一般可以取的值是AlarmManager.RTC和AlarmManager.RTC_WAKEUP。如果将type参数值设为AlarmManager.RTC,表示是一个正常的定时器,如果将type参数值设为AlarmManager.RTC_WAKEUP,除了有定时器的功能外,还会发出警报声(例如,响铃、震动)。
triggerAtTime:第1次运行时要等待的时间,也就是执行延迟时间,单位是毫秒。
interval:表示执行的时间间隔,单位是毫秒。
operation:一个PendingIntent对象,表示到时间后要执行的操作。PendingIntent与Intent类似,可以封装Activity、BroadcastReceiver和Service。但与Intent不同的是,PendingIntent可以脱离应用程序而存在。
来源:http://blog.csdn.net/ckdroid/article/details/43565899


猜你喜欢
- 一、什么是IO流输入流和输出流。输入流:数据从数据源(文件)到程序(内存)的路径输出流:数据从程序(内存)到数据源(文件)的路径二、常用的文
- 本文实例讲述了C#基于OLEDB获取Excel文件表结构信息的方法。分享给大家供大家参考,具体如下:这个问题来自论坛提问,同理可以获得acc
- 1、实现原理不同过滤器和 * 底层实现方式大不相同,过滤器 是基于函数回调的, * 则是基于Java的反射机制( * )实现的。1、拦
- 一直到大四才开始写自己的第一篇博客,说来实在有点羞愧。今天写了关于排序的算法题,有插入排序,冒泡排序,选择排序,以下贴上用JAVA实现的代码
- 因为在Action的execute方法声明时就抛出了Exception异常,所以我们无需再execute方法中捕捉异常,仅需在struts.
- 本文实例讲述了C++二分查找(折半查找)算法。分享给大家供大家参考,具体如下:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好
- 本文通过优化买票的重复流程来说明享元模式,为了加深对该模式的理解,会以String和基本数据类型的包装类对该模式的设计进一步说明。读者可以拉
- 基础部分1. FastJson 简介Fastjson是一个Java库,可用于将Java对象转换为JSON表示。它也可以被用来将一个JSON字
- 线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代
- 介绍:Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包
- 目录一、环境搭建二、RetryTemplate2.1 RetryTemplate2.2 RetryListener2.3 回退策略2.3.1
- 添加Hibernate配置文件提示 解压hibernate.jar包 在org\hibernate目录下找到hibernate-config
- java数据类型与二进制详细介绍在java中Int 类型的变量占 4个字节Long 类型的变量占8个字节一个程序就是一个世界,变量是这个程序
- 支付宝上有一个咻一咻的功能,就是点击图片后四周有水波纹的这种效果,今天也写一个类似的功能。效果如下所示:思路:就是几个圆的半径不断在变大,这
- 本文提纲版本约定JDK:8Servlet:4.xtomcat:9.x✍正文什么样的答案终身难忘?学生时代关于记忆经常能听见两种论调:死记硬背
- 递归生成一个如图的菜单,编写两个类数据模型Menu、和创建树形的MenuTree。通过以下过程实现:1.首先从菜单数据中获取所有根节点。2.
- 目录绘制流程Measure 测量流程MeasureSpeclayout 布局流程draw 绘制流程相关类 & 概念DecorView
- 适配器模式是一种重要的设计模式,在 Android 中得到了广泛的应用。适配器类似于现实世界里面的插头,通过适配器,我们可以将分属于不同类的
- 反射允许我们在编译期或运行时获取程序集的元数据,通过反射可以做到:● 创建类型的实例● 触发方法● 获取属性、字段信息● 延迟绑定.....
- Java是一门面向对象的语言,即一切皆是对象!那么为何数据类型中还分为:基本类型和对象?Java中有8种基本数据类型boolean、byte