Android 構(gòu)建表盤(pán)服務(wù)

2018-08-02 17:54 更新

編寫(xiě):heray1990 - 原文: http://developer.android.com/training/wearables/watch-faces/service.html

Android Wear 的表盤(pán)在可穿戴應(yīng)用中實(shí)現(xiàn)為服務(wù)(services)和包。當(dāng)用戶(hù)安裝一個(gè)包含表盤(pán)的可穿戴應(yīng)用的手持式應(yīng)用時(shí),這些表盤(pán)在手持式設(shè)備的 Android Wear 配套應(yīng)用和可穿戴表盤(pán)選擇器中可用。當(dāng)用戶(hù)選擇一個(gè)可用的表盤(pán)時(shí),可穿戴設(shè)備會(huì)顯示表盤(pán)并且按需要調(diào)用它的服務(wù)毀掉方法。

這節(jié)課介紹如何配置包含表盤(pán)的 Android 工程和如何實(shí)現(xiàn)表盤(pán)服務(wù)。

創(chuàng)建并配置工程

在 Android Studio 中為表盤(pán)創(chuàng)建一個(gè) Android 工程,需要:

  1. 打開(kāi) Android Studio。
  2. 創(chuàng)建一個(gè)新的工程:
    • 如果沒(méi)有打開(kāi)過(guò)任何工程,那么在 Welcome 界面中點(diǎn)擊 New Project。
    • 如果已經(jīng)打開(kāi)過(guò)工程,那么在 File 菜單中選擇 New Project。
  3. 填寫(xiě)應(yīng)用名字,然后點(diǎn)擊 Next。
  4. 選擇 Phone and Tablet 尺寸系數(shù)。
  5. 在 Minimum SDK 下拉菜單選擇 API 18。
  6. 選擇 Wear 尺寸系數(shù)。
  7. 在 Minimum SDK 下拉菜單選擇 API 21,然后點(diǎn)擊 Next
  8. 選擇 Add No Activity 然后在接下來(lái)的兩個(gè)界面點(diǎn)擊 Next 。
  9. 點(diǎn)擊 Finish。
  10. 在 IDE 窗口點(diǎn)擊 View > Tool Windows > Project。

至此,Android Studio 創(chuàng)建了一個(gè)含有 wear 和 mobile 模塊的工程。更多關(guān)于創(chuàng)建工程的內(nèi)容,請(qǐng)見(jiàn) Creating a Project。

依賴(lài)

Wearable Support 庫(kù)提供了必要的類(lèi),我們可以繼承這些類(lèi)來(lái)創(chuàng)建表盤(pán)的實(shí)現(xiàn)。需要用Google Play services client 庫(kù)(play-services 和 play-services-wearable)在配套設(shè)備和含有可穿戴數(shù)據(jù)層 API 的可穿戴應(yīng)用之間同步數(shù)據(jù)項(xiàng)。

當(dāng)我們按照上述的方法創(chuàng)建工程時(shí),Android Studio 會(huì)自動(dòng)添加需要的條目到 build.gradle 文件。

Wearable Support 庫(kù) API 參考資源

該參考文檔提供了用于實(shí)現(xiàn)表盤(pán)的詳細(xì)信息。詳見(jiàn) API 參考文檔。

在 Eclipse ADT 中下載 Wearable Support 庫(kù)

如果你使用 Eclipse ADT,那么請(qǐng)下載 Wearable Support 庫(kù) 并且將該庫(kù)作為依賴(lài)包含在你的工程當(dāng)中。

聲明權(quán)限

表盤(pán)需要 PROVIDE_BACKGROUND 和 WAKE_LOCK 權(quán)限。在可穿戴和手持式應(yīng)用的 manifest 文件中 manifest 節(jié)點(diǎn)下添加如下權(quán)限:

<manifest ...>
    <uses-permission
        android:name="com.google.android.permission.PROVIDE_BACKGROUND" />
    <uses-permission
        android:name="android.permission.WAKE_LOCK" />
    ...
</manifest>

Caution: 手持式應(yīng)用必須包括所有在可穿戴應(yīng)用中聲明的權(quán)限。

實(shí)現(xiàn)服務(wù)和回調(diào)方法

Android Wear 的表盤(pán)實(shí)現(xiàn)為服務(wù)(services)。當(dāng)表盤(pán)處于活動(dòng)狀態(tài)時(shí),系統(tǒng)會(huì)在時(shí)間改變或者出現(xiàn)重要的時(shí)間(如切換到環(huán)境模式或者接收到一個(gè)新的通知)的時(shí)候調(diào)用服務(wù)的方法。服務(wù)實(shí)現(xiàn)接著根據(jù)更新的時(shí)間和其它相關(guān)的數(shù)據(jù)將表盤(pán)繪制到屏幕上。

實(shí)現(xiàn)一個(gè)表盤(pán),我們需要繼承 CanvasWatchFaceService 和 CanvasWatchFaceService.Engine 類(lèi),然后重寫(xiě) CanvasWatchFaceService.Engine 類(lèi)的回調(diào)方法。這些類(lèi)都包含在 Wearable Support 庫(kù)里。

下面的代碼片段略述了我們需要實(shí)現(xiàn)的主要方法:

public class AnalogWatchFaceService extends CanvasWatchFaceService {

    @Override
    public Engine onCreateEngine() {
        /* provide your watch face implementation */
        return new Engine();
    }

