2017-11-25 7 views
0

Ich begann mit der Entwicklung meiner ersten Android Wear-Uhr und habe einige Probleme, das Konzept der Einstellungen zu verstehen.Persistente Einstellungen in Android Wear

Der Benutzer meiner Uhr sollte in der Lage sein, einige Einstellungen direkt auf der Uhr - z. verschiedene Farben.

Aber wie sollten diese Einstellungen auf der Uhr beibehalten werden? Alle Beispiele von Google verwenden Wearable.NodeApi.getLocalNode. Aber soweit ich das verstehen konnte, sollen damit Einstellungen zwischen verschiedenen (?) Uhren über das Internet synchronisiert werden. Zumindest nach der Anleitung auf https://developer.android.com/training/wearables/data-layer/index.html

Aber macht dieser Mechanismus auch die Einstellungen persistent, oder muss ich die Persistenz selbst implementieren (z. B. mit SharedPreferences).

Meine Ansicht zu diesem Thema ist, dass, wenn ich diese Einstellungen z. Über eine Benutzeroberfläche auf meinem Handy werden sie über die DataItems mit allen meinen Uhren synchronisiert - aber auf jeder Uhr muss ich diese Einstellungen speichern. Ist das richtig?

Antwort

1

Im Allgemeinen ist die DataApiwird bestehen Datenelemente lokal zwischen den Sitzungen - aber es ist weniger zuverlässig, und ein viele weniger bequem, als SharedPreferences verwenden. Wie Sie bereits angemerkt haben, ist es hauptsächlich zum Synchronisieren von Daten zwischen Geräten gedacht. das Speichern von Daten ist ein nachträglicher Einfall. Meiner Erfahrung nach sind Datenspeicherung und -synchronisierung so unterschiedlich, dass Sie beide separat implementieren müssen, indem Sie die für sie vorgesehenen APIs verwenden.

Allerdings ist es sinnlos, das Rad neu zu erfinden. Wenn Ihr Watchface auf beiden Geräten eine Konfiguration hat, die sowohl mit dem anderen Gerät synchronisiert als auch lokal gespeichert werden muss, kann ich vorschlagen, dass Sie sich PrefSyncService ansehen. Es ist eine Open-Source-Android-Klasse, die ich für genau diesen Anwendungsfall entwickelt habe.

Verwenden Sie eine OnSharedPreferenceChangeListener, um Konfigurationsänderungen vom Telefon auf Ihr laufendes Zifferblatt anzuwenden. Verwenden Sie in Ihrem Engine Code wie folgt:

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

Vielen Dank für Ihre Erklärung. Ich werde diese Bibliothek benutzen - sieht gut aus. – user1894572

+0

Tut mir leid, aber ich habe eine Follow-up-Frage: Ich verstehe, dass ich Einstellungen in SharedPreferences speichern und sie automatisch mit dem Telefon synchronisiert werden, z. Der PrefSyncService muss von einer Aktivität oder einem Dienst gestartet werden. Aber die Beobachtung wird von der CanvasWatchFaceService.Engine gezeichnet. Wie übertrage ich diese Änderungen korrekt an die Engine, damit ich diese Einstellungen übernehmen kann? Muss ich den DataApi für die Kommunikation vom PrefSyncService oder der ConfigActivity zur Engine verwenden? Oder sollte ich ein Ereignis in der Engine auslösen, damit die SharedPreferences erneut gelesen werden. Was ist der beste Weg, das zu tun? – user1894572

+0

Ich verwende einen 'OnSharedPreferenceChangeListener'. Ich füge es meiner Antwort und dem Dokument auf dem GitHub Repo hinzu. – String