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 分钟,但没关系)
适合我。
最近我尝试在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 分钟,但没关系)
适合我。