30
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Doze無効化対策コード

Last updated at Posted at 2017-03-13

例えば、過去に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" />

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

注意点は、上記でユーザがダイアログで許可した後に
設定→電池→メニュー開く→電池の最適化
を開くと反映されていないようにみえる点です。
実際は反映されています。設定アプリを一度殺してから開くと反映されます。

30
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?