Android Wear中的持久设置
问题描述:
我开始开发我的第一款Android Wear表盘,并在理解设置的概念时遇到了一些问题。Android Wear中的持久设置
我的表盘的用户应该能够在手表上设置一些偏好 - 例如,不同的颜色。
但是这些设置应该如何保持在手表上?所有来自Google的样本都使用Wearable.NodeApi.getLocalNode。但据我所知,这是为了通过互联网同步不同(?)手表之间的设置。至少根据指南https://developer.android.com/training/wearables/data-layer/index.html
但是,这种机制也使设置持久,或我必须自己实现持久性(例如使用SharedPreferences)。
我对这个主题的看法是,如果我改变这些设置,例如通过手机上的用户界面,他们可以通过DataItems同步到我的所有手表 - 但每一只手表都需要存储这些设置。它是否正确?
答
一般来说,DataApi
将坚持数据项本地会话之间 - 但它不太可靠,并且很多不太方便,比使用SharedPreferences
。正如您所指出的,它主要用于同步设备间的数据;存储数据是事后考虑的事情。根据我的经验,数据存储和同步是不同的,因此您需要分别使用各自的API来实现这两者。
但是,没有意义重新发明轮子。如果您的手表在两台设备上都需要配置,需要同步到其他设备并在本地存储,请建议您查看PrefSyncService。这是我为这种用例设计的开源Android类。
要将配置更改从手机应用到正在运行的表盘,请使用OnSharedPreferenceChangeListener
。在您的Engine
中,使用如下代码:
private class Engine
extends CanvasWatchFaceService.Engine
implements SharedPreferences.OnSharedPreferenceChangeListener {
private SharedPreferences settings;
@Override
public void onCreate(SurfaceHolder surfaceHolder) {
super.onCreate(surfaceHolder);
settings = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
settings.registerOnSharedPreferenceChangeListener(this);
...other setup code...
}
@Override
public void onDestroy() {
settings.unregisterOnSharedPreferenceChangeListener(this);
...other teardown code...
super.onDestroy();
}
@Override
public void onSharedPreferenceChanged(SharedPreferences settings, String key) {
...update your watch face here...
}
}
谢谢您的解释。我将使用这个库 - 看起来很棒。 – user1894572
对不起,但我有一个后续问题:我知道我将设置存储在SharedPreferences中,并且它们会自动同步到手机,例如PrefSyncService需要从Activity或Service中启动。但是watchafce是从CanvasWatchFaceService.Engine中抽取的。如何正确地将这些更改传播到引擎,以便我可以应用这些设置。我使用DataApi从PrefSyncService或ConfigActivity与Engine进行通信?或者,我应该在引擎中触发某个事件,以便再次读取SharedPreferences。什么是最好的方式来做到这一点? – user1894572
我使用了'OnSharedPreferenceChangeListener'。我会将它添加到我的答案中,并添加到github回购的文档中。 – String