Android 12 电池优化

AVE*_*imi 11 optimization android battery android-powermanager android-12

我正在尝试检查 Android 12 是否正在优化我的应用程序电池使用情况,因此我使用了 isIgnoringBatteryOptimizations方法( https://developer.android.com/reference/android/os/PowerManager#isIgnoringBatteryOptimizations(java.lang.String))。但是isIgnoringBatteryOptimizations返回一个布尔值yes,它已经过优化,而 Android 12 有 3 个级别的优化(查看屏幕截图):

  1. 无限制
  2. 优化
  3. 受限制的

我的应用程序在 1 和 2 的情况下工作正常,我想在受限模式下显示警告。

在此输入图像描述

Ism*_*ael 7

经过一些研究,许多其他帖子尝试通过执行以下代码来解决这个问题:

添加到清单:

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
Run Code Online (Sandbox Code Playgroud)

使用此函数来请求优化:

PowerManager pm = (PowerManager) context.getSystemService(POWER_SERVICE);
if (!pm.isIgnoringBatteryOptimizations(packageName)) 
{
    intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
    intent.setData(Uri.parse("package:" + "YOUR_PACKAGE_NAME"));
    context.startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)

正如您在帖子中提到的,isIgnoringBatteryOptimizations 仅在情况 1 中才为真。除此之外,Google 似乎对这种方法不太满意,您的应用程序可能不会发布。

我发现以下方法可以更方便地工作:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) 
{
    ActivityManager am = (ActivityManager)getContext().getSystemService(Context.ACTIVITY_SERVICE);
    Boolean isRestricted = am.isBackgroundRestricted();
    if(isRestricted)
    {
        // Show some message to the user that app won't work in background and needs to change settings
        //... (implement dialog)
        // When user clicks 'Ok' or 'Go to settings', then:
        openBatterySettings();
    }
}

private void openBatterySettings()
{
    Intent intent = new Intent(); 
    intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
    getContext().startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)

如果您想查找情况 3,则此代码有效。请考虑情况 3 仅与 Android API 28 及更高版本相关,当 API < 28 时应用程序不应在后台被终止,当 API < 28 时不存在情况 3 。 希望能帮助到你。