私はこの質問は、stackoverflowで何度も尋ねられますが、まだ多くの人がそれを解決するのに苦労していると思います。Dozeモードは私のアプリケーションにとって重要です
私のアンドロイドアプリでは、現在の場所を取得してサーバーに送信するために30分ごとにデバイスを起動する必要があります。このため私はsetExactAndAllowWhileIdle()メソッドとWakefulBroadcastReceiverでAlarmManagerを使用しました。ほぼすべての標準/一般的なデバイスでうまく動作しますが、主に中国のデバイスがサポートしていないか、setExactAndAllowWhileIdle()でデバイスを起動させることができません。私はMoto G4 plus(Android OS 6.1)のデバイスで、アラームマネージャが特定の間隔で目を覚まさないようにしています。
AlarmManagerを使用してwakefulBroadcastReceiverを呼び出すと、wakefulIntentserviceがバックグラウンドタスクを実行します。その排水バッテリーは批判的にまたドーズモード(ノーガット)で、バックグラウンド作業をしていない。それ以外の場合は、バックエンドサービスからのデータをキャプチャします。
my code is here->>
// Setup periodic alarm every 30 minutes
if (android.os.Build.VERSION.SDK_INT >= 23) {
syncDbAlarmManager.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
intervalMillis, pIntent);
} else if (android.os.Build.VERSION.SDK_INT >= 19
&& android.os.Build.VERSION.SDK_INT < 23){
syncDbAlarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, triggerAtMillis/*firstMillis*/,
intervalMillis, pIntent);
} else {
syncDbAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtMillis/*firstMillis*/,
intervalMillis, pIntent);
}
私もPowerManagerを使用している - >
PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
"com.example.johnbravado");
wakeLock.acquire();
// Do Work
MyConstants.getInstance().msgReqAction(intent.getIntExtra(MyConstants.BROADCAST_DATA_REQ, 0));
wakeLock.release();
しかし、それはあまりにも多くの電池を消費し、スリープ(Doze)モードに入った後も動作しなくなる。 @FabioC –
いいえ、私はwakeLockをリリースしていません。デフォルトでは、スリープモードに入った後もサービスを起動しません。 –