2017-05-15 4 views
0

ユーザーが選択した特定の時刻に、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日待たずにデバッグしてコードテストを行うアイデアはありますか?

ありがとうございます。

答えて

関連する問題