ユーザーが選択した特定の時刻に、6 '/ 7'/8 'のように毎日通知をトリガーします。AlarmsManagerは必要なときにいつでも起動します
このため、通知を作成するためにIntentService
に渡すWakefulBroadcastReceiver
を作成しました。
これは私のAlarmsManagerの設定方法です。 timeInHours
は6と12の間にパラメータとして渡された整数、次のとおりです。
Intent i = new Intent(context, StepCountNotifyBroadcast.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
// Get the next day at timeInHours hours'.
Calendar cal = Calendar.getInstance();
cal.setTime(new Date()); // compute start of the day for the timestamp
cal.set(Calendar.HOUR_OF_DAY, timeInHours);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
cal.set(Calendar.AM_PM, Calendar.AM);
if (new Date().getTime() > cal.getTime().getTime())
cal.add(Calendar.DAY_OF_YEAR, 1);
long nextDay = cal.getTime().getTime();
// Setup the alarm.
long timeBetween = AlarmManager.INTERVAL_DAY; // Each day.
AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarms.cancel(pi);
alarms.setRepeating(AlarmManager.RTC_WAKEUP, nextDay, timeBetween, pi);
Date nextDayAsDate = new Date(nextDay);
GLog.d("AlarmUtils", "scheduleNotifiation for next date: " + nextDayAsDate.toString());
これはよく時間の50%に動作しますが、それでも...のような狂気の事は午前2時に通知をトリガしますか! 私が望む特定の時刻に通知がトリガーされないことはわかっていますが、これは問題ありません。しかし、ここで約18時間後に話します。
ログでは、IntentServiceコードが真夜中に効果的に実行されているようです。したがって、それは通知そのものの問題ではありません。コードの別の行に
alarms.setRepeating(AlarmManager.RTC_WAKEUP, nextDay, timeBetween, pi);
:
alarms.setExact(AlarmManager.RTC_WAKEUP, nextDay, pi);
をしかし、これは、私は怖いバッテリ寿命のために良いではありません
私はこの行を切り替えることができます。
は今私の質問:
- 誰かが私にAndroidデバイスがAlarmsManagerで動作する方法についての理由を教えてください。
- バッテリの寿命を延ばすこと以外の解決策がありますか?通知は最大2〜3時間後に開始されますか?
- この特定のケースでは、問題を検出するのを1〜2日待たずにデバッグしてコードテストを行うアイデアはありますか?
ありがとうございます。