Android关机闹钟启动流程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
gs_boot_state.alarm_state = BOOT_ALARM_SLEEP;//更新状态,以 便前面线程作出相应动作
update_alarm_sec_list(alarm_item_bak,g_alarm_snooze_time);// 更 新 贪 睡
} usleep(500000); g_alarm_button_event = BOOT_STATE_NONE; } (2)取消闹钟 else if( g_alarm_button_event == ALARM_BUTTON_EVENT_MID) { //stop //stop music
闹钟信息
//sleep if(gs_boot_state.alarm_state == BOOT_ALARM_ALARMING) {
musicProcess(g_alarm_ring_path,0);//停止闹铃 update_delay_time(alarm_item_bak); set_state(LCD_BRIGHTNESS_OFF);
g_alarm_button_event = ALARM_BUTTON_EVENT_LEFT;//相当于按了贪睡 } }
关机闹钟启动流程图如下:
} if(pthread_create(&button_t,NULL,get_input_event , NULL)) {
gs_boot_state.alarm_state = BOOT_ALARM_EXIT; LOGE("get_input_event thread creat fail\n"); return -1; } 5. musicProcess(g_alarm_ring_path,1);响铃 pthread_create(&vibrate_t,NULL,pthread_vibrate , NULL);震动 set_state(LCD_BRIGHTNESS_ON); 6.while 循环监听用户操作 while(gs_boot_state.power_key_event == BOOT_STATE_NONE)循环,当操作 power 键时,直接 退出闹钟,无操作时,while 进入死循环,监听如下事件: (1)贪睡闹钟 //left button if(g_alarm_button_event == ALARM_BUTTON_EVENT_LEFT) {
Android 关机闹钟启动流程
Android 原生是不支持关机闹钟的,所以需要各个不同的平台厂商自己实现关机闹钟, 下面以展讯平台 8830 平台为例分析。 展讯平台的开机状态下闹钟和关机闹钟分属两个不同的模块,代码位置: 开机闹钟:packages/apps/DeskClock 关机闹钟:device/sprd/common/apps/alarm
Alarm.c
1.根据ro.bootmode判断是否闹钟启动模式,是则执行下一步,否则退出 2.alarm_init():闹钟信息初始化 (1)get_time_dm();读取文件,取出并赋予给相应变量 (2)add_alarm_db_list():查询/data/data/com.android.deskclock/databases/alarms.db 数据库,将闹钟信息存放到struct alarm_db *p = g_alarm_db_list; (3)creat_alarm_sec_list():取出(2)中的g_alarm_db_list数据链表,while循环遍历状 态为enable的闹钟,并添加到结构为alarm_sec的链表中,然后调用add_ring_file_time();方 法,该add_ring_file_time();作用是取出/productinfo/alarm_flag闹钟信息(即将到时的), 然后与enable的列表进行比较,取出相等的闹钟,然后返回此闹钟值。 注 意 : 之 所 以 需 要 从 alarm_sec 的 链 表 里 取 出 最 近 的 闹 钟 , 而 不 直 接 使 用 /productinfo/alarm_flag的闹钟信息,是因为/productinfo/alarm_flag里只存放了闹钟的时间 等基本信息,并未存储铃声,振动与否等信息。
关机闹钟
关机闹钟涉及的重要文件是 alarm.c 文件,关机闹钟的启动是从 alarm.c 的 main 方法开始的。 当用户设置并启动一个闹钟时,会调用 Alarms.java alarm_flag_setup(Context context,final long alarmTimeInMillis,Alarm alarm)方法 该方法主要作用:取出/sys/class/rtc/rtc0/default_time 值,这个值是系统的初始时间,然后 计算当前时间与此时间的差值然后存储到/productinfo/alarm_flag 文件中,alarm_flag 然后依 次存储闹钟时间,闹钟响铃时间,闹钟贪睡时间,系统的时间格式(12 小时还是 24 小时制)。 当用户关机后闹钟时间到,会调用到 alarm.c 的 main 方法。

musicProcess(g_alarm_ring_path, 0); gs_boot_state.alarm_state = BOOT_ALARM_STOP; update_ring_file();//更新下一闹钟 gr_clean(); usleep(500000); usleep(500000); system_shutdown();//关闭系统 LOGE("shutdown system\n"); return 0; } (3)取消并开机 else if( g_alarm_button_event == ALARM_BUTTON_EVENT_RIGHT) { //power on if(gs_boot_state.alarm_state == BOOT_ALARM_ALARMING) {
musicProcess(g_alarm_ring_path,0); update_delay_time(alarm_item_bak); gs_boot_state.battery_state = BATTERY_STATE_EXIT; break; } } (4)监听是否有新闹钟 if(get_latest_alarm_time(&fire_alarm) == 0) { gs_boot_state.alarm_state = BOOT_ALARM_ANOTHER; musicProcess(g_alarm_ring_path, 0); sleep(1); gr_clean(); gs_boot_state.alarm_state = BOOT_ALARM_ALARMING; if((alarm_item_bak->vibrate == 0)&&(alarm_cur->vibrate == 1)) { pthread_create(&vibrate_t,NULL,pthread_vibrate , NULL); } alarm_item_bak = alarm_cur; print_images(ALARM_WARNING_IMG_POS); musicProcess(g_alarm_ring_path,1); while(gettimeofday(&start_time, (struct timezone *)0)<0); } (5)响铃时间超过设置时间 if(gs_boot_state.alarm_state == BOOT_ALARM_ALARMING && g_alarm_last_time!=0){ while(gettimeofday(&now_time, (struct timezone *)0)<0); time_diff_temp = timeval_diff(now_time, start_time); if(time_diff_temp > g_alarm_last_time*1000000){
4.闹钟时间已到,接下来创建两个线程,分别为屏幕更新和监听用户操作 if(pthread_create(&t,NULL, refreshen_screen, NULL))
{ gs_boot_state.alarm_state = BOOT_ALARM_EXIT; LOGE("refreshen_screen thread creat fail\n"); return -1;
(4)最后完成关机闹钟图片、数字、logo 显示的初始化信息等 gs_boot_state.alarm_state = BOOT_ALARM_ALARMING; gs_boot_state.power_key_event = BOOT_STATE_NONE;
init_surface(ALARM_WARNING_IMG_POS); init_surface(ALARM_TIME_NUM_POS); init_surface(ALARM_BOOT_LOGO_POS); 3. while((next_alarm_time = get_latest_alarm_time(&fire_alarm)) != 0) 通过 while 循环调用 get_latest_alarm_time(&fire_alarm)),判断即将到来的闹钟与当前时间的 差值,直到等于 0 时退出 while 循环,即说明闹钟已到,更新闹钟数据库
相关文档
最新文档