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

Posted

技术标签:

【中文标题】即使从“未优化的应用程序”中删除 PowerManager.isIgnoringBatteryOptimizations 也始终返回 true【英文标题】:PowerManager.isIgnoringBatteryOptimizations always returns true even if is removed from 'Not optimized apps' 【发布时间】:2018-10-18 07:18:59 【问题描述】:

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

现在我想显示一个弹出窗口,通知用户我的应用是否未在打盹白名单中,因为这可能会停止我的后台(实际上是前台)服务...

我愿意:

 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
            

但 PowerManager.isIgnoringBatteryOptimizations 始终返回“true”,即使它再次从“未优化的应用程序”中删除也是如此。只有当我卸载应用程序'false'再次返回... 在 Galaxy Note 8 (android 8.0) 和 Emulator 8.1 上测试

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

【问题讨论】:

我看不到您使用 8.0 或 8.1 模拟器描述的行为。我确实看到了刷新“未优化”应用列表的相关问题:issuetracker.google.com/issues/37067894 我猜你的应用必须满足这些whitelisting conditions,只有这样它才会被列入任何优化的白名单。 @Rahul Thakur: -> 任务自动化应用 -> 应用的核心功能是调度自动化操作,例如即时消息、语音呼叫、新照片管理或定位操作。如果适用。可以接受 我想您的解决方案在于在需要时启动前台服务,而不是尝试将应用程序加入白名单以避免电池优化。查看此 [链接] (developer.android.com/training/monitoring-device-state/…) 以了解有关前台服务的更多信息。我还建议您查看 2016 年 Google IO 会议关于应用程序打瞌睡和待机,以找出最适合您的方法。这将帮助您找出不涉及将您的应用列入白名单的用户交互。 @RahulThakur 该服务仍然在 MIUI/funtouch OS/oxygen OS 等自定义 UI 中被杀死。这个问题有什么解决办法吗? 【参考方案1】:

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

<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);

我已经在 8.1 模拟器上对其进行了测试,并且得到了相同的行为。您可以在设置中的所有应用列表中取消安装应用或将其状态从优化切换为未优化。我猜 Bob Snyder 在 google tracker 中显示了正确的问题。

【讨论】:

以上是关于即使从“未优化的应用程序”中删除 PowerManager.isIgnoringBatteryOptimizations 也始终返回 true的主要内容,如果未能解决你的问题,请参考以下文章

即使从配置文件中删除了 UDID,iOS 应用程序仍在安装到设备中

java.util.ConcurrentModificationException 从数组列表中删除元素时,即使使用迭代器

即使从 hdfs 删除后,Hive 如何读取数据?

jHipster - 即使从实体中删除权限,AngularJS 路由也会重定向到登录

即使项目不连续使用Python,如何从长嵌套列表中删除短列表?

即使从门户中删除,逻辑应用工作流也会继续发布消息