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

如何监听系统中应用专属设置(如电池优化)的变更?

监听Android应用系统专属设置变更的方法

针对系统设置中应用专属选项(如电池优化、后台限制等)的变更,可通过以下方式监听:

一、电池优化状态变更

系统没有直接广播通知单个应用的电池优化状态变化,但可通过监听省电模式切换广播,在回调中主动检查自身应用的电池优化状态:

  1. 注册ACTION_POWER_SAVE_MODE_CHANGED广播接收器
  2. 在回调中调用PowerManager.isIgnoringBatteryOptimizations()判断当前状态

示例代码(Kotlin):

val batteryOptReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (intent?.action == Intent.ACTION_POWER_SAVE_MODE_CHANGED) {
            context?.let { ctx ->
                val powerManager = ctx.getSystemService(Context.POWER_SERVICE) as PowerManager
                val isAppOptimized = !powerManager.isIgnoringBatteryOptimizations(ctx.packageName)
                // 此处处理电池优化状态变更逻辑
                Log.d("BatteryOpt", "应用电池优化状态:${if (isAppOptimized) "已开启" else "已豁免"}")
            }
        }
    }
}

// 注册广播(建议在Activity/Fragment的onCreate中注册,onDestroy中注销)
context.registerReceiver(
    batteryOptReceiver,
    IntentFilter(Intent.ACTION_POWER_SAVE_MODE_CHANGED)
)

二、后台限制/待机桶状态变更

Android的应用待机桶(App Standby Bucket)直接关联后台限制程度,系统会在应用待机桶变化时发送ACTION_APP_STANDBY_CHANGED广播:

  1. 注册ACTION_APP_STANDBY_CHANGED广播接收器
  2. 在回调中判断变更的包名是否为当前应用,再获取最新的待机桶等级

示例代码(Kotlin):

val standbyReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (intent?.action == Intent.ACTION_APP_STANDBY_CHANGED) {
            val changedPackage = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME)
            if (changedPackage == context?.packageName) {
                val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
                val bucketLevel = activityManager.appStandbyBucket
                // 根据待机桶等级判断后台限制程度:
                // BUCKET_ACTIVE = 活跃(无限制)
                // BUCKET_WORKING_SET = 常用(轻度限制)
                // BUCKET_FREQUENT = 频繁(中度限制)
                // BUCKET_RARE = 罕见(严格限制)
                Log.d("StandbyBucket", "应用后台限制等级变更:$bucketLevel")
            }
        }
    }
}

// 注册广播
context.registerReceiver(
    standbyReceiver,
    IntentFilter(Intent.ACTION_APP_STANDBY_CHANGED)
)

三、通用补充方案

对于部分无直接广播的设置,可在以下时机主动检查状态:

  • 应用启动/从后台回到前台时
  • 接收ACTION_PACKAGE_CHANGED广播(应用自身信息变更时触发)

注意事项

  • 广播接收器需在合适的生命周期内注册/注销,避免内存泄漏
  • 部分状态检查无需特殊权限,但请求修改电池优化状态需添加REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限到Manifest

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:52:45