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

解决Kotlin「Property getter or setter expected」报错及Android唤醒锁初始化问题

解决Android中私有WakeLock字段初始化的问题

我来帮你搞定这两个棘手的问题,先理清楚出错的原因,再给你靠谱的解决方案:

问题根源拆解

  1. 「System services not available to Activities before onCreate()」:
    Activity的系统服务(比如PowerManager)只有在onCreate()回调之后,才完成了和系统的绑定,能正常调用。你直接在类的属性声明阶段就调用getSystemService(),这时候Activity还没初始化好,自然拿不到系统服务。

  2. 「Property getter or setter expected」:
    这个语法错误是因为你把初始化逻辑直接写在属性声明里,换行后Kotlin编译器没法正确解析表达式结构。把初始化逻辑移到合适的时机就能解决。

两种可行解决方案

方案1:用lateinit var在onCreate()中手动初始化

适合需要在多个方法里使用,且想主动控制初始化时机的场景:

class MainActivity : AppCompatActivity() {
    // 声明私有延迟初始化变量
    private lateinit var screenWakeLocker: PowerManager.WakeLock

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        // 到onCreate阶段,系统服务已经可用了
        val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
        // 建议给WakeLock设置有意义的Tag,方便后续日志排查问题
        screenWakeLocker = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "MainActivity::ScreenWakeLock")
    }

    // 示例:在需要的地方唤醒屏幕
    private fun keepScreenActive() {
        if (::screenWakeLocker.isInitialized) {
            screenWakeLocker.acquire()
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        // 一定要记得释放WakeLock,不然会一直耗电!
        if (::screenWakeLocker.isInitialized) {
            screenWakeLocker.release()
        }
    }
}

方案2:用by lazy实现自动延迟初始化(只读属性)

适合只读属性,希望第一次访问时自动完成初始化的场景:

class MainActivity : AppCompatActivity() {
    // 私有只读属性,第一次调用时自动初始化
    private val screenWakeLocker: PowerManager.WakeLock by lazy {
        val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
        powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "MainActivity::ScreenWakeLock")
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        // 第一次调用screenWakeLocker时,触发初始化逻辑
        screenWakeLocker.acquire()
    }

    override fun onDestroy() {
        super.onDestroy()
        // 释放锁避免耗电
        screenWakeLocker.release()
    }
}

关键注意事项

  • 必须在AndroidManifest.xml中添加权限:
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    
  • FULL_WAKE_LOCK在API 17已经被废弃,建议根据需求改用PowerManager.SCREEN_BRIGHT_WAKE_LOCK或其他更轻量的锁类型。
  • 无论用哪种方案,都要在Activity销毁时释放WakeLock,否则会导致设备持续唤醒,增加耗电量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:47:54