Android系统闹钟源码解析(附源码)

更新时间:2023-06-02 20:01:32 阅读: 评论:0

Android系统闹钟源码解析(附源码)
最近看了⼀下android 4.4系统原⽣闹钟的代码,做个总结。并将源码提取出,做了些精简,重新组织打包,这样可直接运⾏安装,也不与⼿机⾃带冲突,⽅便学习。原⽣闹钟,⼗分稳定,可能的冲突事件都考虑并处理,只要美化界⾯,就是个不错的闹钟Apk。
进⼊正题,如何写⼀个闹钟应⽤,需要考虑哪些。我从以下⼏点做个简单介绍。
the show1.闹钟实现原理,如何实现动作定时触发?
2.闹钟alarm如何设置,包含哪些元素?
3.如何管理闹钟设置-alarm?
4.如何管理⼀个闹钟事件-alarmInstance?
5.举例分析,如何实现⼀个闹钟在每周⼀,周三,早上8点响起?
6.开关机,时区时间改变,来电等冲突事件都做哪些处理?
利润分配科目针对以上问题,详细介绍如下。只介绍⼤致流程,处理细节请阅读代码,注释已⼗分详尽。
持续改善1.闹钟实现原理,如何实现动作定时触发?
<span ><span >Intent stateChangeIntent = createStateChangeIntent(context,
ALARM_MANAGER_TAG, instance, newState);
PendingIntent pendingIntent = Broadcast(context,
instance.hashCode(), stateChangeIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
职称英语分数线if (Utils.isKitKatOrLater()) {  //这⾥需要做个判断,android 4.4之后接⼝有变化
am.tExact(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent);
} el {you will not get hurt
am.t(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent);
}</span></span>
通过上述⽅法,可在指定时间使pendingIntnet发送⼴播,然后程序实现BrodcastReceiver,接收此⼴播;
这样就可在指定时间,作出动作;
2.闹钟alarm如何设置,包含哪些元素?
⼀条闹钟设置alarm包含:时间设置(⼏点⼏分),标签(名字),重复(是否单次使⽤),重复⽇期,是否振动,铃声设置;
和莎莫的500天电影
其中重复⽇期设置--daysofweek,  源码中的设计如下,通过⼀个整数表⽰所有情况:
1111111:通过移位与或运算来确定某天是否被选中;
Days of week code as a single int.
0x00(0000000): no day
0x01(0000001): Monday
0x02(0000010) :Tuesday
0x04(0000100): Wednesday
0x08(0001000): Thursday
0x10(0010000): Friday
0x20(0100000): Saturday
0x40(1000000): Sunday
0x7f(1111111) :Everyday
这样假如星期⼀,星期三被选中,就是0000101;
congo周⼀周三⼋点闹钟设置为:hour=8,minute=0, daysofweek=5,enabled=true;
celebrate是什么意思
3.如何管理闹钟设置-alarm?
当然数据库,原⽣⼜实现了contentProvider,通过uri进⾏添加,删除,更新。体现了android的统⼀性;
这个⾃⼰看代码;
4.如何管理⼀个闹钟事件-alarmInstance?
每⼀个⽣效的闹钟设置-alarm,会⽣成⼀个闹钟事件-alarmInstance;  ⼀个闹钟事件对应⼀个⽣效闹钟(abled=true);
⼀个闹钟事件包括:
1.  alarmTime(闹钟触发时间,根据alarm设置结合当前时间计算⽽来)
2. state( 闹钟事件状态),源码中⼀个闹钟事件分为7个状态;
状态流程:
举例:设置闹钟时间为8点整,则产⽣⼀个闹钟事件-alarmInstance 的alarmTime为8点;
(1)SILENT_STATE:(6:00点以前,没有任何提⽰);
下⼀状态为:LOW_NOTIFICATION_STATE
(2)LOW_NOTIFICATION_STATE(6:00-7:30,通知栏有提⽰预定闹钟,通知可去除)
下⼀状态为:HIGH_NOTIFICATION_STATE
(3)HIGH_NOTIFICATION_STATE(7:30-7:59,通知栏有提⽰预定闹钟,通知不可去除)
下⼀状态为:FIRED_STATE
(4)FIRED_STATE(8:00,闹钟触发)
下⼀状态为:SNOOZE_STATE(选择稍后再响) 或 DISMISSED_STATE(选择关闭)或 MISSED_STATE
larissa(未做任何操作,直到响声结束)
(5)SNOOZE_STATE(8:00--设置的暂停时间,闹钟暂停)
下⼀状态为:FIRED_STATE
(6)MISSED_STATE(闹钟响起⽆任何操作,设置的闹钟响起时间过后,通知栏提⽰错过闹钟);
下⼀状态为:DISMISSED_STATE
(7)DISMISSED_STATE(闹钟关闭)
如何管理闹钟事件alarmInstance状态:
结合上边第⼀条定时触发原理,写⼀个BroadcastReceiver类----AlarmStateManager,负责接收⼴播,并改变闹钟事件的状态;
⽐如现在是7:50,设置的闹钟是8点;于是产⽣⼀条闹钟事件alarmInstance,根据规则判断当前状态
boundaries
为 HIGH_NOTIFICATION_STATE,然后调⽤am.t(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent);使其在8:00发送⼴播,intent包含要alarmInstance设置的状态(FIRED_STATE),同时再次调⽤上述⽅法(alarmManager.t)发送⼴播包含要alarmInstance设置的(MISSED_STATE);
若闹钟响起时⽤户选择稍后响起,此时关闭当前闹钟,并将闹钟事件alarmInstance的状态设置为SNOOZE_STATE,调⽤(alarmManager.t),设置下次状态为FIRED_STATE;
若闹钟响起时⽤户选择关闭,则关闭当前闹钟,删除此闹钟事件alarmInstance;  同时通过此闹钟事件对应的闹钟设置alarm,根据其重复⽇期,计算下次闹钟事件时间,并⽣成新的alarmInstance,设置其初始状态,并调⽤(alarmManager.t),使其在指定时间收到⼴播并修改对应状态;
若闹钟响起,⽤户不做任何操作,则到时会接收到之间预发送的⼴播,并将闹钟事件状态设置为MISSED_STATE;
alarmInstance也是⽤数据库,然后实现contentProvider,通过uri进⾏添加,删除,更新。
5.举例分析,如何实现⼀个闹钟在每周⼀,周三,早上8点响起?
假设现在是周⼀7点50:
1.增加闹钟设置alarm:  hour=8,minute=0; repeat=true; daysofweek=5 (0000101); enabled=ture;
2.⽣成闹钟事件alarmInstance :  alarmTime=今天8点, state=HIGH_NOTIFICATION_STATE( 当前状态);
3.通过alarmManager.t发送定时⼴播,pendingIntent中包含下次触发的状态为FIRED_STATE;
4.时间到,alarmStateManager收到⼴播播放铃声;此时选择关闭闹钟;此闹钟事件alarmInstance结束删除,然后根据对应alarm是计算得出下次闹钟时间是周三8点;于是⽣成新的闹钟事件alarmInstance : alarmTime=周三8点,state=SILENT_STATE;通过alarmManager.t发送定时⼴播,包含下次要触发的状态,循环······
6.开关机,时区saf时间改变,来电等冲突事件都做哪些处理?
1.重新开机后,之前闹钟事件发出的定时⼴播全部失效;所以要接受开机⼴播,然后根据alarm设置调整每个alarmInstance的状态,并重新发送定时⼴播;
其余就不在啰嗦啦,具体看代码吧;
其中datetimepicker为library,在eclip中配置后就可直接运⾏;

本文发布于:2023-06-02 20:01:32,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/131739.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:闹钟   事件   设置   时间   状态   实现   源码   处理
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图