2015-09-26 53 views
-1

我正在使用android studio开发一个应用程序,它将从数据库中检索时间信息,并设置闹钟来提示用户该喝药了,我的问题是闹钟响了太早Android闹铃太早

例如检索到的时间是上午12时五十分和当前时间是上午12时40 即使有十分钟差警报响起时马上

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm"); 
try { 
     Calendar Cnow = Calendar.getInstance(); 
     long now=Cnow.getTimeInMillis(); 
     Calendar time=Calendar.getInstance(); 
     time.setTimeInMillis(0); 
     Date dTime=sdf.parse(strAlarmDate + " " + strTime1); 
//example strAlarmDate="2015-09-27" and strTime1="12:50 AM" and now="12:40 AM" in millis 
//dTime="...... 2015-09-27 00:50" 
     time.setTime(dTime); 
     //Date dNow=now.getTime(); 
     //time.setTime(date); 
     //long trigger=time.getTimeInMillis()-now.getTimeInMillis(); 
     long trigger=time.getTimeInMillis()-now; 
     if(trigger>0) { 
      ctr++; 
      Intent i = new Intent(Login.this, AlarmReceiver.class); 
      i.putExtra("message", strMedname); 
      i.putExtra("line", strLine); 
      final int _id = (int) System.currentTimeMillis(); 
      PendingIntent pi = PendingIntent.getActivity(Login.this, _id, i, 0); 
      AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); 
//   am.set(AlarmManager.RTC_WAKEUP, trigger, pi); 
//   am.setExact(AlarmManager.RTC_WAKEUP, trigger, pi); 
      am.set(AlarmManager.RTC_WAKEUP, trigger, pi); 
     } 
    }catch(ParseException ex) 
    { 
      ex.printStackTrace(); 
    } 

回答

1

的问题是您设置闹钟在时间减去当前时间的时间trigger处关闭。

您应该改为time.getTimeInMillis()

所以更换

am.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pi); 
    } 
0

线从官方docs

注:与API开始19(奇巧)报警交付是不精确的:操作系统将为了尽量减少转移警报唤醒和电池使用。有新的API支持需要严格交付保证的应用程序;请参阅setWindow(int,long,long,PendingIntent)和setExact(int,long,PendingIntent)。 targetSdkVersion早于API 19的应用程序将继续看到之前的行为,即所有报警在请求时都准确传送。

0

Bas van Stein是正确的。 AlarmManager使用绝对时间:自1970年1月1日以来的毫秒数。您正试图将其设置为相对时间:从设置闹钟时起的毫秒数。 AlarmManager解释为在1970年1月1日上午12点10分左右,时间非常接近时代。从那以后很久以后,警报立即触发。

该解决方案仅仅使用time.getTimeInMillis()代替set而不是trigger

其他一些笔记做这样的工作,因为你的应用程序是在有意矿相似:

因为API 19
  • 大多数警报会不精确,弗兰克N.斯坦指出。这种不精确程度取决于实施情况,以及将来警报产生的程度。对于可能至少每天使用药物的东西,在我的所有测试中,警报都在预定时间的一分钟内发射。

  • 您在使用当前时间作为PendingIntent中的requestCode。通过将其设置为对您的程序有意义的数字并存储该值,您可以稍后通过重新创建相同的PendingIntent来更新或取消该警报。

  • 从API级别23开始,药物警报等紧急警报应该使用setAndAllowWhileIdle()以确保其在低功耗空闲状态期间发出警报。我还不知道如果使用setRTC_WAKEUP就足以确保这种行为。