7

Android 6.0までは常に動作するアプリを作っています。私はそれが私のアラームが発射することを許可していないDoze機能だと思う。Android 6.0 Dozeモードでのアラームマネージャの問題

私はオプションを処理するためにsharedpreferencesを使用します。

//ENABLE NIGHT MODE TIMER 
    int sHour = blockerTimerPreferences.getInt("sHour", 00); 
    int sMinute = blockerTimerPreferences.getInt("sMinute", 00); 

    Calendar sTime = Calendar.getInstance(); 
    sTime.set(Calendar.HOUR_OF_DAY, sHour); 
    sTime.set(Calendar.MINUTE, sMinute); 

    Intent enableTimer = new Intent(context, CallReceiver.class); 
    enableTimer.putExtra("activate", true); 
    PendingIntent startingTimer = PendingIntent.getBroadcast(context, 11002233, enableTimer, PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager sAlarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    sAlarm.setRepeating(AlarmManager.RTC_WAKEUP, 
      sTime.getTimeInMillis(), 
      AlarmManager.INTERVAL_DAY, startingTimer); 

ここでいただきました!間違ったの任意の手掛かり?

これは通話をブロックするアプリです。ありがとうございました!

EDIT: 私のような3つのファイル(よりますが...)持っている: setExactAndAllowWhileIdleまたは :デバイスが居眠りモードになっている場合は、これらのAPIのいずれかを使用する必要が

MainActivity (All code) 
CallReceiver (Broadcast that triggers the alarm again (reboot etc)) 
CallReceiverService (Handles the call/phone state) 
+1

使用 'adbのシェルdumpsysは、あなたのアラームがあることを確認するためにalarm'スケジュールされた。 'setRepeating()'はAndroid 4.4以降では不正確です。 「これもバッテリーの消耗を引き起こしている」 - それは起こりそうにない。実行されないコードはバッテリーを消費しないでください。 – CommonsWare

+0

こんにちは@コモンズウェア、52の起床と52の警報...常に警報を発しています。 'setRepeating()'はその分だけ起動しますが、問題はありません。 – FilipeOS

+0

@FilipeOSそれを機能させましたか? dozeモードでalarmManager.setRepeating()を実装できますか? – devgeek

答えて

13

Dozeモードは、次のメンテナンスウィンドウまでアラームを遅らせます。 Doze modeがアラームをブロックしないようにするには、setAndAllowWhileIdle(),setExactAndAllowWhileIdle()またはsetAlarmClock()を使用できます。あなたは

(ただし _AndAllowWhileIdleを持つメソッドに一度15分あたり以上ではない)あなたのコードを実行し、あなたの次のアラームを設定するには約10SあなたはDozeモードをテストしたい場合は、あなたが ADB commandを使用することができますがあります。

  1. Android 6.0(APIレベル23)以上のシステムイメージでハードウェアデバイスまたは仮想デバイスを設定します。

  2. デバイスを開発マシンに接続し、アプリケーションをインストールします。

  3. アプリを実行し、アクティブなままにします。
  4. デバイスの画面をシャットダウンします。 (アプリがアクティブのままになります。) 次のコマンドを実行して、ドーズモードを順番にシステムを強制的に:

    adb shell dumpsys battery unplug

    adb shell dumpsys deviceidle step

  5. をあなたは複数回2番目のコマンドを実行する必要があるかもしれません。デバイスの状態がアイドル状態になるまで繰り返します。

  6. 端末の再起動後にアプリの動作を観察します。デバイスがDozeを終了したときにアプリが正常に回復することを確認します。

編集:

はSDKレベル(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)を確認することを忘れないでくださいsetAlarmClock例を追加し

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
Intent intent = new Intent(this, MyAlarmReceiver.class); //or just new Intent() for implicit intent 
//set action to know this come from the alarm clock 
intent.setAction("from.alarm.clock"); 
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
//Alarm fire in 5s. 
am.setAlarmClock(new AlarmManager.AlarmClockInfo(System.currentTimeMillis() + 5000, pi), pi); 
+0

こんにちは@ xiaomi、ちょうど 'setAlarmClock'の' setRepeating'を置き換えますか?同じパラメータで?あなたは例を挙げていただけますか?ありがとうございました! – FilipeOS

+0

私は自分の答えを編集しますが、これはあまり違いはありません。 – xiaomi

+0

これは、5秒後にアラームを発する例です。あなたが望む時間を選択してください。 – xiaomi

1

setAndAllowWhileIdle

繰り返しアラームのためにドーズモードでデバイスを起動するためのAPIがないことに注意してください。したがって、ドーズ時にデバイスを復帰させるには繰り返しアラームが必要な場合は、上記のAPIを使用して、タイマーが起動するたびにタイマーを起動します。

関連する問題