在显示器打开之前更新Android Wear watchface

在显示器打开之前更新Android Wear watchface,android,wear-os,Android,Wear Os,我已经做了一个手表,它可以很好地工作,可以加载到我的手机上,选择并在我的MOTO 360上运行,但我遇到的问题是,当屏幕关闭,我触摸屏幕时,它会打开,但指针(位图)会在正确的时间旋转。看起来当屏幕关闭时,它不再更新。我正在使用一个计时器例程,如果isVisible()和!isInAmbientMode从30毫秒开始交互,并触发invalidate() 注意:我尝试在所有这些例程中添加invalidate(),但没有帮助 以下是相关代码: // handler to update the

我已经做了一个手表,它可以很好地工作,可以加载到我的手机上,选择并在我的MOTO 360上运行,但我遇到的问题是,当屏幕关闭,我触摸屏幕时,它会打开,但指针(位图)会在正确的时间旋转。看起来当屏幕关闭时,它不再更新。我正在使用一个计时器例程,如果isVisible()和!isInAmbientMode从30毫秒开始交互,并触发invalidate()

注意:我尝试在所有这些例程中添加invalidate(),但没有帮助

以下是相关代码:

    // handler to update the time once a second in interactive mode
    final Handler mUpdateTimeHandler = new Handler() {
        @Override
        public void handleMessage(Message message) {
            switch (message.what) {
                case MSG_UPDATE_TIME:

                    invalidate();

                    long timeMs = System.currentTimeMillis();

                    if (shouldTimerBeRunning()) {
                        long delayMs = INTERACTIVE_UPDATE_RATE_MS
                                - (timeMs % INTERACTIVE_UPDATE_RATE_MS);
                        mUpdateTimeHandler
                                .sendEmptyMessageDelayed(MSG_UPDATE_TIME, delayMs);
                    } else {

                        long delayMs = NON_INTERACTIVE_UPDATE_RATE_MS
                                - (timeMs % NON_INTERACTIVE_UPDATE_RATE_MS);
                        mUpdateTimeHandler
                                .sendEmptyMessageDelayed(MSG_UPDATE_TIME, delayMs);
                    }
                    break;
            }
        }
    };

    @Override
    public void onAmbientModeChanged(boolean inAmbientMode) {
        super.onAmbientModeChanged(inAmbientMode);

        if (bLowBitAmbient) {
            boolean antiAlias = !inAmbientMode;
            mHrPaint.setAntiAlias(antiAlias);
            mMinPaint.setAntiAlias(antiAlias);
            mSecPaint.setAntiAlias(antiAlias);
            mCapPaint.setAntiAlias(antiAlias);
            mTextPaint.setAntiAlias(antiAlias);
            mTickPaint.setAntiAlias(antiAlias);
        }

        updateTimer();
    }

    // Request to update Timer (only if visible and interactive)
    private void updateTimer() {
        mUpdateTimeHandler.removeMessages(MSG_UPDATE_TIME);
        if (shouldTimerBeRunning()) {
            mUpdateTimeHandler.sendEmptyMessage(MSG_UPDATE_TIME);
        }
    }

    // Timer only runs when visible and interactive.
    private boolean shouldTimerBeRunning() {
        return isVisible() && !isInAmbientMode();
    }

当环境模式处于活动状态时,系统会尽可能多地保存电池,并使设备进入深度睡眠,在此期间,处理程序不会运行。在大多数情况下,对于手表表面,当它处于深度睡眠状态时,您不需要每分钟更新手表表面一次以上,因此您可以使用在该状态下每分钟收到一次通知(或者当时区更改或日期更改等),有关详细信息,请参阅文档。不建议使用更频繁的报警,但可以使用AlarmManager实现。

我已经找到了解决方法,因此我不必使用报警。我覆盖onVisiblityChanged并放置一个布尔标志。在onDraw,我只是把画布漆成黑色。这样,当设备唤醒时,它是黑色的,直到下一轮onDraw时屏幕已经激活。看起来效果不错

    @Override
    public void onVisibilityChanged(boolean visible) {
        super.onVisibilityChanged(visible);

        // the watch face became visible or invisible
        bDisplayBitmap = visible;

        ...

        invalidate();
    }


    @Override
    public void onDraw(Canvas canvas, Rect bounds) {

        // Draw watch face

        ...

        if(bDisplayBitmap) {

            canvas.drawBitmap(mBackgroundBitmap, 0, 0, null);

        } else {

            canvas.drawPaint(mBackgroundPaint);
        }

        ...
    }

我主要关心的是,我不在乎它睡得有多深,只要在触摸后屏幕醒来之前,我可以更新UI。onDraw()似乎在屏幕打开后运行。如果您只显示分钟和小时(即没有秒,您不应该这样),那么当它醒来时,它显示的是正确的时间(因为在睡眠中,它仍然可以更新以保持分钟和小时的更新),那么我不确定当您唤醒它时,这会导致任何问题。