AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟。指定时长或以周期形式执行某项操作。通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似。都有两种相似的用法:(1)在指定时长后执行某项操作(2)周期性的执行某项操作



      AlarmManager对象配合Intent使用,可以定时的开启一个Activity, 发送一个BroadCast,或者开启一个Service,run一段代码。概括起来就是通过Intent对组件进行操作。



下面的代码详细的介绍了两种定时方式的使用:



 (1)在指定时长后执行某项操作



代码实例:



    // 操作:发送一个广播,广播接收后Toast提示定时操作完成

    

    Intent intent = new Intent(Main.this, alarmreceiver.class);

    intent.setAction("short");

    PendingIntent sender =  PendingIntent.getBroadcast(Main.this, 0, intent, 0);

    

    //设定一个五秒后的时间

    Calendar calendar = Calendar.getInstance();

    calendar.setTimeInMillis(System.currentTimeMillis());

    calendar.add(Calendar.SECOND, 5);

    

    AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE);

    alarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);

    //或者以下面方式简化

    //alarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+5*1000, sender);

    

    Toast.makeText(Main.this, "五秒后alarm开启", Toast.LENGTH_LONG).show();





//注意:receiver记得在manifest.xml注册



代码实例:



    public static class alarmreceiver extends BroadcastReceiver {



        @Override

        public void onReceive(Context context, Intent intent) {

            // TODO Auto-generated method stub

            if(intent.getAction().equals("short")){

                Toast.makeText(context, "short alarm", Toast.LENGTH_LONG).show();

            } else {

                Toast.makeText(context, "repeating alarm",   Toast.LENGTH_LONG).show();

            }

        }

    }



(2)周期性的执行某项操作



代码实例:



    Intent intent = new Intent(Main.this, alarmreceiver.class);

    intent.setAction("repeating");

    PendingIntent sender = PendingIntent.getBroadcast(Main.this, 0, intent, 0);

        //开始时间

    long firstime = SystemClock.elapsedRealtime();



    AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);  //5秒一个周期,不停的发送广播

    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP  , firstime, 5*1000, sender);



    AlarmManager的setRepeating()相当于Timer的Schedule(task,delay,peroid);有点差异的地方时Timer这个方法是指定延迟多长时间





以后开始周期性的执行task;



      AlarmManager的取消:(其中需要注意的是取消的Intent必须与启动Intent保持绝对一致才能支持取消AlarmManager)



代码实例:



  Intent intent = new Intent(Main.this, alarmreceiver.class);

  intent.setAction("repeating");

  PendingIntent sender = PendingIntent.getBroadcast(Main.this, 0, intent, 0);

  AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE);

  alarm.cancel(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可以脱离应用程序而存在。

最后再介绍一下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) 。

















AlarmManager(全局定时器/闹钟)详解的更多相关文章

  1. Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作

    1.AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,可以实现从指定时间开始,以一个固定的间隔时间执行某项操作,所以常常与广播(Broadcast)连用 ...

  2. Android AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作

    AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟.通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似.都有两种相似的用法:(1)在指定时长后执行某项操 ...

  3. 我的Android进阶之旅------>Android使用AlarmManager全局定时器实现定时更换壁纸

    该DEMO将会通过AlarmManager来周期的调用ChangeService,从而让系统实现定时更换壁纸的功能. 更换壁纸的API为android.app.WallpaperManager,它提供 ...

  4. 整合Spring时Service层为什么不做全局包扫描详解

    合Spring时Service层为什么不做全局包扫描详解 一.Spring和SpringMVC的父子容器关系 1.讲问题之前要先明白一个关系 一般来说,我们在整合Spring和SpringMVC这两个 ...

  5. spring盒springMVC整合父子容器问题:整合Spring时Service层为什么不做全局包扫描详解

    整合Spring时Service层为什么不做全局包扫描详解 一.Spring和SpringMVC的父子容器关系 1.讲问题之前要先明白一个关系 一般来说,我们在整合Spring和SpringMVC这两 ...

  6. 进程、线程与GIL全局解释器锁详解

    进程与线程的关系: . 线程是最小的调度单位 . 进程是最小的管理单元 . 一个进程必须至少一个线程 . 没有线程,进程也就不复存在 线程特点: 线程的并发是利用cpu上下文的切换(是并发,不是并行) ...

  7. android之AlarmManager 全局定时器

    AlarmManager实质是一个全局的定时器,是Android中常用的一种系统级别的提示服务,在指定时间或周期性启动其它组件(包括Activity,Service,BroadcastReceiver ...

  8. setTimeout和setInterval定时器使用详解测试

    var len=4; while(len--){ var time=setTimeout(function(){ console.log(len); },0); console.log(time); ...

  9. MyBatis全局配置文件标签详解

    一.全局配置文件结构 configuration 配置 properties 属性:可以加载properties配置文件的信息 settings 设置:可以设置mybatis的全局属性 typeAli ...

随机推荐

  1. 什么是<!DOCTYPE html>

    什么是<!DOCTYPE html>? 在HTML文档初,往往会有这么一句话<!DOCTYPE html>,那么它的意义是什么呢?它是html5标准网页声明,全称为Docume ...

  2. 钉钉自定义机器人配合SVN钩子事件进行消息的推送实践

    目前很多公司还是使用SVN(TortoiseSVN)进行版本控制,使用简单,适合管理一般项目.协同办公软件目前钉钉比较成熟,阿里也一直在宣传推广,这两年公司也在使用,主要用于信息的沟通,其它的绩效.考 ...

  3. javascript中的BOM对象

    1.window对象 所有的浏览器都支持window对象 概念上讲,一个html文档对应一个window对象 功能上讲,控制浏览器窗口 使用上讲,window对象不需要创建对象,直接使用 2.wind ...

  4. 单元测试系列:Mock工具Jmockit使用介绍

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6760272.html Mock工具Jm ...

  5. 获取当前进程(程序)主窗体句柄并设置wpf的父窗体为此句柄

    有时候在c++调用wpf控件的时候,wpf控件想自己显示窗体,但需要设置owner属性.迂回解决办法是设置wpf的window窗体的父窗体为进程的句柄. 1.获取当前进程id int id = Pro ...

  6. xBIM 使用Linq 来优化查询

    目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...

  7. Oracle的一些简单语句

    drop后的表被放在回收站(user_recyclebin)里,而不是直接删除掉.这样,回收站里的表信息就可以被恢复,或彻底清除. 1.通过查询回收站user_recyclebin获取被删除的表信息, ...

  8. new function

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. 为Docker配置阿里加速器,系统为Debian8

    先停止docker服务 service docker stop 设置阿里加速器 dockerd --registry-mirror=https://063eurcd.mirror.aliyuncs.c ...

  10. Date和long类型互转

    1.java.util.Date类型转换成long类型 java.util.Date dt = new Date(); System.out.println(dt.toString()); //jav ...