解决Kotlin「Property getter or setter expected」报错及Android唤醒锁初始化问题
解决Android中私有WakeLock字段初始化的问题
我来帮你搞定这两个棘手的问题,先理清楚出错的原因,再给你靠谱的解决方案:
问题根源拆解
「System services not available to Activities before onCreate()」:
Activity的系统服务(比如PowerManager)只有在onCreate()回调之后,才完成了和系统的绑定,能正常调用。你直接在类的属性声明阶段就调用getSystemService(),这时候Activity还没初始化好,自然拿不到系统服务。「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
相关产品推荐
相关产品推荐

