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

我们来看看新建闹钟到闹钟响铃的步骤:
1、新建一个闹钟:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
// 获得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里注册广播接收器
|
1
2
3
4
5
|
<receiverandroid:name="MyReceiver">
<intent-filter>
<actionandroid:name="com.test.BC_ACTION"/>
</intent-filter>
</receiver>
|
2、定义一个AlarmReceiver extends BroadcastReceiver接收广播,并弹出闹钟提醒视图。
上面用到一个AlarmManage,我们分别来看看它的处理闹钟流程和作用及例子。
处理闹钟流程:对应AlarmManage有一个AlarmManagerServie服务程序,该服务程序才是正真提供闹铃服务的,它主要遍历闹铃列表并设置即将触发的闹铃给闹铃设备,并且一直监听闹铃设备,一旦有闹铃触发或者是闹铃事件发生,AlarmManagerServie服务程序就会遍历闹铃列表找到相应的注册闹铃并发出广播。
作用及例子:AlarmManage中文名闹钟,或者叫做“全局定时器”更合适,它的作用和Timer类似,有两种使用方法:1、在特定时长后(特定时间)执行某任务;2、周期性的执行某任务,AlarmManager对象配合Intent使用,可以定时的开启一个Activity,发送一个BroadCast,或者开启一个Service.
(1)在指定时长后(特定时间)执行某项操作
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//操作:发送一个广播,广播接收后Toast提示定时操作完成
Intent intent =newIntent(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)周期性的执行某项操作
|
1
2
3
4
5
6
7
8
9
10
11
12
|
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)
|
1
2
3
4
5
6
|
Intent intent =newIntent(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还将闹钟分为五种类型:
|
1
|
public staticfinalintELAPSED_REALTIME
|
//当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠
时间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3 (0x00000003)。
|
1
|
publicstaticfinalintELAPSED_REALTIME_WAKEUP
|
//能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。
|
1
|
public static final int RTC
|
//当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用
System.currentTimeMillis()获得。系统值是1 (0x00000001) 。
|
1
|
publicstaticfinalintRTC_WAKEUP
|
//能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。
|
1
|
PublicstaticfinalintPOWER_OFF_WAKEUP
|
//能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型,系统值为4 (0x00000004)。
综上所述,感觉AlarmManage和NotificationManager差不多,NotificationManager例子请见文章http://my.oschina.net/helu/blog/141728
android闹钟实现原理的更多相关文章
- Android闹钟 AlarmManager的使用
Android闹钟 AlarmManager的使用 AlarmManager介绍 AlarmManager这个类提供对系统闹钟服务的访问接口. 你可以为你的应用设定一个在未来某个时间唤醒的功能. 当闹 ...
- Android闹钟设置的解决方案
Android设置闹钟并不像IOS那样这么简单,做过Android设置闹钟的开发者都知道里面的坑有多深.下面记录一下,我解决Android闹钟设置的解决方案. 主要问题 API19开始AlarmMan ...
- Android Touch事件原理加实例分析
Android中有各种各样的事件,以响应用户的操作.这些事件可以分为按键事件和触屏事件.而Touch事件是触屏事件的基础事件,在进行Android开发时经常会用到,所以非常有必要深入理解它的原理机制. ...
- android handler工作原理
android handler工作原理 作用 便于在子线程中更新主UI线程中的控件 这里涉及到了UI主线程和子线程 UI主线程 它很特别.通常我们会认为UI主线程将页面绘制完成,就结束了.但是它没有. ...
- android MultiDex multidex原理原理下遇见的N个深坑(二)
android MultiDex 原理下遇见的N个深坑(二) 这是在一个论坛看到的问题,其实你不知道MultiDex到底有多坑. 不了解的可以先看上篇文章:android MultiDex multi ...
- android MultiDex multiDex原理(一)
android MultiDex 原理(一) Android分包MultiDex原理详解 转载请注明:http://blog.csdn.net/djy1992/article/details/5116 ...
- 解析 Android Things 技术原理
2012 年 6 月,由 IoT-GSI(Global Standards Initiative on Internet of Things)发布的白皮书“ITU-T Y.4000/Y.2060”[1 ...
- android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动
android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动 1.先简单设置一个闹钟提醒事件: //设置闹钟 mSetting.setOnClickListener ...
- Android闹钟开发与展示Demo
前言: 看过了不少安卓闹钟开发的例子,都是点到为止,都不完整,这次整一个看看. 一.闹钟的设置不需要数据库,但是展示闹钟列表的时候需要,所以需要数据库: public class MySQLiteOp ...
随机推荐
- linux的vi或vim文件时,怎样消除刚才查找字符串的高亮?
有时候,自己在通过/查找字符串时,会出现: 但是呢,当你保存,再次进入还是会出现这么花的高亮显示,很令人苦恼. 解决办法 随便,输入没有的字符串,即可解决. 如下 /sssssssssssssssss ...
- Fragment-两种使用方式
这篇我们就用实例来看看我们在代码中如何使用Fragment 一:静态添加Fragment 新建一个项目,添加两个Fragment的布局文件fragment_title,fragment_content ...
- 【IOS学习】1.第一个IOS程序
1.执行原理 a.首先执行main函数 调用UIApplicationMain方法 return UIApplicationMain(argc, argv, nil, NSStringFromClas ...
- Ajax往后台传参数,无参数,一个参数,多个参数,一个对象等
原文:http://www.cnblogs.com/chenwolong/p/Get.html //无参数请求-简单示例 $(document).ready(function () { $.ajax( ...
- javafx Hanoi
Netbean java8 source code :http://files.cnblogs.com/files/rojas/HNT.zip screenshot: 1 model /* ...
- vue中 v-cloak 的用法
原文来自:http://www.sunzhongwei.com/hide-vuejs-variable-with-v-cloak-when-page-loading
- OpenCV —— 图像处理
使用图像结构中所定义的高层处理方法(图形和视觉范畴)来完成特定任务 平滑处理 cvSmooth 处理后图像与输入图像的大小相同(不用考虑边缘) 中值滤波 CV_MEDIAN 不支持 in pla ...
- JS实现下拉菜单的功能
<!DOCTYPE html> <html> <head> <meta charset = "utf8"> <title> ...
- 【Uva 1632】Alibaba
[Link]: [Description] 直线上有n(n≤10000)个点,其中第i个点的坐标是xi,且它会在di秒之后消失.Alibaba 可以从任意位置出发,求访问完所有点的最短时间.无解输出N ...
- Directx9.0 学习教程3 -图形学之创建点 线 三角形 等
1.首先 介绍点的表示方法 struct CUSTOMVERTEX { float x,y,z; }; CUSTOMVERTEX Vertices[] = { {-5.0, -5.0, 0.0}, { ...