    /* implement service callback methods */
    private class Engine extends CanvasWatchFaceService.Engine {

        @Override
        public void onCreate(SurfaceHolder holder) {
            super.onCreate(holder);
            /* initialize your watch face */
        }

        @Override
        public void onPropertiesChanged(Bundle properties) {
            super.onPropertiesChanged(properties);
            /* get device features (burn-in, low-bit ambient) */
        }

        @Override
        public void onTimeTick() {
            super.onTimeTick();
            /* the time changed */
        }

        @Override
        public void onAmbientModeChanged(boolean inAmbientMode) {
            super.onAmbientModeChanged(inAmbientMode);
            /* the wearable switched between modes */
        }

        @Override
        public void onDraw(Canvas canvas, Rect bounds) {
            /* draw your watch face */
        }

        @Override
        public void onVisibilityChanged(boolean visible) {
            super.onVisibilityChanged(visible);
            /* the watch face became visible or invisible */
        }
    }
}

Note: Android SDK 里的 WatchFace 示例示范了如何通過(guò)繼承 CanvasWatchFaceService 類(lèi)來(lái)實(shí)現(xiàn)模擬和數(shù)字表盤(pán)。這個(gè)示例位于 android-sdk/samples/android-21/wearable/WatchFace 目錄。

CanvasWatchFaceService 類(lèi)提供一個(gè)類(lèi)似 View.invalidate()) 方法的銷(xiāo)毀機(jī)制。當(dāng)我們想要系統(tǒng)重新繪制表盤(pán)時(shí),我們可以在實(shí)現(xiàn)中調(diào)用 invalidate() 方法。在主 UI 線程中,我們可以只用 invalidate() 方法。然后調(diào)用 postInvalidate() 方法從其它的的線程中銷(xiāo)毀畫(huà)布。

更多關(guān)于實(shí)現(xiàn) CanvasWatchFaceService.Engine 類(lèi)的方法,請(qǐng)見(jiàn)繪制表盤(pán)。

注冊(cè)表盤(pán)服務(wù)

實(shí)現(xiàn)完表盤(pán)服務(wù)之后,我們需要在可穿戴應(yīng)用的 manifest 文件中注冊(cè)該實(shí)現(xiàn)。當(dāng)用戶(hù)安裝此應(yīng)用時(shí),系統(tǒng)會(huì)使用關(guān)于服務(wù)的信息,使得可穿戴設(shè)備上 Android Wear 配套應(yīng)用和表盤(pán)選擇器里的表盤(pán)可用。

下面的代碼片段介紹了如何在 application 節(jié)點(diǎn)下注冊(cè)一個(gè)表盤(pán)實(shí)現(xiàn):

<service
    android:name=".AnalogWatchFaceService"
    android:label="@string/analog_name"
    android:allowEmbedded="true"
    android:taskAffinity=""
    android:permission="android.permission.BIND_WALLPAPER" >
    <meta-data
        android:name="android.service.wallpaper"
        android:resource="@xml/watch_face" />
    <meta-data
        android:name="com.google.android.wearable.watchface.preview"
        android:resource="@drawable/preview_analog" />
    <meta-data
        android:name="com.google.android.wearable.watchface.preview_circular"
        android:resource="@drawable/preview_analog_circular" />
    <intent-filter>
        <action android:name="android.service.wallpaper.WallpaperService" />
        <category
            android:name=
            "com.google.android.wearable.watchface.category.WATCH_FACE" />
    </intent-filter>
</service>

當(dāng)向用戶(hù)展示所有安裝在可穿戴設(shè)備的表盤(pán)時(shí),設(shè)備上的Android Wear 配套應(yīng)用和表盤(pán)選擇器使用 com.google.android.wearable.watchface.preview 元數(shù)據(jù)項(xiàng)定義的預(yù)覽圖。為了取得這個(gè) drawable,可以運(yùn)行 Android Wear 設(shè)備或者模擬器上的表盤(pán)并截圖。在 hdpi 屏幕的 Android Wear 設(shè)備上,預(yù)覽圖像一般是 320x320 像素。

圓形設(shè)備上看起來(lái)非常不同的表盤(pán)可以提供圓形和方形的預(yù)覽圖。使用 com.google.android.wearable.watchface.preview 元數(shù)據(jù)項(xiàng)指定一個(gè)圓形的預(yù)覽圖。如果一個(gè)表盤(pán)包含兩種預(yù)覽圖,可穿戴應(yīng)用上的配套應(yīng)用和表盤(pán)選擇器會(huì)根據(jù)手表的形狀選擇適合的預(yù)覽圖。如果沒(méi)有包含圓形的預(yù)覽圖,那么方形和圓形的設(shè)備都會(huì)用方形的預(yù)覽圖。對(duì)于圓形的設(shè)備,方形的預(yù)覽圖會(huì)被一個(gè)圓形剪裁掉。

android.service.wallpaper 元數(shù)據(jù)項(xiàng)指定包含 wallpaper 節(jié)點(diǎn)的 watch_face.xml 資源文件:

<?xml version="1.0" encoding="UTF-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android" />

我們的可穿戴應(yīng)用可以包含多個(gè)表盤(pán)。我們必須為每個(gè)表盤(pán)實(shí)現(xiàn)添加一個(gè)服務(wù)節(jié)點(diǎn)到可穿戴應(yīng)用的 manifest 文件中。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)