例えば、過去に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" />
これを起動時に毎回通るコードに書いておけば忘れなくなります。
注意点は、上記でユーザがダイアログで許可した後に
設定→電池→メニュー開く→電池の最適化
を開くと反映されていないようにみえる点です。
実際は反映されています。設定アプリを一度殺してから開くと反映されます。