安卓闹钟源码看了一个星期了,虽然知道它写了点什么?但是还是没弄清它到底怎么工作的。有没有大神指点一下,是不是有什么没注意到的关键东西,我看的是安卓4.1的闹钟源码
闹钟在app层面来说只是向framework层设置了一个alarm,通过AlarmManage去设置的。代码如下:
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.setExact(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent);
am.set(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent);
Alarm的机制在android L开始有改变,alarm分为准时唤醒和非准时唤醒,其中setExact就是L开始新加的api,用于设置准时唤醒的alarm,set是设置非
准时唤醒的alarm。在L之前只有set一个接口,设置的是准时唤醒。google这么做的原因应该是出于省电的考量。
这两个API的接口参数类似,主要有三个,一个是alarm type, 唤醒时间,以及一个pendingintent,这个pendingintent就是闹钟到点后alarmmanage
发送出来的。如果你想研究闹钟的话,推荐你看L以后的源码吧,不要看4.1的了,时钟源码的结构有所调整。
以上是app层面的alarm,如果你看兴趣的话,还可以好好研究下framework层对alarm的设计,看下alarmmanageservice的源码,你就会更详细的知道
alarm的底层机制,alarm一共有多少类型等等。另外设置的alarm在app进程被杀死,或是系统重启后,系统都会把设置的alarm清理掉。在clock的源码中你会看到每次重启后,clcok app都会重新设置alarm的,具体代码在AlarmInitReceiver中,它会监听boot complete广播。
建议你还是先把基础搞清楚,然后对照文档去看。闹钟无非就是定时、消息通知。
我也是研究源码的,修改过android4.4/5.0/6.0的闹钟,你需要看看alarm,主要是针对HAL层的,而Alarm机制,需要理解Famework的设计方式,你才能看到alarm在进程中的运行。