Android Wear Watchface中的System.exit(0)?

时间:2016-07-09 22:54:04

标签: java android wear-os

我已经读过在使用System.exit(0)时,对于Java和Android而言,这是不赞成的,但到目前为止,我无法找到我想要完成的任何选择。 要明确的是,这是一个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商店上,所以我想我应该确保我不会在这里玩火。

1 个答案:

答案 0 :(得分:0)

我无法相信当适当的解决方案如此简单时,我完成了所有这些工作。感谢ianhanniballake获取链接!

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

现在,当更改时区时,表面会正确地改变时间。我想我下载的其他表盘并没有妥善处理!