一般来说,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