闹钟的原理可用下面我自己画的一幅图来概括:(不对的地方,尽管吐槽

)

我们来看看新建闹钟到闹钟响铃的步骤:

1、新建一个闹钟:

// 获得AlarmManager实例

final AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);

// 实例化Intent

Intent intent = new Intent();

// 设置Intent action属性

intent.setAction("com.test.BC_ACTION");

intent.putExtra("msg", "该去开会啦!");

// 实例化PendingIntent

final PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0,

intent, 0);

// 获得系统时间

final long time = System.currentTimeMillis();

am.set(AlarmManager.RTC_WAKEUP, time+5000, sender);//5秒后闹铃

// 设置按钮单击事件

setBtn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// 重复提示,从当前时间开始,间隔5秒

am.setRepeating(AlarmManager.RTC_WAKEUP, time,

5 * 1000, pi);

}

});

在AndroidMainfest.xml里注册广播接收器

2、定义一个AlarmReceiver extends BroadcastReceiver接收广播,并弹出闹钟提醒视图。

上面用到一个AlarmManage,我们分别来看看它的处理闹钟流程和作用及例子。

处理闹钟流程:对应AlarmManage有一个AlarmManagerServie服务程序,该服务程序才是正真提供闹铃服务的,它主要遍历闹铃列表并设置即将触发的闹铃给闹铃设备,并且一直监听闹铃设备,一旦有闹铃触发或者是闹铃事件发生,AlarmManagerServie服务程序就会遍历闹铃列表找到相应的注册闹铃并发出广播。

作用及例子:AlarmManage中文名闹钟,或者叫做“全局定时器”更合适,它的作用和Timer类似,有两种使用方法:1、在特定时长后(特定时间)执行某任务;2、周期性的执行某任务,AlarmManager对象配合Intent使用,可以定时的开启一个Activity,发送一个BroadCast,或者开启一个Service.

(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();

(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的取消:(其中需要注意的是取消的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);

AlarmManager还将闹钟分为五种类型:

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) 。

Public static final int POWER_OFF_WAKEUP    //能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型,系统值为4 (0x00000004)。

综上所述,感觉AlarmManage和NotificationManager差不多,NotificationManager例子请见文章http://my.oschina.net/helu/blog/141728

我的博客其它文章列表

http://my.oschina.net/helu

android 闹钟管理,android闹钟实现原理相关推荐

  1. 原生android 权限管理,Android 权限管理(原生、EasyPermissions、RxPermissions)

    前言:动态权限管理是Android6.0(Build.VERSION_CODES.M = Api23)推出的,提醒用户当前APP所需要的权限,防止滥用.这些权限一般分为三种:(1)普通权限:直接man ...

  2. android新闻管理,Android资讯新闻类App(头条、网易等),频道管理集成之数据库存储...

    Android资讯新闻类App(头条.网易等),频道管理集成之数据库存储 发布时间:2019-01-16 19:55, 浏览次数:305 , 标签: Android App * 经常看新闻类的大家都知 ...

  3. android cookie管理,Android中Cookie获取、保存以及同步

    1.先看一下Chrome中的Cookie信息 访问首页信息时: 1.第一次调用的Header信息 2.再次请求时Header信息 第一次请求时,服务器会在Response Header中带过来一个Se ...

  4. 麦克风android权限管理,android权限处理详解

    写在前面 对于android 6.0来说,增加了权限的管理,能够更好的保护用户的隐私,当用户需要某权限时,才动态的去申请.用户也可以在应用权限管理里面关闭和打开.为了方便以后使用,这里对权限使用相关做 ...

  5. android 分支管理,Android Studio git使用,包括协同开发,分支管理。

    首先要有几个概念. master是主分支,永远是当前发布出去的版本. 而开发则是在分支上进行的,比如新建一个Dev分支. 那么大家都在Dev分支上开发,发布的时候由小组长合并到master分支上. 并 ...

  6. android aar管理,android 库依赖管理之一aar依赖

    依赖分为公共mavn库依赖,私有maven库依赖,本地仓库依赖,aar依赖,module直接依赖. 方案1: repositories { flatDir { dirs 'libs' } } depe ...

  7. android遥控器管理,Android 遥控器适配

    在针对会议平板或大型显示设备(Android系统)中,大部分情况下需要通过鼠标.键盘或者遥控器来控制显示界面,以弥补因设备尺寸等因素导致的无法完全触摸整个设备屏幕的缺陷.因此,以上情况下的解决方案之一 ...

  8. android 图库管理,Android调用系统图库

    上面一篇讲到Android调用系统相机时遇到的兼容性问题,没想到选择系统图库的时候竟然也遇到了系统兼容性问题,在这里记录下解决方案吧. 首先是调用系统默认图库代码: Intent intent = n ...

  9. android日记管理,Android日志管理Logger框架的简单介绍

    Android开发中,我们常常用到日志打印.利用系统的Log打印可以满足大部分需求,如果想使用起来更方便一般会在系统Log的基础上再进行封装.比如可以全局定义Tag,亦或是定义一个变量,控制Debug ...

最新文章

  1. 给IIS添加CA证书以支持https
  2. 从业5年,教你学习Linux开发
  3. 检测到在集成的托管管道模式下不适用的 ASP.NET 设置。
  4. KDE和GNOME的区别※切换
  5. RFC remote call during status filter logic
  6. FE助手 json格式化 reslet client
  7. mysql配置日志老化配置_mysql配置-日志大小限制和自动删除
  8. Android中文API(99)—— RelativeLayout
  9. mysql 无法启动 查看原因_Mysql服务无法启动问题
  10. 解决 clipboard.js 在ios中失效的问题
  11. protobuf for java_ProtoBuf 的java使用
  12. scala 基础 —— 函数(柯里化)
  13. Linux 常见命令操作(杀死全部screen)
  14. 安卓Timpicker样式修改、多版本适配、ScrollView滑动冲突
  15. 使用Underscore.js的template将Backbone.js的js代码和html代码分离
  16. 揭秘ASP.NET 2.0之Page.Eval
  17. uniapp中使用网页录音并上传声音文件(发语音)——js-audio-recorder的使用【伸手党福利】
  18. 20V,30V,40V输入的LDO稳压芯片
  19. 做透视表时,提示“数据源引用无效”
  20. 分享:从华为转正到离职

热门文章

  1. Myeclipse tomcat 部署项目报错
  2. 基于KNN算法的图像识别
  3. 【Latex】在标题下插入头图 teaser
  4. VS2013 Windows7(X64被测试)安装方法 离线安装
  5. 蛋壳暴雷之后,租房应该注意什么 2020-11-30
  6. JavaScript 和 TypeScript 交叉口 —— 类型定义文件(*.d.ts)
  7. 心理学教授谈记忆魔法--艾宾浩斯遗忘曲线(转帖)
  8. ubuntu16.04下安装understand
  9. 弱口令到底是什么牛马?
  10. 美容院预约系统软件开发