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

Android Wear onEnterAmbient()未在部分设备触发的原因排查

Wear OS环境模式onEnterAmbient()触发异常排查

Android官方文档指出:

当Activity切换到环境模式时,系统会调用环境回调的onEnterAmbient()方法

但实际开发中发现该情况并非在所有设备上都成立。

以下代码在Android Studio模拟器和Fossil Gen 6手表(Wear OS 3)上运行完全正常:

class MainActivity : FragmentActivity(), AmbientCallbackProvider {

    private lateinit var binding: ActivityMainBinding
    private lateinit var ambientController: AmbientModeSupport.AmbientController 
    private var systemOneSecondTick: Timer = Timer()
    private var bottomKeyCode = KeyEvent.KEYCODE_STEM_1

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        ambientController = AmbientModeSupport.attach(this)

        // Samsung assigns different button codes
        if (Build.MODEL == "SM-R870") {
            bottomKeyCode = KeyEvent.KEYCODE_BACK
        }

        systemOneSecondTick.scheduleAtFixedRate(timerTask {
            runOnUiThread {
                binding.middleLineTextView.text = SimpleDateFormat("HH:mm:ss", Locale.UK).format(System.currentTimeMillis())
            }
                                                          }, 0, 1000)

    }

    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        return if (keyCode == bottomKeyCode) {
            true // indicates key press has been handled
        } else {
            super.onKeyDown(keyCode, event)
        }
    }

    override fun getAmbientCallback() = object : AmbientModeSupport.AmbientCallback() {
        override fun onEnterAmbient(ambientDetails: Bundle?) {
            // This is not called on all devices
            super.onEnterAmbient(ambientDetails)
            binding.middleLineTextView.setTextColor(Color.rgb(150,150,150))
            Log.d(TAG, "onEnterAmbient()")
        }

        override fun onExitAmbient() {
            // This is called !!!!
            super.onExitAmbient()
            binding.middleLineTextView.setTextColor(Color.rgb(255,255,255))
            Log.d(TAG, "onExitAmbient()")
        }
    }

    companion object {
        const val TAG = "WearAmbientMode"
    }
}

该示例仅尝试调暗显示时间的颜色(为简化未减慢时钟更新频率)。在模拟器和Fossil手表上,遮挡表盘会触发onEnterAmbient(),显示调暗的时间;按下底部按键会触发onExitAmbient(),恢复全屏亮度。

但在**Samsung Galaxy Watch 4(Wear OS 3)或TicWatch Pro 3(Wear OS 2)**上运行时,遮挡表盘会导致屏幕关闭,日志显示onEnterAmbient()未被调用;按下底部按键时onExitAmbient()会被调用(Galaxy Watch上该情况并非始终出现,可能为另一问题)。

已尝试修改Galaxy Watch 4的常亮显示设置,但onEnterAmbient()仍未触发。

恳请各位帮忙分析为何代码在模拟器和Fossil手表上正常工作,却在Galaxy Watch 4上出现该问题?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:20:25