אפליקציות של ספקי נתונים חושפות מידע לתצוגת השעון סיבוכים, שמספקות שדות שמכילים טקסט, מחרוזות, תמונות ומספרים.
שירות של ספק נתונים מתרחב
ComplicationProviderService
כדי לספק תוצאות מועילות
ישירות אל תצוגת השעון.
יצירת פרויקט של ספק נתונים
כדי ליצור פרויקט ב-Android Studio עבור האפליקציה של ספק הנתונים, מבצעים את השלבים הבאים:
- לוחצים על קובץ > חדש > פרויקט חדש.
- בחלון Project Template (תבנית פרויקט), לוחצים על הכרטיסייה Wear OS ובוחרים באפשרות אין פעילות ולוחצים על הבא.
- בחלון Configure Your Project, נותנים שם לפרויקט וממלאים את של הפרויקט הרגיל, ולוחצים על Finish.
- מערכת Android Studio יוצרת פרויקט עם מודול אפליקציה עבור ספק הנתונים. לקבלת מידע נוסף מידע על פרויקטים ב-Android Studio: יוצרים פרויקט.
- כדי להתחיל את השימוש באפליקציה של ספק הנתונים, צריך ליצור מחלקה חדשה שנשמרת
BroadcastReceiver
המטרה של הכיתה היא להקשיב בקשות לעדכון רכיבים ממערכת Wear OS. בנוסף, יוצרים כיתה חדשה שנפתחתComplicationProviderService
כדי לספק נתונים בהתאם לרכיבים המתאימים. למידע נוסף, קראו את המאמרים הבאים:- הטמעת שיטה לבקשות עדכון
ComplicationTapBroadcastReceiver
וגםCustomComplicationProviderService
מחלקות ב-Codelab הבא: חשיפת נתונים לסיבוכים של תצוגת השעון ב-Wear OSComplicationToggleReceiver
,LongTextProviderService
ומחלקות אחרות דוגמת חבילת בדיקה
הערה: הוספת פעילות לספק הנתונים שלך היא אופציונלי. לדוגמה, יכול להיות שתרצו שפעילות תופעל רק כשהמשתמש מקיש על היא תכונה נוספת.
הטמעת שיטה לבקשות עדכון
כשיש צורך בנתונים של רכיבים, מערכת Wear OS שולחת בקשות עדכון לנתונים
ספק. הבקשות מתקבלות על ידי
BroadcastReceiver
כדי להגיב לבקשות העדכון:
שספק הנתונים צריך להטמיע
onComplicationUpdate()
של הComplicationProviderService
בכיתה.
מערכת Wear OS שולחת קריאה ל-onComplicationUpdate()
כשהיא צריכה נתונים מ-
בספק – לדוגמה, כשתכונה נוספת של משתמשים בספק הופכת
פעיל או כשחולף פרק זמן קבוע.
הוא עובר
ComplicationManager
כפרמטר של
onComplicationUpdate
, שמשמש לשליחת נתונים חזרה למערכת.
הערה: כשהאפליקציה של ספק הנתונים מספקת נתונים, תצוגת השעון מקבל את הערכים הגולמיים שאתם שולחים כדי שיוכל לשרטט את המידע.
קטע הקוד הבא מציג הטמעה לדוגמה של
אמצעי תשלום אחד (onComplicationUpdate
):
Kotlin
override fun onComplicationUpdate( complicationId: Int, dataType: Int, complicationManager: ComplicationManager) { Log.d(TAG, "onComplicationUpdate() id: $complicationId") // Used to create a unique key to use with SharedPreferences for this complication. val thisProvider = ComponentName(this, javaClass) // Retrieves your data; in this case, grabs an incrementing number from SharedPrefs. val preferences = getSharedPreferences(ComplicationTapBroadcastReceiver.COMPLICATION_PROVIDER_PREFERENCES_FILE_KEY, 0) val number = preferences.getInt( ComplicationTapBroadcastReceiver.getPreferenceKey( thisProvider, complicationId), 0) val numberText = String.format(Locale.getDefault(), "%d!", number) var complicationData: ComplicationData? = null when (dataType) { ComplicationData.TYPE_SHORT_TEXT -> complicationData = ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT) .setShortText(ComplicationText.plainText(numberText)) .build() else -> if (Log.isLoggable(TAG, Log.WARN)) { Log.w(TAG, "Unexpected complication type $dataType") } } if (complicationData != null) { complicationManager.updateComplicationData(complicationId, complicationData) } else { // If no data is sent, we still need to inform the ComplicationManager, so // the update job can finish and the wake lock isn't held any longer. complicationManager.noUpdateRequired(complicationId) } }
Java
@Override public void onComplicationUpdate( int complicationId, int dataType, ComplicationManager complicationManager) { Log.d(TAG, "onComplicationUpdate() id: " + complicationId); // Used to create a unique key to use with SharedPreferences for this complication. ComponentName thisProvider = new ComponentName(this, getClass()); // Retrieves your data; in this case, grabs an incrementing number from SharedPrefs. SharedPreferences preferences = getSharedPreferences( ComplicationTapBroadcastReceiver.COMPLICATION_PROVIDER_PREFERENCES_FILE_KEY, 0); int number = preferences.getInt( ComplicationTapBroadcastReceiver.getPreferenceKey( thisProvider, complicationId), 0); String numberText = String.format(Locale.getDefault(), "%d!", number); ComplicationData complicationData = null; switch (dataType) { case ComplicationData.TYPE_SHORT_TEXT: complicationData = new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT) .setShortText(ComplicationText.plainText(numberText)) .build(); break; default: if (Log.isLoggable(TAG, Log.WARN)) { Log.w(TAG, "Unexpected complication type " + dataType); } } if (complicationData != null) { complicationManager.updateComplicationData(complicationId, complicationData); } else { // If no data is sent, we still need to inform the ComplicationManager, so // the update job can finish and the wake lock isn't held any longer. complicationManager.noUpdateRequired(complicationId); } }
הצהרות והרשאות במניפסט
כדי להתייחס לאפליקציות של ספקי נתונים, הן חייבות לכלול הצהרות ספציפיות בקובץ המניפסט של האפליקציה. ספק נתונים על ידי מערכת Android. בקטע הזה מוסבר על ההגדרות הנדרשות עבור של ספקי נתונים.
במניפסט של האפליקציה צריך להצהיר על השירות ולהוסיף מסנן Intent של בקשת עדכון.
כמו כן, המניפסט צריך להגן על השירות על ידי הוספת BIND_COMPLICATION_PROVIDER
כדי להבטיח שרק מערכת Wear OS תוכל לקשר לשירותי הספק.
כמו כן, צריך לכלול את המאפיין android:icon
בקובץ
רכיב service
שמספק
סמל לבן בצבע אחד. אנחנו ממליצים על פריטים גרפיים וקטוריים לסמלים.
הסמל מייצג את הספק ומוצג
בוחר.
הנה דוגמה:
<service android:name=".provider.IncrementingNumberComplicationProviderService" android:icon="@drawable/icn_complications" android:label="@string/complications_provider_incrementing_number" android:permission="com.google.android.wearable.permission.BIND_COMPLICATION_PROVIDER"> <intent-filter> <action android:name="android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST"/> </intent-filter> </service>
ציון רכיבי המטא-נתונים
בקובץ המניפסט, יש לכלול מטא-נתונים כדי לציין את הסוגים הנתמכים, תקופת העדכון ופעולת ההגדרה, כפי שאפשר לראות ב דוגמה:
<meta-data android:name="android.support.wearable.complications.SUPPORTED_TYPES" android:value="RANGED_VALUE,SHORT_TEXT,LONG_TEXT" /> <meta-data android:name="android.support.wearable.complications.UPDATE_PERIOD_SECONDS" android:value="300" />
כשספק נתוני הרכיבים פעיל,
UPDATE_PERIOD_SECONDS
מציין באיזו תדירות רוצים
כדי לבדוק אם יש עדכונים לנתונים. אם המידע שמוצג
הרכיבים לא צריכים להתעדכן לפי לוח זמנים קבוע, למשל
אתם משתמשים בעדכונים לעדכון. צריך להגדיר את הערך הזה בתור
0
.
אם לא מגדירים את UPDATE_PERIOD_SECONDS
לערך 0
,
עליך להשתמש בערך של 300
לפחות (5 דקות), כלומר
את תקופת העדכון המינימלית שהמערכת אוכפת,
חיי הסוללה של המכשיר. כמו כן, חשוב לזכור שבקשות עדכון
מופיעים בתדירות נמוכה יותר כשהמכשיר נמצא במצב רגישות לסביבה או לא עונד אותו.
לפרטים נוספים על שליחת עדכונים, אפשר לעיין במפתחות שמפורטים עבור
ComplicationProviderService
בכיתה
API של Wear OS
קובץ עזר.
הוספת פעילות של מערך הגדרות אישיות
אם יש צורך, הספק יכול לכלול פעילות של הגדרות אישיות מוצגות למשתמש כשהמשתמש בוחר ספק נתונים. כדי לכלול את פעילות הגדרות, לכלול פריט מטא-נתונים בשירות הספק במניפסט עם המפתח הבא:
<meta-data android:name="android.support.wearable.complications.PROVIDER_CONFIG_ACTION" android:value="PROVIDER_CONFIG_ACTION"/>
הערך יכול להיות כל פעולה.
לאחר מכן, יוצרים את פעילות ההגדרה עם מסנן Intent בשביל ההגדרה הזו.
פעולה. פעילות ההגדרות האישיות חייבת להימצא באותה חבילה כמו
ספק. פעילות ההגדרה חייבת להחזיר RESULT_OK
או
RESULT_CANCELED
כדי לומר למערכת אם הספק
צריך להגדיר.
תצוגות שעון בטוחות שהוגדרו על ידי הספק
ספקים יכולים להגדיר תצוגות שעון מסוימות כ'בטוחות' כדי לקבל . האפשרות הזו נמצאת בשימוש רק בזמן ניסיון של תצוגת השעון כדי להשתמש בספק כברירת מחדל והספק סומך על האפליקציה של תצוגת השעון.
כדי להצהיר שתצוגות השעון בטוחות, הספק מוסיף מטא-נתונים עם מפתח של
android.support.wearable.complications.SAFE_WATCH_FACES
ערך מטא נתונים הוא רשימה מופרדת בפסיקים של
WatchFaceService
שמות של רכיבים, שניתנו כאילו
מתבצעת שיחה אל ComponentName.flattenToString()
, או
שמות של חבילות אפליקציות, במקרה כזה, כל תצוגת שעון
אפליקציה ספציפית נחשבת בטוחה. המערכת מתעלמת מרווחים לבנים ברשימת הערכים. לדוגמה:
<meta-data android:name="android.support.wearable.complications.SAFE_WATCH_FACES" android:value=" com.app.watchface/com.app.watchface.MyWatchFaceService, com.anotherapp.anotherwatchface/com.something.WatchFaceService, com.something.text"/>
הוספת תמונות בטוחות בצריבה
במסכים שחשופים לשריפה, יש להימנע מבלוקים של צבע אחיד תאורת אווירה. אם הסמלים או התמונות כוללים בלוקים של צבע אחיד, מספקות גם גרסה בטוחה בנושא צריבה.
כשמציינים סמל באמצעות
ComplicationData.Builder#setIcon
, כולל גרסה בטוחה שצריבה
באמצעות
ComplicationData.Builder#setBurnInProtectionIcon
כשמציינים תמונה באמצעות
ComplicationData.Builder#setSmallImage
, כולל גרסה בטוחה שצריבה
באמצעות
ComplicationData.Builder#setBurnInProtectionSmallImage
שימוש בעדכוני Push
כחלופה לציון מרווח עדכון קבוע שאינו אפס עבור
תכונה נוספת במניפסט של האפליקציה, אפשר להשתמש במופע של
ComplicationDataSourceUpdateRequester
כדי לבקש עדכונים באופן דינמי.
כדי לבקש עדכון לתוכן הגלוי למשתמשים של התכונה הנוספת, צריך להתקשר
requestUpdate()
זהירות: כדי להאריך את חיי הסוללה,
אל תקראו ל-requestUpdate()
מהמופע של
ComplicationDataSourceUpdateRequester
בתדירות גבוהה יותר מאשר כל 5 דקות ביום
בממוצע.
מספקים ערכים דינמיים
החל מ-Wear OS 4, יש תכונות נוספות שיכולות להציג ערכים שמתרעננים בתדירות גבוהה יותר
על סמך הערכים הזמינים ישירות לפלטפורמה. כדי לספק את היכולת הזו
את הסיבוכים,
ComplicationData
שדות שמקבלים
ערכים דינמיים. הפלטפורמה בודקת
מעדכן את הערכים האלה לעיתים קרובות, בלי לדרוש הפעלה של ספק הרכיבים.
שדות לדוגמה כוללים
שדה הערך הדינמי של GoalProgressComplicationData
, וגם
DynamicComplicationText
, ואפשר להשתמש בו בכל
שדה ComplicationText
. הערכים הדינמיים האלה מבוססים על
androidx.wear.protolayout.expression
.
במצבים מסוימים, הפלטפורמה לא יכולה להעריך ערכים דינמיים:
- לפעמים הערך הדינמי לא זמין: זה קורה, לדוגמה,
המכשיר לא על מפרק כף היד. במצבים האלה, הפלטפורמה משתמשת בערך
של
במקום זאת, בשדה חלופה לביטול התוקף של ערך דינמי,
שדה ה-placeholder של
NoDataComplicationData
. - ערך דינמי אף פעם לא זמין: האפשרות הזו מתרחשת במכשיר שפועל
גרסה ישנה יותר של Wear OS 4. במצב הזה, הפלטפורמה משתמשת בשדה חלופי נלווה,
כמו
getFallbackValue()
ציינו ערכים תלויי זמן
חלק מהרכיבים צריכים להציג ערך שמתייחס לרכיב הנוכחי בזמן האימון. לדוגמה: התאריך הנוכחי, הזמן עד לפגישה הבאה. או השעה באזור זמן אחר.
לא מעדכנים רכיב בכל פעם
שנייה או דקה כדי שהערכים האלה יהיו עדכניים. במקום זאת, ציינו
את הערכים ביחס לתאריך או לשעה הנוכחיים, תוך שימוש בטקסט תלוי-זמן.
אפשר להשתמש ב-builders ב
ComplicationText
כדי ליצור את הערכים התלויים בזמן.
שיעור העדכון של הרכיבים
כדאי לעדכן את התכונות הנוספות במהירות. עם זאת, הפעולה הזו עשויה להשפיע על הסוללה חיי המכשיר. אפשר לבחור להשתמש API של בקשות רכיבים שמאפשר לעדכן רכיבים ספציפיים בתדירות גבוהה יותר. אבל השימוש ב-API הזה חייב להיות מותר על ידי יצרן השעון. כל יצרן שעון מחליט אילו רכיבים יכולים לעדכן קצב מהיר יותר מהרגיל.