Android 6および7には、デバイスが使用されていないときにアプリのネットワークを制限するいくつかの電力最適化(居眠りモード)があります。
ユーザーは、バッテリー設定でアプリの最適化モードを無効にできます。
アプリで最適化が有効になっているかどうかを確認することはできますか?アプリの機能を向上させるために最適化を無効にするようユーザーに要求する必要がありますが、プログラムで最適化を確認する方法がわかりません。
これは追跡するのが少しトリッキーでした:ここにあなたが探しているものがあります
コトリン
/**
* return false if in settings "Not optimized" and true if "Optimizing battery use"
*/
fun checkBatteryOptimized(): Boolean {
val pwrm = applicationContext.getSystemService(Context.POWER_SERVICE) as PowerManager
val name = applicationContext.packageName
if (VERSION.SDK_INT >= VERSION_CODES.M) {
return !pwrm.isIgnoringBatteryOptimizations(name)
}
return false
}
これは最適化アクティビティを表示します
fun checkBattery() {
if (isBatteryOptimized() && VERSION.SDK_INT >= VERSION_CODES.Lollipop_MR1) {
val name = resources.getString(R.string.app_name)
Toast.makeText(applicationContext, "Battery optimization -> All apps -> $name -> Don't optimize", Toast.LENGTH_LONG).show()
val intent = Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS)
startActivity(intent)
}
}
マニフェストにこの権限を追加します。
<uses-permission Android:name="Android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
ホワイトリストのリクエスト/アプリを有効にした最適化
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Intent intent = new Intent();
String packageName = getPackageName();
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
if (!pm.isIgnoringBatteryOptimizations(packageName)) {
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
startActivity(intent);
}
}
サンプルコード:
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (pm != null && !pm.isIgnoringBatteryOptimizations(getPackageName())) {
askIgnoreOptimization();
} else {
accepted;
}
} else {
accepted;
}
静的変数の宣言
private static final int IGNORE_BATTERY_OPTIMIZATION_REQUEST = 1002;
BATTERY_OPTIMIZATIONSのダイアログを表示
private void askIgnoreOptimization() {
if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.M) {
Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, IGNORE_BATTERY_OPTIMIZATION_REQUEST);
} else {
openNextActivity();
}
}
このコードが役に立つかもしれません!