onAmbientModeChanged 在环境表盘 android 磨损时不调用

onAmbientModeChanged is not calling when in ambient watchface android wear

最近我尝试在androidwatchface上实现环境模式,在实现一些代码后,我发现在进入环境模式(模拟器)时不会调用onAmbientModeChanged,而是转到正常模式它会调用两次,第一次触发inAmbientMode为true,第二次触发inAmbientMode为false

private class Engine extends CanvasWatchFaceService.Engine {
    ...
    ...
     @Override
     public void onAmbientModeChanged(boolean inAmbientMode) {
        Log.e(TAG, "isInAmbientMode():" + inAmbientMode);
        super.onAmbientModeChanged(inAmbientMode);
        if (mLowBitAmbient) {
            boolean antiAlias = !inAmbientMode;
            setPaintAntiAlias(antiAlias);
        }

        invalidate();
        updateTimer();
    }

    @override
    public void onDraw(Canvas canvas, , Rect bounds){
      ...
      for(int i=0;i<node.length;i++){
        //drawing canvas
      }
    }
}

AndroidManifest.xml

<uses-permission android:name="com.google.android.permission.PROVIDE_BACKGROUND" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET"/>

开环境不触发会是什么问题?这是一个错误还是我需要添加一些权限或 class 来触发它?任何帮助将不胜感激。

编辑: ambient时,watchface不会重绘,直到回到normal模式,然后watchface会绘制ambient watchface,然后只绘制普通watchface

经过测试和调试后,我发现for循环是没有触发onAmbientModeChanged的主要原因,注释掉for循环后,当环境变化时,onAmbientModeChanged也会正确触发但仍然不知道为什么会这样,解决办法。

我遇到了类似的问题,我的表盘在 Marshmallow 更新后随机不会转为环境模式,直到 onTick() OS 唤醒表盘几毫秒,它才会更新时间。我猜这个问题与更积极的可穿戴设备睡眠政策有关,使用打盹模式。

我查看了由 Android Studio 反编译的 WatchFaceService 代码,它捆绑了 Jetbrains java 字节码反编译器,我看到 onTick() 方法持有一个非100ms 的引用计数唤醒锁。我尝试在 onAmbientModeChanged() 回调中做同样的事情,但我从未在环境模式下看到我的 Watch Face 具有交互风格。

以下是代码片段:

onCreate()中:

final PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE);
mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
mWakeLock.setReferenceCounted(false);

onAmbientModeChanged(…)中:

mWakeLock.acquire(100L);

您可以尝试微调唤醒锁获取时间值,例如将其设置为 10 毫秒,并使其在每次点击 Watch Face 时增加 10 毫秒。

我个人将此值更改为更合适的值,因为我的 Watch Face 动画环境模式切换。

顺便说一句,请检查 for 循环中的代码是否按照您告诉的那样重复了很多次,执行起来不会太长,因为移动设备上的性能至关重要。我个人在我的 Watch Face 中有一个 for 循环来绘制刻度,但我先制作一次并将其缓存在 Bitmap 中,让它变得更流畅,现在,我将使用 Canvas#drawLines(…) 来代替.

在我的带 USB 连接的 Polar M600 上,我没有收到 onAmbientModeChanged() 调用,isInAmbientMode() 也不起作用。

在没有 USB 连接的情况下,onAmbientModeChanged() 和 isInAmbientMode() 工作不可靠(通常不是这样)。

我的技巧是使用:

onTapCommand() 用于设置 mAmbient = true (我自己调用 onAmbientModeChanged(true)) (第一次点击会消耗唤醒时钟,但如果我需要更多信息,我会再次点击)

onTimerTick() 用于设置 mAmbient = false (我自己调用 nAmbientModeChanged(false)) (最多延迟 1 分钟,但没关系)

适合我。