Wear OS 5环境模式/屏幕关闭检测:原DisplayListener失效求助
问题
我有一个ComplicationDataSourceService,需要在手表进入环境模式或屏幕关闭时收到通知。该服务用于实现一款「手电筒」complication:点击开启时渲染纯白画面,关闭时不渲染任何内容。若手电筒开启时手表进入环境模式或屏幕关闭,我希望手电筒自动关闭,且唤醒后保持关闭状态。
在Wear OS 5之前,我通过DisplayListener.onDisplayChanged实现该功能,但Wear OS 5中无论targetSdkVersion设为33还是34,该方法都不再被调用。请问是否有其他方式获取环境模式/屏幕关闭的回调,或如何重新实现DisplayListener.onDisplayChanged?
附原实现代码:
displayListener = object : DisplayManager.DisplayListener { override fun onDisplayChanged(displayId: Int) { val isStateAmbient = displayManager.getDisplay(displayId).state != Display.STATE_ON // ... } }.also { displayManager.registerDisplayListener(it, Handler(Looper.getMainLooper())) }
解决方案
在Wear OS 5中,DisplayListener的回调逻辑确实有调整,你可以改用以下两种方式实现需求:
1. 使用AmbientModeSupport监听环境模式变化
官方推荐用AmbientModeSupport监听Wear OS的环境模式状态,它能精准捕获环境模式的进入/退出、屏幕开关状态:
// 在ComplicationDataSourceService中初始化监听 val ambientCallback = object : AmbientModeSupport.AmbientCallback() { override fun onEnterAmbient(ambientDetails: Bundle?) { // 进入环境模式,关闭手电筒 turnOffFlashlight() } override fun onExitAmbient() { // 退出环境模式,保持关闭状态(无需额外操作) } override fun onUpdateAmbient() { // 环境模式下的更新回调,此处无需处理 } } // 注册回调 AmbientModeSupport.attach(this, ambientCallback)
注意:确保build.gradle中已引入com.google.android.gms:play-services-wearable依赖。
2. 使用PowerManager监听屏幕状态
如果需要更直接的屏幕关闭/唤醒通知,可以用PowerManager的PowerStateListener:
val powerManager = getSystemService(POWER_SERVICE) as PowerManager val powerStateListener = PowerManager.PowerStateListener { powerState -> val isScreenOff = !powerState.isInteractive if (isScreenOff) { // 屏幕关闭,关闭手电筒 turnOffFlashlight() } } // 注册监听 powerManager.addPowerStateListener(powerStateListener) // 服务销毁时移除监听,避免内存泄漏 override fun onDestroy() { super.onDestroy() powerManager.removePowerStateListener(powerStateListener) }
这种方式能直接获取屏幕交互状态,屏幕从亮转暗(包括进入环境模式或完全关闭)时都会触发回调。
额外注意事项
- 屏幕状态监听无需额外权限,若涉及唤醒锁操作需申请
WAKE_LOCK权限。 - 服务销毁时务必移除所有监听,防止内存泄漏。
内容的提问来源于stack exchange,提问作者rjr-apps
相关产品推荐
相关产品推荐

