© Excellent backgrounds/Shutterstock.com
Android-Wear-Micro-Apps

Android am Arm


Mehr Zeit in der echten Welt und weniger Zeit in unseren Smartphones – dies ist eines der Versprechen, mit denen Android Wear angetreten ist. Wie dies mit Micro-Apps möglich wird, zeigt dieser Artikel.

Video: Catch me if you can – Java on Wearables

In diesem Artikel gehen wir auf das „Smart“ in Smartwatch ein und beschäftigen uns damit, wie man so genannte Micro-Apps entwickeln kann, die auf Android-Wear-Smartwatches laufen können.

Zwar ist es technisch möglich, Apps zu entwickeln, die ausschließlich auf der Uhr laufen, und im Play Store ist eine Fülle von Standalone-Apps verfügbar, die die unterschiedlichsten Anwendungsfälle abdecken. Allerdings lassen sich viel mächtigere Apps bauen, wenn man die Fähigkeiten des mit der Uhr verbundenen Handhelds (in den meisten Fällen ein Android Phone) mit einbezieht. Neben dem Zugriff auf die zusätzlichen Sensoren, die Internetverbindung und die auf dem Smartphone enthaltenen Daten lässt sich so ein Teil der Datenverarbeitung von der Smartwatch auf das Smartphone auslagern, um Energie zu sparen bzw. von der höheren Rechenleistung zu profitieren. Aus Gründen der Energieeffizienz ist es derzeit z. B. nicht möglich, vom Wearable direkt auf das Internet zuzugreifen – stattdessen muss das Smartphone sozusagen als Relay verwendet werden. Wie das funktioniert, schauen wir uns im Verlauf dieses Artikels an.

Um den Artikel ein wenig anschaulicher zu gestalten, wird dem Artikel eine App als Grundlage dienen, die es Kaffeeliebhabern ermöglicht, ihrer Leidenschaft auf verantwortungsvolle Weise zu frönen. Von den vielen erdenklichen Use Cases werden wir in diesem Artikel folgende implementieren:

  • Aufzeichnen des täglichen Kaffeekonsums: Hierzu ruft der Anwender die App auf dem Wearable auf, um dann aus einer Liste koffeinhaltiger Getränke dasjenige auszuwählen, das er oder sie zu trinken gedenkt. Das Koffein-Log wird so persistiert, dass es später auf dem Handheld oder auf einem Watchface (z. B. in Form eines Fortschrittbalkens) angezeigt werden kann.

  • Auffinden eines Cafés in der Nähe: In der Endausbaustufe sollte die mobile App die in der Umgebung befindlichen Cafés über ein im Hintergrund laufendes Location-Update ermitteln und dann als Notification auf dem Wearable anzeigen. Für diesen Artikel werden wir diesen Use Case ein wenig vereinfachen und manuell über das UI auslösen.

Anhand dieser Use Cases werden wir die folgenden technischen Aspekte von Android Wear betrachten:

  • Implementierung von Wearable-UIs: Neben einfachen und komplexeren Listen sowie Hilfsanzeigen wie z. B. Bestätigungsanzeigen werden wir uns damit beschäftigen, wie man Layouts für runde und eckige Displays gestalten kann.

  • Datenübertragung zwischen dem Wearable und dem Handset: Hier werden wir vor allem mit dem Data API arbeiten, aber auch darauf eingehen, wie Notifications eingesetzt werden können, um Daten zwischen den Nodes des Android-Wear-Netzwerks zu übertragen.

Implementierung einer Wearable-App

Android-Wear-Apps sind aus architektonischer Sicht ganz normale Android-Apps, die aus den üblichen An­droid-Komponenten wie Activities, Services, BroadcastReceivers, Intents etc. bestehen. Die Distribution von Wearable-Apps erfolgt als Micro-APK. Hierbei handelt es sich um ein ganz normales APK, das während des Build-Prozesses von Gradle in das APK der zugehörigen mobilen Companion-App eingebettet wird. Die Installation des Wearable-APKs erfolgt automatisch, sobald ein Android-Wear-Gerät mit dem entsprechenden Handset verbunden ist. Steht ein Update für die mobile App im Play Store zur Verfügung, wird auch das Wearable-APK automatisch aktualisiert. Wenn der Benutzer die mobile App von seinem Smartphone deinstalliert, wird die zugehörige Wearable-App ebenfalls von der verbundenen Smartwatch entfernt. Packaging und Signing des Micro-APKs sowie des Mobile-APKs werden automatisch von Gradle übernommen. An­droid Studio stellt im New Project Wizard ein Template zur Verfügung, welches die entsprechende Projektstruktur definiert und passende Build-Skripte enthält.

Während der Entwicklungszeit ist es erforderlich, die App für die Smartwatch sowie die App für das Smartphone individuell aus Android Studio heraus zu deployen. Basierend auf der Projektstruktur stehen dazu entsprechende Targets zur Verfügung. Um eine Android-Wear-App zu entwickeln, muss man entweder ein neues Projekt anlegen oder ein Wear­able-Modul zu einem existierenden Projekt hinzufügen. Für diesen Artikel legen wir ein neues Projekt mit einem Modul für die mobile App sowie einem zweiten Modul für die Wearable-App an.

Das Eckige muss ins Runde

