最近我尝试在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也会正确触发但仍然不知道为什么会发生和解决。
答案 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分钟,但不重要)
适合我。