【发布时间】:2016-07-10 10:23:55
【问题描述】:
我已经读到,在 Java 和 Android 中使用 System.exit(0) 是不受欢迎的,但到目前为止,我找不到任何替代方案来解决我想要完成的任务。 明确地说,这是一个 Watchface,它只是一个扩展 CanvasWatchFaceService 的服务。在这种情况下我不能打电话给finish()。我也试过stopService 和startService 没有成功。
我要解决的问题:众所周知,除非重新启动,否则更改设备上的时区不会反映在表盘上。在我的测试中,我发现System.currentTimeMillis() 确实不会响应 Android Wear 中的时区变化。必须重新启动表盘才能在时区更改后显示正确的时间。
于是我用下面的代码搭建了一个系统:
private final BroadcastReceiver timeChangeReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (!restarting) {
if (action.equals(Intent.ACTION_TIMEZONE_CHANGED)) {
if (upSeconds >= 15) {
System.exit(0);
} else {
restarting = true;
int delay = ((15 - upSeconds) * 1000);
new CountDownTimer(delay, delay) {
@Override
public void onTick(long millisUntilFinished) { }
@Override
public void onFinish() {
System.exit(0);
}
}.start();
}
}
}
}
};
延迟是在用户触发时区更改的频率超过 15 秒的情况下。 Android Wear 似乎会检测到过于频繁的系统退出,并将表盘替换为“简单”表盘。
看起来效果很好,Android Wear 会在退出时自动启动表盘。但我最终想把这个应用放到 Google Play 商店,所以我想我应该确保我不是在这里玩火。
【问题讨论】:
-
感谢您的链接!这有帮助,但它并不能完全回答我的问题。我的问题是关于 Android Wear 中的
CanvasWatchFaceService。 -
watchface training 上的所有代码都可以很好地处理时区更改。为什么你认为你必须退出才能有时间更新?
-
“众所周知,除非重新启动,否则更改设备上的时区不会反映在表盘上”——请引用。
-
这就是我发表该声明的依据:code.google.com/p/android/issues/detail?id=77074。我也下载了所有自定义表盘,这也是我的经验。但是,在看到 ian 的评论后,我尝试了其中一种标准的 Google 表盘,发现它没有问题。我想知道答案是否在他提到的链接中。