You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取请求isIgnoringBatteryOptimizations权限后的操作结果?

获取电池优化忽略权限的用户操作结果

要获取用户对电池优化权限申请的操作结果,你需要通过启动Activity并监听返回结果的方式实现——因为这个权限申请是跳转到系统设置页面完成的,无法通过普通的权限请求回调处理。以下是两种可行的实现方式:

方法1:使用startActivityForResult(兼容旧版代码)

先定义一个请求码,把原来的startActivity(intent)替换为startActivityForResult,再重写onActivityResult方法,在回调中重新检查权限状态:

private val REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = 1001

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
    if (!powerManager.isIgnoringBatteryOptimizations(packageName)) {
        val intent = Intent().apply {
            action = Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
            data = Uri.parse("package:$packageName")
            flags = Intent.FLAG_ACTIVITY_NEW_TASK
        }
        // 替换为启动并请求结果
        startActivityForResult(intent, REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
    } else {
        // 已拥有权限,执行后续逻辑
    }
}

重写onActivityResult处理结果:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) {
        val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
        val hasPermission = powerManager.isIgnoringBatteryOptimizations(packageName)
        
        if (hasPermission) {
            // 用户完成授权,执行对应逻辑
        } else {
            // 用户拒绝授权,可提示用户或做其他处理
        }
    }
}

方法2:使用Activity Result API(AndroidX推荐方案)

如果你的项目使用AndroidX,推荐用这种更安全的方式,避免startActivityForResult的废弃问题:

首先注册一个Activity结果契约:

private val requestBatteryOptimization = registerForActivityResult(
    ActivityResultContracts.StartActivityForResult()
) { _ ->
    val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
    val hasPermission = powerManager.isIgnoringBatteryOptimizations(packageName)
    
    if (hasPermission) {
        // 授权成功逻辑
    } else {
        // 授权拒绝逻辑
    }
}

然后修改启动逻辑:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
    if (!powerManager.isIgnoringBatteryOptimizations(packageName)) {
        val intent = Intent().apply {
            action = Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
            data = Uri.parse("package:$packageName")
            flags = Intent.FLAG_ACTIVITY_NEW_TASK
        }
        // 启动设置页面并监听结果
        requestBatteryOptimization.launch(intent)
    } else {
        // 已拥有权限,执行后续逻辑
    }
}

关键说明

不要依赖resultCode判断授权状态,因为系统设置页面的返回码无法准确反映用户是否完成授权。最可靠的方式是在回调中再次调用isIgnoringBatteryOptimizations方法确认权限状态。

内容的提问来源于stack exchange,提问作者Hyejung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:05:29