android - 如何检测用户在电池优化中从 "Not optimized"列表中删除了我的应用程序?

标签 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:" + packageName));
    startActivityForResult(intent, BATTERY_OPTIMIZATION_REQUEST);

onActivityResult()我检查他是否真的将其添加到“未优化”列表中。到目前为止一切顺利。我的应用程序启动它的服务,该服务获取并持有 WAKE_LOCK 并永久工作(是的,我知道这会耗尽电池,但我的用例需要它)。

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

我的问题:
  • 是否有我可以注册的广播以获得电池优化设置更改的通知?
  • 如果没有,是否有其他方法可以检测我的应用程序的电池优化设置已更改,而不是使用 isIgnoringBatteryOptimizations() 定期检查其状态?

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

    最佳答案

    有系统广播可以收听:android.os.action.POWER_SAVE_WHITELIST_CHANGED .可以找到 PowerManager.ACTION_POWER_SAVE_WHITELIST_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 - 如何检测用户在电池优化中从 "Not optimized"列表中删除了我的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45770063/

    相关文章:

    java - native 应用程序获取电池电量

    ios - IOS低电量提示如何响应?

    android - 如何下载 apache-mime4j-0.6.1.jar 到 Eclipse?

    Android:ContentProvider 是否将所有数据加载到游标或这只是惰性加载

    android - 设备重启后,我的应用接收 BOOT_COMPLETED 广播比其他应用慢/晚?

    android - BroadcastReceiver 所需的帮助

    android - 在 android ICS(版本 4)上使用广播接收器

    javascript - navigator.webkitBattery 在谷歌浏览器中不工作

    java - Android AsyncTask-to-Activity 回调 nullPointerException

    android - 如何在 fragment 之间实现向后滑动?