onAmbientModeChanged在环境值表面安装时没有调用

时间:2016-04-18 11:20:20

标签: android wear-os ambient watchface

最近我尝试在android Wear watchface中实现环境模式,在实现一些编码后,我发现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"/>

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

编辑:环境时,表盘不会重绘,直到它恢复正常模式,然后表盘将绘制环境表盘,然后只绘制正常的表盘

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

2 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,我的Watch面孔在Marshmallow更新后会随机变为Ambient模式,直到onTick()操作系统唤醒Watch Face几毫秒,以便更新时间。我想这个问题与可穿戴设备上更具侵略性的睡眠策略有关,使用Doze模式。

我看了WatchFaceService代码,由Android Studio及其捆绑的Jetbrains java字节码反编译器反编译,我看到onTick()方法为{{100ms方法保存了一个非引用计数wakelock 1}}。我尝试在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毫秒来微调,并使其每次增加10毫秒以点击观察面。

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

顺便说一句,检查for循环中的代码是否重复了多次,因为移动设备上的性能至关重要。我个人在我的Watch Face中有一个for循环来绘制刻度,但是我首先制作一次并将其缓存在Bitmap中,使其变得更平滑,现在,我将使用{{1}而不是。

答案 1 :(得分:0)

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

没有USB连接onAmbientModeChanged()和isInAmbientMode()不能可靠地工作(通常不是这样)。

我的黑客是使用:

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

onTimerTick()用于设置mAmbient = false (我自己打电话给nAmbientModeChanged(假)) (延迟最多1分钟,但不重要)

适合我。