Android AlarmManager的时间设定问题


最近在做一个基于Android操作系统的闹钟小程序,在网上找寻了很多资料,根据这些资料试着编写,但是在测试的时候遇到了如下一个问题:

比如现在的时间是7:00,我设置闹钟为6:00,则闹钟马上会启动。但是如果设置为8:00,则闹钟不会立即启动而是在8:00准时启动。被这个问题纠结了一天,把自己的代码和网上其他人开发的闹钟程序代码比来比去没有什么差别,可就是无法解决这个问题,终于在刚刚又看了一下核心函数,由其传入的参数发现了问题的所在。

网上主流的闹钟程序一定用到了下面两行程序:

  1. am= (AlarmManager) getSystemService(Activity.ALARM_SERVICE);            
  2. am.set(AlarmManager.RTC_WAKEUP, c_set.getTimeInMillis(), pIntent);  

注意第二行set方法的第一和第二个参数,第一个参数表明使用的是绝对时间,而第二个参数说明是自1970年1月1日0:00至Calendar实例对象设定的时间的毫秒数。好,问题迎刃而解:如果现在的时间是7:00,那么你设定6:00的闹钟,在set方法中传入的第二个参数的值就会比现在的系统时间的getTimeInMillis()值要小,那么任务启动时间早已经提前到了1个小时,所以系统马上响应这个定时任务。

这样看来,网上那些主流的闹钟开发教程就都面临一个通病,就是如果设定的闹钟时间比当前时间小(即想要闹钟在第二天某一时间响),那么就需要在set方法前先做一个判定,判定设定的闹钟时间和当前的系统时间的大小关系:如果设定的时间比系统时间大,那么不用做什么额外的操作,正常调用AlarmManager的set方法即可;反之如果设定的闹钟时间比当前时间小,那么需要把Calendar实例对象的Day变量自加1:

  1. if(c_cur.getTimeInMillis()> c_set.getTimeInMillis()){  
  2. c_set.set(Calendar.DAY_OF_YEAR, c_set.get(Calendar.DAY_OF_YEAR) + 1);  
  3. }  

代码中c_set为闹钟设定时间的Calendar实例对象,c_cur为当前系统时间的Calendar实例对象。值得注意的是:DAY_OF_YEAR不要写成DAY,写成DAY_OF_YEAR的好处是不用考虑月份天数、进位等问题。

相关内容