2013-07-15 25 views
5

これは基本的に私はこのコードを持っています。時間は24時間戻り、毎日アラームを繰り返します。AlarmManagerは、同じ日に設定された時刻より前にアラームを発します。setRepeating

public setAlarm(String time, Context context){ 
    String[] strTime; 

    strTime = time.split(":"); 

    int hour, min, sec; 
    //set when to alarm 
    hour = Integer.valueOf(strTime[0]); 
    min = Integer.valueOf(strTime[1]); 
    sec = 0; 

    Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.HOUR_OF_DAY, hour); 
    cal.set(Calendar.MINUTE, min); 
    cal.set(Calendar.SECOND, sec); 
    //Create a new PendingIntent and add it to the AlarmManager 
    Intent intent = new Intent(context, AlarmReceiverActivity.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 19248, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager am = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE); 
    am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); 
} 

とにかく、問題は、午前9時10分にアラームを午前9時に設定するとアラームが消えてしまうことです。どうして?私はそれがシステム時間を過ぎて設定されている場合、それが警戒しないようにします。 Ex。システム時刻は9:10

答えて

19

私はそれが今働いて得ている間、午前9時のアラームを設定します。私は、アラーム時刻と現在時刻のチェッカーを追加しました。

public setAlarm(String time, Context context){ 
     String[] strTime; 

     strTime = time.split(":"); 

     int hour, min, sec; 
     //set when to alarm 
     hour = Integer.valueOf(strTime[0]); 
     min = Integer.valueOf(strTime[1]); 
     sec = 0; 

     long _alarm = 0; 
     Calendar now = Calendar.getInstance(); 
     Calendar alarm = Calendar.getInstance(); 
     alarm.set(Calendar.HOUR_OF_DAY, hour); 
     alarm.set(Calendar.MINUTE, min); 
     alarm.set(Calendar.SECOND, sec); 

     if(alarm.getTimeInMillis() <= now.getTimeInMillis()) 
      _alarm = alarm.getTimeInMillis() + (AlarmManager.INTERVAL_DAY+1); 
     else 
      _alarm = alarm.getTimeInMillis();    

     //Create a new PendingIntent and add it to the AlarmManager 
     Intent intent = new Intent(context, AlarmReceiverActivity.class); 
     PendingIntent pendingIntent = PendingIntent.getActivity(context, 19248, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     AlarmManager am = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE); 
     am.setRepeating(AlarmManager.RTC_WAKEUP, _alarm, AlarmManager.INTERVAL_DAY, pendingIntent); 
    } 
+1

AlarmManager.INTERVAL_DAY +1 - なぜあなたは+1を追加しますか? –

+0

「アラームが遅れた場合(システムスリープ、たとえば非_WAKEUPアラームタイプの場合)、できるだけ早くスキップされたリピートが配信されます。その後、元のスケジュールに従って将来のアラームが配信されます。時間の経過とともにドリフトすることはありません。たとえば、1時間ごとに定期的にアラームを設定していても、電話機が7時45分から8時45分までスリープしていた場合は、電話が覚醒するとすぐにアラームが送信され、次のアラームが送信されます9:00。 "それで、あなたが同じ日にそれを設定すると、アラームが発せられます – FeanDoe

0

利用setInexactRepeating代わりのsetRepeating

Calendar cal= Calendar.getInstance(); 
    cal.set(Calendar.HOUR_OF_DAY, 9); 
    cal.set(Calendar.MINUTE, 0); 
    cal.set(Calendar.SECOND, 0); 
    PendingIntent pi = PendingIntent.getService(context, 0, 
     new Intent(context, MyClass.class),PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 
          AlarmManager.INTERVAL_DAY, pi); 
+0

setInexactRepeatingにsetRepeatingの主な違いは何でしょうか... – useletters

+0

uは正確にアラームを起動したい[開発者向けのAndroid](http://developer.android.com/reference/android/app/AlarmManager.html) –

+0

まだ同じ問題があります。 'Intent intent = new Intent(context、AlarmReceiverActivity.class); \t \t PendingIntent pendingIntent = PendingIntent.getActivity(コンテキスト、19248、intent、PendingIntent.FLAG_CANCEL_CURRENT); \t \t AlarmManager am =(AlarmManager)context.getSystemService(Activity.ALARM_SERVICE); \t \t am.setInexactRepeating(AlarmManager.RTC_WAKEUP、cal.getTimeInMillis()、AlarmManager.INTERVAL_DAY、pendingIntent); ' – useletters

1

私はそれを試して解決策を見つけたので間違った答えがあります。

あなたがここに見ることができるように、ので、それは間違っている:「今カレンダー」 Calendar now = Calendar.getInstance(); Calendar alarm = Calendar.getInstance(); alarm.set(Calendar.HOUR_OF_DAY, hour); alarm.set(Calendar.MINUTE, min); alarm.set(Calendar.SECOND, sec);

、彼らがやっているので、「カレンダーアラームは」いつもどんな同じになることはありませう同じことがほぼ同じコードにあるので、Calendar.getInstance()は常に同じになります。

溶液をこの

long _alarm; Calendar now = Calendar.getInstance();ある長いoldtimer = now.getTimeInMillis()。

cal.set(Calendar.HOUR_OF_DAY, Hours2int); 
    cal.set(Calendar.MINUTE, minutes2int); 
    cal.set(Calendar.SECOND, cur_cal.get(Calendar.SECOND)); 
    cal.set(Calendar.MILLISECOND, cur_cal.get(Calendar.MILLISECOND)); 
    cal.set(Calendar.DATE, cur_cal.get(Calendar.DATE)); 
    cal.set(Calendar.MONTH, cur_cal.get(Calendar.MONTH)); 

    //Calendar alarm = Calendar.getInstance(); 

    long newtimer = cal.getTimeInMillis(); 


    if(newtimer < oldtimer) { 
関連する問題