W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
編寫(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ù)。
在 Android Studio 中為表盤(pán)創(chuàng)建一個(gè) Android 工程,需要:
至此,Android Studio 創(chuàng)建了一個(gè)含有 wear
和 mobile
模塊的工程。更多關(guān)于創(chuàng)建工程的內(nèi)容,請(qǐng)見(jiàn) Creating a Project。
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
文件。
該參考文檔提供了用于實(shí)現(xiàn)表盤(pán)的詳細(xì)信息。詳見(jiàn) API 參考文檔。
如果你使用 Eclipse ADT,那么請(qǐng)下載 Wearable Support 庫(kù) 并且將該庫(kù)作為依賴(lài)包含在你的工程當(dāng)中。
表盤(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)限。
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)。
實(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 文件中。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: