2017-11-25 285 views
0

我开始开发我的第一款Android Wear表盘,并在理解设置的概念时遇到了一些问题。Android Wear中的持久设置

我的表盘的用户应该能够在手表上设置一些偏好 - 例如,不同的颜色。

但是这些设置应该如何保持在手表上?所有来自Google的样本都使用Wearable.NodeApi.getLocalNode。但据我所知,这是为了通过互联网同步不同(?)手表之间的设置。至少根据指南https://developer.android.com/training/wearables/data-layer/index.html

但是,这种机制也使设置持久,或我必须自己实现持久性(例如使用SharedPreferences)。

我对这个主题的看法是,如果我改变这些设置,例如通过手机上的用户界面,他们可以通过DataItems同步到我的所有手表 - 但每一只手表都需要存储这些设置。它是否正确?

回答

1

一般来说,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... 
    } 
} 
+0

谢谢您的解释。我将使用这个库 - 看起来很棒。 – user1894572

+0

对不起,但我有一个后续问题:我知道我将设置存储在SharedPreferences中,并且它们会自动同步到手机,例如PrefSyncService需要从Activity或Service中启动。但是watchafce是从CanvasWatchFaceService.Engine中抽取的。如何正确地将这些更改传播到引擎,以便我可以应用这些设置。我使用DataApi从PrefSyncService或ConfigActivity与Engine进行通信?或者,我应该在引擎中触发某个事件,以便再次读取SharedPreferences。什么是最好的方式来做到这一点? – user1894572

+0

我使用了'OnSharedPreferenceChangeListener'。我会将它添加到我的答案中,并添加到github回购的文档中。 – String