Android

Doze無効化対策コード

More than 1 year has passed since last update.

例えば、過去にAndroid端末のデータを一定間隔でサーバに送り続ける試作アプリを作ったが、Android 6.0あるいは7.xでは正常に動かなくなってしまったということはないでしょうか?

その場合、6.0で導入され、7.0で仕様が変更になったDoze(バッテリー最適化)モードが悪さをしている可能性があります。

回避するには、設定→電池→メニュー開く→電池の最適化→すべてのアプリを開いて該当アプリを「最適化しない」に変更する必要があります。

しかし、開発中にインストールするたびに毎回設定するのは面倒だし忘れる可能性があります。

そこで下記のようにするとユーザにダイアログを出して、許可されたらDozeを無視するようできます。

PowerManager powerManager = getSystemService(PowerManager.class);

if (!powerManager.isIgnoringBatteryOptimizations(getPackageName())) {
Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
}

また、マニフェストに下記設定も必要になります。


AndroidManifest.xml

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />


これを起動時に毎回通るコードに書いておけば忘れなくなります。

注意点は、上記でユーザがダイアログで許可した後に

設定→電池→メニュー開く→電池の最適化

を開くと反映されていないようにみえる点です。

実際は反映されています。設定アプリを一度殺してから開くと反映されます。