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

时间: 2024-10-15 11:52:35

android闹钟实现原理的相关文章

Android加壳原理分析

0x00 阅读本文前,建议读者首先阅读Android加壳原理,参考文章Android中的Apk的加固(加壳)原理解析和实现.如果没有看过这篇文章,本文理解起来比较困难. 0x01 下面我们来分析脱壳代码为什么要这样写,核心脱壳代码在ProxyApplication类里面,首先执行成员方法attachBaseContext,然后执行成员方法onCreate. 那么attachBaseContext是什么时候被执行的呢,为什么先于onCreate执行呢?那就需要看Android的源码了,我们选用的是

Android热修复原理普及

Android热修复原理普及 这段时间比较难闲,就抽空研究一下Android热修复的原理.自从Android热修复这项技术出现之后,随之而现的是多种热修复方案的出现.前两天又看到一篇文章分析了几种热修复方案的比较. 原文地址是:[Android热修复] 技术方案的选型与验证 看完这篇文章,有点汗颜.有这么多的热修复方案,并且他们之间的实现原理也不一样,各有优缺点. 然后在尼古拉斯_赵四的博客中看到几篇关于热修复的文章,对着这几篇文章撸了一番.大概的了解了热修复一种原理,其思路和QQ空间提出的安卓

Android闹钟设置的解决方案

Android设置闹钟并不像IOS那样这么简单,做过Android设置闹钟的开发者都知道里面的坑有多深.下面记录一下,我解决Android闹钟设置的解决方案. 主要问题 API19开始AlarmManager的机制修改. 应用程序被Kill掉后,设置的闹钟不响. 6.0以上进入Doze模式会使JobScheduler停止工作. 手机设置重启后,闹钟失效问题. API19以上AlarmManager机制的修改 API19之前AlarmManager提供了三个设置闹钟的方法,由于业务需求闹钟只需要一

异步消息处理机制-Android中Handler原理(续)

异步消息处理线程是指线程启动后会进入一个无限循环,每循环一次,从内部的消息队列里面取出一个消息,并回调相应的消息处理函数.一般在任务常驻,比如用户交互任务的情况下使用异步消息处理线程. 之前在Android中Handler原理里面研究过android里实现异步消息处理线程的方式,基本逻辑如图所示 今天就用java将其简单的模拟出来加深印象,下面的类图是用工具导出的,不太正规,不过能大概看出类之间的关系 Message类:消息类 public class Message { public int

android闹钟小案例之功能阐述

最近花了一个星期左右的时间做了一个小闹钟,现在回过头来进行总结下.刚开始接触这个案例,总体觉着没有太大的难度,都是一些基础知识的堆砌,可现实总比理想残酷啊,这几天下来,每天都会有意料之外的bug出现.在debug的过程中,深深体会到了百度一下和谷歌谷歌的用处,基本常见的问题都可以在这里得到提示甚至答案.这篇文章先来介绍下这个案例所实现的功能,接下来再用几遍文章记录所用到的知识点. 功能简介: 1.闹钟基本功能:和平时的闹钟一样,用户在界面选择闹钟响起的时间,到达所设定时间后执行相应的指定操作.

Android闹钟 AlarmManager的使用

Android闹钟 AlarmManager的使用 AlarmManager介绍 AlarmManager这个类提供对系统闹钟服务的访问接口. 你可以为你的应用设定一个在未来某个时间唤醒的功能. 当闹钟响起,实际上是系统发出了为这个闹钟注册的广播,会自动开启目标应用. 注册的闹钟在设备睡眠的时候仍然会保留,可以选择性地设置是否唤醒设备,但是当设备关机和重启后,闹钟将会被清除. 在alarm的receiver的onReceive()方法被执行的时候,Alarm Manager持有一个CPU唤醒锁,

android闹钟小案例之知识点总结

上一篇文章对近期做的小闹钟做了功能阐述,现在来总结下整个开发过程中所用到的一些知识点: 1.TimePicker的监听 TimePicker控件是整个应用的核心,其它的操作都得基于对该控件的正确操控.对该控件的操作重要就是为其设置监听器,在监听事件中获取用户设置的时间. private Calendar calendar=Calendar.getInstance();//创建calendar对象 private class OnTimeChangedListenerImpl implements

Android闹钟程序

原文:Android闹钟程序 源代码下载地址:http://www.zuidaima.com/share/1597010528603136.htm 转自csdn: 版权声明:本文为博主原创文章,未经博主允许不得转载.

Android的Root原理

前言 一直很好奇Android Root的原理,恰好最近碰到了一个跟Android默认带Root权限的问题,这里顺便记录一下Android系统root的原理. 原理 Android是基于Llinux内核的开源操作系统,与Ubuntu系统类似,所以在Android里获取root权限其实和在Linux系统下获取root权限是一回事.在Linux系统下获取root权限的方法是在命令行执行sudo或者su,接下来输入提权密码就可以获取root权限了.Android系统其实也是这样,例如应用层程序开发,在