Alarm机制用于定时服务
获取一个 AlarmManager 的实例:
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
调用 AlarmManager 的 set()方法设置一个定时任务了,比如说想要设定一个任务在 10 秒钟后执行,就可以写成:
long triggerAtTime = SystemClock.elapsedRealtime() + 10 * 1000;
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pendingIntent);
或者写成
long triggerAtTime = System.currentTimeMillis() + 10 * 1000;
manager.set(AlarmManager.RTC_WAKEUP, triggerAtTime, pendingIntent);
1.第一个参数是一个整型参数,用于指定 AlarmManager 的工作类型,有四种值可选,分别是 ELAPSED_REALTIME、ELAPSED_REALTIME_WAKEUP、RTC 和 RTC_WAKEUP。
ELAPSED_REALTIME 表示让定时任务的触发时间从系统开机开始算起,但不会唤醒 CPU。
ELAPSED_REALTIME_WAKEUP 同样表示让定时任务的触发时间从系统开机开始算起,但会唤醒 CPU。
RTC 表示让定时任务的触发时间从 1970 年 1月 1 日 0 点开始算起,但不会唤醒 CPU。
RTC_WAKEUP 同样表示让定时任务的触发时间从1970 年 1 月 1 日 0 点开始算起,但会唤醒 CPU。
使用 SystemClock.elapsedRealtime()方法可以获取到系统开机至今所经历时间的毫秒数,
使用 System.currentTimeMillis()方法可以获取到 1970 年 1 月 1 日 0 点至今所经历时间的毫秒数。
2.第二个参数,定时任务触发的时间,以毫秒为单位。
如果第一个参数使用的是 ELAPSED_REALTIME 或 ELAPSED_REALTIME_WAKEUP,则这里传入开机至今的时间再加上延迟执行的时间。
如果第一个参数使用的是 RTC 或RTC_WAKEUP,则这里传入 1970 年 1 月 1 日 0 点至今的时间再加上延迟执行的时间。
3.第三个参数是一个 PendingIntent.这里我们一般会调用getBroadcast()方法来获取一个能够执行广播的 PendingIntent。这样当定时任务被触发的时候,广播接收器的onReceive()方法就可以得到执行。
由于安卓官方为了CUP节能考虑,把相近时间唤醒CPU的服务都放到一期来启动,需要精确时间唤醒的可以把set()换成setExact()
实现定时启动的服务
1.创建服务,并定时发出广播
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "当前时间是"+ new Date().toString());
}
}).start();
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
int HowLong = 60 * 60 * 1000; //设定定时时间
long triggerAtTime = SystemClock.elapsedRealtime() + HowLong; //加上系统开机时间
Intent intent1 = new Intent(this, AlarmReceiver.class); //创建Intent指向广播接收器
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent1, 0);//调用 getBroadcast()方法来获取一个能够执行广播的 PendingIntent
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pendingIntent);//设置定时唤醒,并发出广播
return super.onStartCommand(intent, flags, startId);
}
2.在广播中执行开始下一次定时任务
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent AlarmIntent;
AlarmIntent = new Intent(context,LongRunningService.class);
context.startService(AlarmIntent);
}
}
3.在需要的地方首次启动服务
Intent intent = new Intent(this,LongRunningService.class);
startService(intent);
Alarm机制用于定时服务的更多相关文章
- Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析
参考:Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析 一句话概括一下Android应用程序显示的过程:Android应用程序调用SurfaceFlin ...
- LBPL--基于Asp.net、 quartz.net 快速开发定时服务的插件化项目
LBPL 这一个基于Asp.net. quartz.net 快速开发定时服务的插件化项目 由于在实际项目开发中需要做定时服务的操作,大体上可以理解为:需要动态化监控定时任务的调度系统. 为了实现快速开 ...
- Spring定时服务QuartZ
在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等. 我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作, ...
- [转]Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划
转自:Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划 前面我们从Android应用程序与SurfaceFlinger服务的关系出发,从侧面简单学习了Surfa ...
- VS2015 C#.net4.6 windows的定时服务
1.创建项目 C#->经典桌面->windows服务 2.创建定时服务 找到服务1,自动生成了 OnStart(服务开启时运行),OnStop(服务关闭时运行)两个函数,我们需要在开启时新 ...
- Android系统Surface机制的SurfaceFlinger服务的线程模型分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8062945 在前面两篇文章中,我们分析了Sur ...
- Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8046659 在前文中,我们分析了Surface ...
- Android系统Surface机制的SurfaceFlinger服务的启动过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8022957 在前面一篇文章中,我们简要介绍了A ...
- C# windows定时服务+服务邮箱发送
protected override void OnStart(string[] args) { timer1 = new System.Timers.Timer(); // timer1 = new ...
随机推荐
- 实现多行文字居中方法(兼容IE6)
<p class="mulit_line"> <span style="font-size:12px;">这里是高度为150像素的标签内 ...
- HAProxy负载均衡安装配置
1.下载HAProxy http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.22.tar.gz 2. 安装haproxy #tar z ...
- ubuntu下编译安装mysql记录
搞了整整一天,好不容易折腾完,在此记录下,下次就省事了. 去官网http://www.php.net/downloads.php下载所需要的php版本,这里我选择5.6.22. ...
- 【问题记录】mysql TIMEDIFF 和 TIMESTAMPDIFF的使用
今天遇到一个需求,需要计算数据表中两个时间的差值,并取对应的秒数 一开始我是用 time_to_sec(timediff (time1,time2)) 但是这样会有一个问题,,,时间短的用这个计算没有 ...
- JS整数验证
整数验证 方法1 function ValidatInteger(obj) { var reg = /^[1-9]\d*$/ if (!reg.test($(obj).val())) { $(obj) ...
- Visual Studio 2015简体中文版
Visual Studio 2015简体中文版(企业版) http://download.microsoft.com/download/B/8/F/B8F1470D-2396-4E7A-83F5-A ...
- DBMS事务的四大特性
数据库事务的四大特性分别是:原子性.一致性.隔离性和持久性. 特性 说明 实现 一致性 在一个事务执行之前和执行之后数据库都必须处于一致性状态.假如数据库的状态满足所有的完整性约束,也可以说数据库是一 ...
- linux 命令——34 du(转)
Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 1.命令格式: du [选项][文件] 2.命令功能 ...
- IOS 控制器View的创建方式(方式的优先级 、view的延迟加载)
MJViewController的view的创建 的方式的优先级 控制器view的延迟加载 ● 控制器的view是延迟加载的:用到时再加载 ● 可以用isViewLoaded方法判断一个UIViewC ...
- iptables (2) 基本配置
iptables 基本命令使用举例 一.链的基本操作 1.清除所有的规则.1)清除预设表filter中所有规则链中的规则.# iptables -F -F, --flush [chain] Flush ...