2017-01-20 11 views
1

私はここにあるすべての同様の質問について読んだことがありますが、回答が見つからないので、前に答えがあったら私は本当に検索しようとしました。Android AlarmManager PendingIntentがalarm.set()の呼び出しの前に起動されます

一定時間後に通知を表示するようにアラームを設定しています。時間ロジックは確固たるものですが、私はログ出力でこれを知ることができますが、これは問題ではありません。

私はそうのような保留中の意図を作成します。

Intent alarmIntent = new Intent(c, AlarmReceiver.class); 
alarmIntent.putExtra("title", name); 
alarmIntent.putExtra("location", building); 
PendingIntent pi = PendingIntent.getBroadcast(c, 0, alarmIntent, 0); 

、その後はmillisミリ秒後に発射するアラームを設定しました。この例では、私のログステートメントによればmillis407603959です。それは間違いなく1秒後に発射すべきではありません。

alarm.set(AlarmManager.RTC_WAKEUP, millis, pi); 
Log.i("Alarm", "Alarm: " + name + " is set for: " 
     + untilAlarm.getDays() + " days, " + untilAlarm.getHours() + " hours, " 
     + untilAlarm.getMinutes() + " minutes from now. Or, " + millis 
     + " milliseconds"); 

アラームが設定される前に私のPendingIntentが開始されているかのように見えます。私はそうのように作成されてからアラームを遮断しようとした:

Intent alarmIntent = new Intent(c, AlarmReceiver.class); 
alarmIntent.putExtra("title", name); 
alarmIntent.putExtra("location", building); 
PendingIntent pi = PendingIntent.getBroadcast(c, 0, alarmIntent, 
     PendingIntent.FLAG_ONE_SHOT); 

if (!name.equals("test") { 
    alarm.set(AlarmManager.RTC_WAKEUP, millis, pi); 
    //Log statement... 
} 

testのアラームがまだトリガされますが、ログの文がコンソールに出力されていない、alarm.setが呼ばれることはなかったという意味します。インテントはまだ実行されており、通知はタイトル "test"とともに表示されます。

アラームが発生する前に私のPendingIntentが起動しているのはなぜですか?

+1

407603959(ミリ秒)が過去に_waaaay_ので、アラームはかなり火災すべきです多くの場合即座に設定されます。設定されていないと発砲しているかどうかを判断するのに十分な情報ではありません。 –

+0

ああ、私はそれがCalendar.getInstance().getTimeInMillis()+ミルズする必要がありますね? – Plays2

+1

今後、407603959ミリ秒後に発射したい場合は、 –

答えて

2

AlarmManager.RTC_WAKEUPのアラームタイプを使用しています。これにより、指定された時刻にアラームが開始されます。ケースはmillisです。

将来的には一定の時間に開始するようにアラームを設定するには、経過時間のアラームこれらのタイプの上で使用するか必要があります。

  • ELAPSED_REALTIME

SystemClock.elapsedRealtime()のアラーム時刻(起動後の時刻、sleepを含む )。このアラームはデバイスを起動させません。デバイスがスリープ中に がオフになると、次回デバイスが起動するまで までは配信されません。

  • ELAPSED_REALTIME_WAKEUP

それがオフになったときにデバイスを起動しますSystemClock.elapsedRealtimeでアラーム時間()(睡眠などのブート、 からの時間)、。

または現在の時刻とRTCまたはRTC_WAKEUPを使用し、プラスのように、待機する時間:、 `RTC`アラームの

alarm.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + millis, pi); 
+0

はい。それがそれでした。サイドノート2番目のアラームを作成した場合、正しい余分な文字列が確実に渡されるように、ONE_SHOTフラグを使用して保留中のインテントを作成する必要がありました。私は将来の参照のために質問を編集します – Plays2

関連する問題