即使从"未优化的应用程序"中删除,PowerManager.isIgnoringBatteryOptimizations也始终返回true

ste*_*fan 6 android android-doze-and-standby android-doze

我有一个里程日志应用程序,可以进行GPS跟踪,并能够在后台建立与汽车的OBDII连接.

现在我想显示一个Popup,告诉用户我的应用程序是否在打盹中没有列入白名单,因为这可能会停止我的后台(实际上是前景)服务...

我做:

 String PACKAGE_NAME = getApplicationContext().getPackageName();
            PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
            boolean status = false;
            status = pm.isIgnoringBatteryOptimizations(PACKAGE_NAME);

            if (!status) {
                // show popup
            }
Run Code Online (Sandbox Code Playgroud)

但是PowerManager.isIgnoringBatteryOptimizations总是返回'true',即使它再次从'Not optimized apps'中删除.只有当我卸载应用程序'false'时才会再次返回...在Galaxy Note 8(Android 8.0)和Emulator 8.1上测试

问题很简单:这是一个错误吗?或者如何从白名单中删除应用程序,以便PowerManager.isIgnoringBatteryOptimizations再次返回'false'?

小智 3

我制作了一个简单的活动应用程序,要求

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

并将这段代码放入onCreate中

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Intent intent = new Intent();
    String packageName = this.getPackageName();
    PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
    if (pm.isIgnoringBatteryOptimizations(packageName))
        intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
    else {
        intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
        intent.setData(Uri.parse("package:" + packageName));
    }
    this.startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)

我已经在 8.1 模拟器上对其进行了测试,并且得到了相同的行为。您可以在设置的所有应用程序列表中取消安装应用程序或将其状态从优化切换为未优化。我猜鲍勃·斯奈德在谷歌跟踪器中显示了正确的问题。