android 闹钟管理,android闹钟实现原理
闹钟的原理可用下面我自己画的一幅图来概括:(不对的地方,尽管吐槽
)
我们来看看新建闹钟到闹钟响铃的步骤:
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闹钟实现原理相关推荐
- 原生android 权限管理,Android 权限管理(原生、EasyPermissions、RxPermissions)
前言:动态权限管理是Android6.0(Build.VERSION_CODES.M = Api23)推出的,提醒用户当前APP所需要的权限,防止滥用.这些权限一般分为三种:(1)普通权限:直接man ...
- android新闻管理,Android资讯新闻类App(头条、网易等),频道管理集成之数据库存储...
Android资讯新闻类App(头条.网易等),频道管理集成之数据库存储 发布时间:2019-01-16 19:55, 浏览次数:305 , 标签: Android App * 经常看新闻类的大家都知 ...
- android cookie管理,Android中Cookie获取、保存以及同步
1.先看一下Chrome中的Cookie信息 访问首页信息时: 1.第一次调用的Header信息 2.再次请求时Header信息 第一次请求时,服务器会在Response Header中带过来一个Se ...
- 麦克风android权限管理,android权限处理详解
写在前面 对于android 6.0来说,增加了权限的管理,能够更好的保护用户的隐私,当用户需要某权限时,才动态的去申请.用户也可以在应用权限管理里面关闭和打开.为了方便以后使用,这里对权限使用相关做 ...
- android 分支管理,Android Studio git使用,包括协同开发,分支管理。
首先要有几个概念. master是主分支,永远是当前发布出去的版本. 而开发则是在分支上进行的,比如新建一个Dev分支. 那么大家都在Dev分支上开发,发布的时候由小组长合并到master分支上. 并 ...
- android aar管理,android 库依赖管理之一aar依赖
依赖分为公共mavn库依赖,私有maven库依赖,本地仓库依赖,aar依赖,module直接依赖. 方案1: repositories { flatDir { dirs 'libs' } } depe ...
- android遥控器管理,Android 遥控器适配
在针对会议平板或大型显示设备(Android系统)中,大部分情况下需要通过鼠标.键盘或者遥控器来控制显示界面,以弥补因设备尺寸等因素导致的无法完全触摸整个设备屏幕的缺陷.因此,以上情况下的解决方案之一 ...
- android 图库管理,Android调用系统图库
上面一篇讲到Android调用系统相机时遇到的兼容性问题,没想到选择系统图库的时候竟然也遇到了系统兼容性问题,在这里记录下解决方案吧. 首先是调用系统默认图库代码: Intent intent = n ...
- android日记管理,Android日志管理Logger框架的简单介绍
Android开发中,我们常常用到日志打印.利用系统的Log打印可以满足大部分需求,如果想使用起来更方便一般会在系统Log的基础上再进行封装.比如可以全局定义Tag,亦或是定义一个变量,控制Debug ...
最新文章
- 给IIS添加CA证书以支持https
- 从业5年,教你学习Linux开发
- 检测到在集成的托管管道模式下不适用的 ASP.NET 设置。
- KDE和GNOME的区别※切换
- RFC remote call during status filter logic
- FE助手 json格式化 reslet client
- mysql配置日志老化配置_mysql配置-日志大小限制和自动删除
- Android中文API(99)—— RelativeLayout
- mysql 无法启动 查看原因_Mysql服务无法启动问题
- 解决 clipboard.js 在ios中失效的问题
- protobuf for java_ProtoBuf 的java使用
- scala 基础 —— 函数(柯里化)
- Linux 常见命令操作(杀死全部screen)
- 安卓Timpicker样式修改、多版本适配、ScrollView滑动冲突
- 使用Underscore.js的template将Backbone.js的js代码和html代码分离
- 揭秘ASP.NET 2.0之Page.Eval
- uniapp中使用网页录音并上传声音文件(发语音)——js-audio-recorder的使用【伸手党福利】
- 20V,30V,40V输入的LDO稳压芯片
- 做透视表时,提示“数据源引用无效”
- 分享:从华为转正到离职
热门文章
- Myeclipse tomcat 部署项目报错
- 基于KNN算法的图像识别
- 【Latex】在标题下插入头图 teaser
- VS2013 Windows7(X64被测试)安装方法 离线安装
- 蛋壳暴雷之后,租房应该注意什么 2020-11-30
- JavaScript 和 TypeScript 交叉口 —— 类型定义文件(*.d.ts)
- 心理学教授谈记忆魔法--艾宾浩斯遗忘曲线(转帖)
- ubuntu16.04下安装understand
- 弱口令到底是什么牛马?
- 美容院预约系统软件开发