最近看了一下android 4.4系统原生闹钟的代码,做个总结。并将源码提取出,做了些精简,重新组织打包,这样可直接运行安装,也不与手机自带冲突,方便学习。原生闹钟,十分稳定,可能的冲突事件都考虑并处理,只要美化界面,就是个不错的闹钟Apk.
进入正题,如何写一个闹钟应用,需要考虑哪些。我从以下几点做个简单介绍。
1.闹钟实现原理,如何实现动作定时触发?
2.闹钟alarm如何设置,包含哪些元素?
3.如何管理闹钟设置-alarm?
4.如何管理一个闹钟事件-alarmInstance?
5.举例分析,如何实现一个闹钟在每周一,周三,早上8点响起?
6.开关机,时区时间改变,来电等冲突事件都做哪些处理?
针对以上问题,详细介绍如下。只介绍大致流程,处理细节请阅读代码,注释已十分详尽。
1.闹钟实现原理,如何实现动作定时触发?<span style="font-size:14px;"><span style="font-size:14px;">Intent stateChangeIntent = createStateChangeIntent(context,ALARM_MANAGER_TAG, instance, newState);PendingIntent pendingIntent = PendingIntent.getBroadcast(context,instance.hashCode(), stateChangeIntent,PendingIntent.FLAG_UPDATE_CURRENT);AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);if (Utils.isKitKatOrLater()) { //这里需要做个判断,android 4.4之后接口有变化am.setExact(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent);} else {am.set(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent);}</span></span>
通过上述方法,可在指定时间使pendingIntnet发送广播,然后程序实现BrodcastReceiver,接收此广播;
这样就可在指定时间,作出动作;
2.闹钟alarm如何设置,包含哪些元素?
一条闹钟设置alarm包含:时间设置(几点几分),标签(名字),重复(是否单次使用),重复日期,是否振动,铃声设置;
其中重复日期设置–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;
周一周三八点闹钟设置为:hour=8,minute=0, daysofweek=5,enabled=true;
3.如何管理闹钟设置-alarm?
当然数据库,原生又实现了contentProvider,通过uri进行添加,删除,更新。体现了android的统一性;
这个自己看代码;
4.如何管理一个闹钟事件-alarmInstance?
每一个生效的闹钟设置-alarm,会生成一个闹钟事件-alarmInstance; 一个闹钟事件对应一个生效闹钟(alarm.enabled=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
(未做任何操作,直到响声结束)
(5)SNOOZE_STATE(8:00–设置的暂停时间,闹钟暂停)
下一状态为:FIRED_STATE
(6)MISSED_STATE(闹钟响起无任何操作,设置的闹钟响起时间过后,通知栏提示错过闹钟);
下一状态为:DISMISSED_STATE
(7)DISMISSED_STATE(闹钟关闭)
如何管理闹钟事件alarmInstance状态:
结合上边第一条定时触发原理,写一个BroadcastReceiver类—-AlarmStateManager,负责接收广播,并改变闹钟事件的状态;
我知道有一种爱情,叫做与你白头,有一种幸福,叫做和你相伴。