Android 如何检测用户从“删除我的应用程序”;“未优化”;电池优化中的列表?

Android 如何检测用户从“删除我的应用程序”;“未优化”;电池优化中的列表?,android,broadcastreceiver,battery,android-powermanager,Android,Broadcastreceiver,Battery,Android Powermanager,我有一个需要忽略打盹模式的应用程序,它要求用户使用以下常用方式将其添加到未优化的应用程序列表中: Intent intent = new Intent(); String packageName = getPackageName(); intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); intent.setData(Uri.parse("package:" + packag

我有一个需要忽略打盹模式的应用程序,它要求用户使用以下常用方式将其添加到未优化的应用程序列表中:

    Intent intent = new Intent();
    String packageName = getPackageName();
    intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
    intent.setData(Uri.parse("package:" + packageName));
    startActivityForResult(intent, BATTERY_OPTIMIZATION_REQUEST);
在onActivityResult()中,我检查他是否真的将其添加到了“未优化”列表中。到目前为止还不错。我的应用程序启动它的服务,获得并保持唤醒锁并永久工作(是的,我知道这会耗尽电池,但我的用例需要它)

我的问题是,稍后用户可能会决定从“未优化”列表中删除该应用程序

我的问题:

  • 是否有广播,我可以注册以获得电池优化设置更改的通知

  • 如果没有,是否有其他方法检测我的应用程序的电池优化设置已更改,而不是使用
    isignoringbatteryooptimizations()定期检查其状态


  • 起初我认为在这种情况下,应用程序将被停止(就像权限被删除一样),但事实并非如此。

    您可以收听一个系统广播:
    android.os.action.POWER\u SAVE\u WHITELIST\u CHANGED
    。它可以在PowerManager.ACTION\u POWER\u SAVE\u WHITELIST\u CHANGED中找到,但它在API中是隐藏的,没有文档记录

    请注意,电池优化白名单中的任何更改都会触发此操作,而不仅仅是您的应用程序

    IntentFilter intentFilter = new IntentFilter("android.os.action.POWER_SAVE_WHITELIST_CHANGED");
    BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            // the battery optimization whitelist changed
            // TODO: check if isIgnoringBatteryOptimizations()
        }
    };
    context.registerReceiver(broadcastReceiver, intentFilter);
    

    @跳跳虎将返回简单的“android.settings.REQUEST\u IGNORE\u BATTERY\u OPTIMIZATIONS”,这是我刚刚用
    setAction()设置的。不是吗?你能解决这个问题吗?@user1002448不,到目前为止我无法解决它。你如何检查应用程序是否在“未优化”列表中?@user1002448 isIgnoringBatteryOptimizations()很好,我已经测试过,它可以正常工作。它救了我一天。这应该是一个公认的答案。