2016-01-06 17 views
10

BroadcastReceiverは、起動や時刻変更などのイベントでアラームを再スケジュールします。しかし、時間がアラームのトリガ時間を過ぎている場合(たとえば、ユーザが設定から手動で時間を変更した場合)、AlarmManagerは、アラームを再スケジュールするために1日追加できる直前にアラームを発生させます。どうすればこれを避けることができますか?AlarmManagerは、BroadcastReceiverがアラームを再スケジュールする直前にアラームを発生させます。

私は現在、Calendarの設定と追加の方法を使用してアラームをスケジュールしています。

 for (int dayOfWeek = Calendar.SUNDAY; dayOfWeek <= Calendar.SATURDAY; dayOfWeek++) { 
      if (alarm.getRepeatingDay(dayOfWeek - 1) && dayOfWeek >= nowDay && 
        !(dayOfWeek == nowDay && alarm.timeHour < nowHour) && 
        !(dayOfWeek == nowDay && alarm.timeHour == nowHour && alarm.timeMinute <= nowMinute)) { 

       calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek); 
       alarmSet = true; 
       break; 
      } 
     } 

     if (!alarmSet) { 
      for (int dayOfWeek = Calendar.SUNDAY; dayOfWeek <= Calendar.SATURDAY; dayOfWeek++) { 
       if (alarm.getRepeatingDay(dayOfWeek - 1) && dayOfWeek <= nowDay) { 
        calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek); 
        calendar.add(Calendar.WEEK_OF_YEAR, 1); 
        break; 
       } 
      } 
     } 

またドキュメントに記載されている:

述べたトリガー時間が過去になっている場合、アラームはすぐに をトリガされます。

どのようにこの動作を変更できますか?

+0

私はあなたが述べた問題を取り除くことができますよう、jobschedulerのを使用するためにあなたをお勧めします。 – UMESH0492

答えて

4

これは意図したものです。例えば、 Set a Repeating Alarm

トリガ時間。指定したトリガ時間が過去のものであれば、アラームがすぐにトリガされます。

または同じhere

述べたトリガー時間が過去にある場合は、アラームがすぐにトリガされます。このお

if(alarmTimeStamp < System.currentTimeMillis()) { 
    // if is repeating schedule in __interval__ 
    // else ignore 
} 

または日付が過去であれば、あなたの受信機でそれらを無視し、手動に追加する前に、あなたのアラームを確認する必要があります回避するために

+0

私は知っている、私はドキュメントを読んだ。しかし、私は明らかにこれが起こるのを止める方法を望んでいます。 – Piyush

+0

@PiyushShrivastavaが答えを更新しました。あなたは一般的な解決策がないので、自分で日付のチェックを行う必要があります。 –

+0

私は日付チェックを実装しました。しかし問題は、レシーバーが呼び出される前にアラームマネージャーがアラームをトリガーすることです。それ以前に受信機を呼び出す方法を教えてください。 – Piyush

0

Davidが述べたように、使用する前にアラームの日付/時刻を事前にチェックしてください。それが過去の場合は、AlarmManagerにそれを送る前に、何分か2分を追加してください。

ユーザーが日付/時刻を入力している場合は、同じ方法で入力を事前にチェックします。

+0

入力の事前確認は、ユーザーがアラーム時刻を変更した場合にのみ可能です。時間が設定から変更されていない場合。 – Piyush

0

時間の変化を聞くためにBroadcastReceiverを作成することはどうですか。 Manifestファイルで

<receiver android:name=".MyReceiver"> 
      <intent-filter > 
       <action android:name="android.intent.action.TIME_SET"/> 
      </intent-filter> 
</receiver> 

とあなたのBroadcastReceiverファイル

public class MyReceiver extends BroadcastReceiver{ 

    @Override 
    public void onReceive(final Context context, Intent intent) { 
     Log.d("MyReceiver", "Time Changed"); 
     // The times have changed; so have their signs. 
     updateYourAlarm(); 
    } 
} 
+0

すでにTIME_SETアクションとDATE_CHANGEDアクションがマニフェストに追加されています。問題は依然として続きます。 – Piyush

+0

BroadcastReceiver onReceiveは、手動で日付や時刻を変更するときに複数回呼び出されます。マニフェストでは、この2つをインテントフィルタTIME_SETとDATE_CHANGED –

関連する問題