【问题标题】:System.exit(0) in Android Wear Watchface?Android Wear 表盘中的 System.exit(0)?
【发布时间】:2016-07-10 10:23:55
【问题描述】:

我已经读到,在 Java 和 Android 中使用 System.exit(0) 是不受欢迎的,但到目前为止,我找不到任何替代方案来解决我想要完成的任务。 明确地说,这是一个 Watchface,它只是一个扩展 CanvasWatchFaceService 的服务。在这种情况下我不能打电话给finish()。我也试过stopServicestartService 没有成功。

我要解决的问题:众所周知,除非重新启动,否则更改设备上的时区不会反映在表盘上。在我的测试中,我发现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 表盘,发现它没有问题。我想知道答案是否在他提到的链接中。

标签: java android wear-os


【解决方案1】:

当正确的解决方案如此简单时,我不敢相信我完成了所有这些工作。感谢ianhanniballake 提供链接!

查看Analog Watchface Sample后,我发现我需要做的就是使用mCalendar.setTimeZone(TimeZone.getDefault());。在许多地方,我直接将获取的时间(以毫秒为单位)与long now = System.currentTimeMillis(); 进行比较,所以我只是做了一个now = mCalendar.getTimeInMillis() 来处理这个问题。

现在,当时区更改时,表盘会正确更改时间。我猜我下载的其他表盘没有正确处理这个问题!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多