我已经读过在使用System.exit(0)
时,对于Java和Android而言,这是不赞成的,但到目前为止,我无法找到我想要完成的任何选择。 要明确的是,这是一个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商店上,所以我想我应该确保我不会在这里玩火。
答案 0 :(得分:0)
我无法相信当适当的解决方案如此简单时,我完成了所有这些工作。感谢ianhanniballake获取链接!
在查看Analog Watchface Sample后,我发现我需要做的就是使用mCalendar.setTimeZone(TimeZone.getDefault());
。在很多地方,我直接比较了用long now = System.currentTimeMillis();
提取的毫秒时间,所以我只是做了now = mCalendar.getTimeInMillis()
来处理这个问题。
现在,当更改时区时,表面会正确地改变时间。我想我下载的其他表盘并没有妥善处理!