Anders als andere Plattformen unterstützt Android Wear sowohl eckige als auch runde Displays, was beim Layout des UI beachtet werden muss. Die Plattform stellt prinzipiell zwei Möglichkeiten zur Verfügung, um für beide Formfaktoren zu layouten:

  • Verwendung der Klasse WatchViewStub, um je nach Displaygeometrie das passende Layout zu laden. Dies ist der Ansatz, den der Wizard beim Anlegen eines neuen Projekts wählt. Offensichtlicher Vorteil: Man kann das Layout an die Bauform der Uhr anpassen, was z. B. von einigen Fitness-Apps dazu genutzt wird, um auf runden Uhren runde Fortschrittsanzeigen zu verwenden. In Listing 1 ist zu sehen, dass mittels der Attribute rectLayout und roundLayout die jeweiligen Layouts geladen werden.

  • Verwendung der Klasse BoxInsetLayout. Es handelt sich hierbei um eine Subklasse von FrameLayout, die sich automatisch an die Displaygeometrie anpasst. Auf eckigen Displays wird die komplette Fläche genutzt. Auf runden Displays zentriert ein BoxInsetLayout seine eckige Displayfläche so, dass die Diagonale des Frames dem Durchmesser des Displays entspricht.

Listing 1

<?xml version="1.0" encoding="utf-8"?> <android.support.wearable.view.WatchViewStub xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/watch_view_stub" android:layout_width="match_parent" android:layout_height="match_parent" app:rectLayout="@layout/rect_activity_drink_selection" app:roundLayout="@layout/round_activity_drink_selection" tools:context=".DrinkSelectionActivity" tools:deviceIds="wear"> </android.support.wearable.view.WatchViewStub>

Beide Layouts unterstützen die Verwendung einer Hintergrundgrafik, die auch auf runden Displays die komplette zur Verfügung stehende Fläche ausnutzt.

Da wir kein spezielles Layout für runde Displays verwenden wollen, ist für unsere Zwecke das BoxInsetLayout ausreichend, weswegen wir die beiden Layoutdateien rect_­activity_drink_selection.xml und round_­activity_drink_selection.xml löschen können.

Zur Darstellung der koffeinhaltigen Getränke können wir eine Liste verwenden. Android Wear stellt mit der Klasse WearableListView eine an die Spezifika der vergleichsweise kleinen Bildschirme von Wearables angepasste Listenimplementierung zur Verfügung. Die gleiche Implementierung wird auch in der Settings-App auf Android-Wear-Geräten eingesetzt und dürfte daher den meisten bekannt sein – siehe Abbildung 1.

friese_microapps_1.tif_fmt1.jpgAbb. 1: Screenshot der Android-Wear-Settings-App

Die vom Projekt-Wizard angelegte Layoutdefinition in activity_drink_selection.xml können wir also durch ein BoxInsetLayout ersetzen, das wiederum ein FrameLayout und eine WearableListView enthält (Listing 2).

Listing 2

<?xml version="1.0" encoding="utf-8"?> <android.support.wearable.view.BoxInsetLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:background="@drawable/coffee_beans_background" android:layout_height="match_parent" android:layout_width="match_parent" android:padding="15dp"> <FrameLayout android:id="@+id/frame_layout" android:layout_height="match_parent" android:layout_width="match_parent" app:layout_box="left|bottom|right"> <android.support.wearable.view.WearableListView android:id="@+id/wearable_list" android:layout_height="match_parent" android:layout_width="match_parent"> </android.support.wearable.view.WearableListView> </FrameLayout> </android.support.wearable.view.BoxInsetLayout>

Die einzelnen Einträge in der Liste bestehen aus einem Icon, welches das Getränk repräsentiert, sowie einem Label mit dem Namen des Getränks. Genau wie in den Android Wear Settings soll das Icon und der es umgebende Kreis für den aktuell ausgewählten Eintrag optisch hervorgehoben werden, indem sie vergrößert dargestellt werden, wenn sie sich in der Mitte des Bildschirms befinden. Hierfür müssen wir zunächst das Layout für die Listeneinträge definieren. Für die Darstellung eines Icons innerhalb eines Kreises stellt die An­droid Wear Support Library die Klasse CirledImageView zur Verfügung. Mittels der Attribute circle_radius und circle_radius_pressed kann der Radius des Kreises im Normalzustand und beim Antippen festgelegt werden (Listing 3).

Listing 3

<?xml version="1.0" encoding="utf-8"?> <de.peterfriese.kaffeinated.WearableListItemLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:gravity="center_vertical" android:layout_width="match_parent" android:layout_height="80dp"> <android.support.wearable.view.CircledImageView android:id="@+id/image" android:alpha="0.5" android:layout_height="42dp" android:layout_width="42dp" android:layout_marginStart="6dp" app:circle_border_color="#FFFFFFFF" app:circle_border_width="2dp" app:circle_radius="20dp" app:circle_radius_pressed="18dp" /> <TextView android:id="@+id/name" android:gravity="center_vertical|start" android:layout_width="wrap_content" android:layout_marginEnd="6dp" android:layout_height="match_parent" android:fontFamily="sans-serif-condensed-light" android:lineSpacingExtra="-4sp" android:textColor="@color/text_color" android:textSize="16sp"/> </de.peterfriese.kaffeinated.WearableListItemLayout>

Die von der vertikalen Position der Listeneinträge abhängige Animation des Icons und des Labels erf...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang