במדריך הזה מוסבר איך להגדיר את האפליקציה כך שתפעל תמיד, איך להגיב למעברים בין מצבי הפעלה ואיך לנהל את התנהגות האפליקציה כדי לספק חוויית משתמש טובה תוך חיסכון בסוללה.
הצגה קבועה של אפליקציה משפיעה באופן משמעותי על חיי הסוללה, ולכן חשוב לקחת בחשבון את ההשפעה על צריכת החשמל כשמוסיפים את התכונה הזו.
מושגים מרכזיים
כשמציגים אפליקציית Wear OS במסך מלא, היא נמצאת באחד משני מצבי צריכת חשמל:
- אינטראקטיבי: מצב צריכת חשמל גבוה שבו המסך בבהירות מלאה, ומאפשר אינטראקציה מלאה של המשתמש.
- סביבה: מצב צריכת חשמל נמוכה שבו המסך מעומעם כדי לחסוך באנרגיה. במצב הזה, ממשק המשתמש של האפליקציה עדיין תופס את כל המסך, אבל המערכת עשויה לשנות את המראה שלו על ידי טשטוש או הוספת שכבת תוכן כמו השעה. התכונה הזו נקראת גם תאורה קולנועית.
מערכת ההפעלה שולטת במעבר בין המצבים האלה.
אפליקציה שפועלת תמיד היא אפליקציה שמציגה תוכן גם במצב אינטראקטיבי וגם במצב סביבתי.
כשאפליקציה שפועלת תמיד ממשיכה להציג את ממשק המשתמש שלה בזמן שהמכשיר נמצא במצב אווירה עם צריכת חשמל נמוכה, היא מוגדרת כפועלת במצב אמביאקטיבי.
מעברים במערכת והתנהגות ברירת מחדל
כשאפליקציה נמצאת בחזית, המערכת מנהלת את המעברים בין מצבי צריכת החשמל על סמך שני טיימאוטים שמופעלים בגלל חוסר פעילות של המשתמש.
- זמן קצוב לתפוגה מספר 1: ממצב אינטראקטיבי למצב סביבתי: אחרי תקופה של חוסר פעילות מצד המשתמש, המכשיר עובר למצב סביבתי.
- הזמן הקצוב לתפוגה מס' 2: חזרה לתצוגת השעון: אחרי תקופה נוספת של חוסר פעילות, המערכת עשויה להסתיר את האפליקציה הנוכחית ולהציג את תצוגת השעון.
מיד אחרי שהמערכת עוברת את המעבר הראשון למצב Ambient, התנהגות ברירת המחדל תלויה בגרסת Wear OS ובהגדרות האפליקציה:
- ב-Wear OS 5 ובגרסאות קודמות, המערכת מציגה צילום מסך מטושטש של האפליקציה המושהית, עם השעה שמוצגת מעל. המצב הזה מיוצג על ידי הצומת AOD Lite בתרשים הזרימה הבא.
- ב-Wear OS 6 ואילך, אם אפליקציה מטרגטת SDK בגרסה 36 או חדשה יותר, היא נחשבת לאפליקציה שפועלת תמיד. התצוגה מעומעמת, אבל האפליקציה ממשיכה לפעול ונשארת גלויה. (יכול להיות שהעדכונים יתבצעו בתדירות נמוכה, למשל פעם בדקה). הסטטוס הזה מיוצג על ידי הצומת Global AOD בתרשים הזרימה הבא.
התאמה אישית של ההתנהגות במצב אווירה
בכל הגרסאות של Wear OS, אפשר להתאים אישית את המראה או את ההתנהגות של האפליקציה במצב Ambient, בלי קשר להתנהגות המערכת שמוגדרת כברירת מחדל. כדי לעשות זאת, משתמשים ב-AmbientLifecycleObserver כדי להאזין לקריאות חוזרות (callbacks) במעברים בין מצבים. המצב הזה מיוצג על ידי הצומת 'מצב פעיל של Ambiactive' בתרשים הזרימה הבא.
שימוש ב-AmbientLifecycleObserver
כדי להגיב לאירועים במצב תאורת אווירה, משתמשים במחלקה AmbientLifecycleObserver:
מטמיעים את הממשק
AmbientLifecycleObserver.AmbientLifecycleCallback. משתמשים בשיטהonEnterAmbient()כדי להתאים את ממשק המשתמש למצב צריכת חשמל נמוכה, ובשיטהonExitAmbient()כדי לשחזר אותו למצב תצוגה אינטראקטיבי מלא.val ambientCallback = object : AmbientLifecycleObserver.AmbientLifecycleCallback { override fun onEnterAmbient(ambientDetails: AmbientLifecycleObserver.AmbientDetails) { // ... Called when moving from interactive mode into ambient mode. // Adjust UI for low-power state: dim colors, hide non-essential elements. } override fun onExitAmbient() { // ... Called when leaving ambient mode, back into interactive mode. // Restore full UI. } override fun onUpdateAmbient() { // ... Called by the system periodically (typically once per minute) // to allow the app to update its display while in ambient mode. } }
יוצרים
AmbientLifecycleObserverורושמים אותו במחזור החיים של הפעילות או של הרכיב הקומפוזבילי.private val ambientObserver = AmbientLifecycleObserver(activity, ambientCallback) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) lifecycle.addObserver(ambientObserver) // ... }
מתקשרים אל
removeObserver()כדי להסיר את הצופה ב-onDestroy().override fun onDestroy() { super.onDestroy() lifecycle.removeObserver(ambientObserver) // ... }
למפתחים שמשתמשים ב-Jetpack Compose, ספריית Horologist מספקת כלי עזר שימושי, הקוד הקומפוזבילי AmbientAware, שמפשט את ההטמעה של התבנית הזו.
הצגת השעה עם טקסט בהתאם לסביבה
יוצא מן הכלל: ב-Wear OS 6, הווידג'ט TimeText מודע למצב הסביבה, ולכן לא נדרש observer בהתאמה אישית. העדכון מתבצע אוטומטית פעם בדקה כשהמכשיר במצב סביבתי, ללא צורך בקוד נוסף.
תרשים זרימה של התנהגות סביבתית
בתרשים הזרימה הבא מוצג איך המערכת קובעת את התנהגות הסביבה על סמך גרסת Wear OS במכשיר, targetSdkVersion באפליקציה והאם היא מטמיעה את AmbientLifecycleCallback.
שליטה במשך הזמן שהמסך פועל
בקטעים הבאים מוסבר איך לנהל את משך הזמן שבו האפליקציה מוצגת במסך.
איך מונעים חזרה לתצוגת השעון עם פעילות מתמשכת
אחרי פרק זמן מסוים במצב סביבה (הזמן הקצוב לתפוגה מס' 2), המערכת בדרך כלל תחזור לתצוגת השעון. המשתמש יכול להגדיר את משך הזמן הקצוב לתפוגה בהגדרות המערכת. בתרחישי שימוש מסוימים, כמו מעקב של משתמש אחרי אימון, יכול להיות שאפליקציה תצטרך להישאר גלויה למשך זמן ארוך יותר.
ב-WearOS 5 ומעלה, אפשר למנוע את זה באמצעות הטמעה של Ongoing Activity. אם האפליקציה מציגה מידע על משימה שוטפת של המשתמש, כמו אימון, אפשר להשתמש ב-Ongoing Activity API כדי שהאפליקציה תישאר גלויה עד שהמשימה תסתיים. אם משתמש חוזר באופן ידני לתצוגת השעון, האינדיקטור של הפעילות המתמשכת מאפשר לו לחזור לאפליקציה שלכם בלחיצה אחת.
כדי להטמיע את זה, כוונת המגע של ההתראה המתמשכת צריכה להצביע על הפעילות הפועלת תמיד, כמו שמוצג בקטע הקוד הבא:
val activityIntent = Intent(this, AlwaysOnActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_SINGLE_TOP } val pendingIntent = PendingIntent.getActivity( this, 0, activityIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID) // ... // ... .setOngoing(true) // ... val ongoingActivity = OngoingActivity.Builder(applicationContext, NOTIFICATION_ID, notificationBuilder) // ... // ... .setTouchIntent(pendingIntent) .build() ongoingActivity.apply(applicationContext) val notification = notificationBuilder.build()
שמירת המסך במצב פעולה ומניעת מצב סביבתי
במקרים נדירים, יכול להיות שתצטרכו למנוע לחלוטין מהמכשיר להיכנס למצב רגישות לסביבה. כלומר, כדי להימנע מפסק זמן מס' 1. כדי לעשות את זה, אפשר להשתמש בדגל החלון FLAG_KEEP_SCREEN_ON. הפונקציה הזו פועלת כנעילת השהיה, ומעבירה את המכשיר למצב אינטראקטיבי. חשוב להשתמש באפשרות הזו בזהירות רבה כי היא משפיעה באופן משמעותי על חיי הסוללה.
המלצות למצב אווירה
כדי לספק את חוויית המשתמש הטובה ביותר ולחסוך בצריכת החשמל במצב סביבה פעילה, צריך לפעול לפי הנחיות העיצוב האלה. ההמלצות האלה מתמקדות בחוויית משתמש ברורה, על ידי מניעת מידע מטעה וצמצום העומס החזותי, ובו-זמנית מבצעות אופטימיזציה של עוצמת התצוגה.
- הפחתת העומס החזותי והצגת עוצמה. ממשק משתמש נקי ומינימליסטי מסמן למשתמש שהאפליקציה במצב צריכת חשמל נמוכה, וחוסך משמעותית בצריכת הסוללה על ידי הגבלת הפיקסלים הבהירים.
- לשמור על לפחות 85% מהמסך שחור.
- להציג רק את המידע הכי חשוב, ולהעביר את הפרטים המשניים לתצוגה האינטראקטיבית.
- כדאי להשתמש בקווי מתאר לסמלים או ללחצנים גדולים במקום במילוי מלא.
- אל תשתמשו בבלוקים גדולים של צבע אחיד ובמיתוג לא פונקציונלי או בתמונות רקע.
- טיפול בנתונים דינמיים לא עדכניים
- הקריאה החוזרת
onUpdateAmbient()מופעלת רק מדי פעם – בדרך כלל פעם בדקה – כדי לחסוך בחשמל. בגלל המגבלה הזו, כל נתון שמשתנה בתדירות גבוהה – כמו שעון עצר, דופק או מרחק באימון – לא יהיה מעודכן בין העדכונים. כדי להימנע מהצגת מידע מטעה ושגוי, צריך להאזין לקריאה החוזרתonEnterAmbientולהחליף את הערכים בזמן אמת בתוכן סטטי של placeholder, כמו--.
- הקריאה החוזרת
- שמירה על פריסה עקבית
- כדי ליצור מעבר חלק בין מצב אינטראקטיבי למצב סביבתי, חשוב להקפיד שהרכיבים יישארו באותו המיקום.
- הצגת השעה באופן קבוע.
- התאמה להקשר
- אם המשתמש היה במסך הגדרות או במסך הגדרה כשהמכשיר נכנס למצב סביבתי, כדאי להציג מסך רלוונטי יותר מהאפליקציה במקום תצוגת ההגדרות.
- טיפול בדרישות ספציפיות למכשיר
- באובייקט
AmbientDetailsשמועבר אלonEnterAmbient():- אם הערך של
deviceHasLowBitAmbientהואtrue, משביתים את החלקת הקצוות (anti-aliasing) איפה שאפשר. - אם
burnInProtectionRequiredהואtrue, כדאי להזיז מעט את רכיבי ממשק המשתמש מדי פעם ולהימנע מאזורים לבנים מלאים כדי למנוע שריפת פיקסלים במסך.
- אם הערך של
- באובייקט
ניפוי באגים ובדיקות
פקודות adb האלה יכולות להיות שימושיות כשמפתחים או בודקים את התנהגות האפליקציה כשמכניסים את המכשיר למצב סביבה:
# put device in ambient mode if the always on display is enabled in settings
# (and not disabled by other settings, such as theatre mode)
$ adb shell input keyevent KEYCODE_SLEEP
# put device in interactive mode
$ adb shell input keyevent KEYCODE_WAKEUP
דוגמה: אפליקציית אימונים
נניח שיש אפליקציה לאימונים שצריכה להציג למשתמש מדדים למשך כל סשן האימון. האפליקציה צריכה להישאר גלויה במהלך המעברים בין מצבי הסביבה הפעילה, ולא להיות מוחלפת בתצוגת השעון.
כדי לעשות את זה, המפתח צריך לבצע את הפעולות הבאות:
- מטמיעים
AmbientLifecycleObserverכדי לטפל בשינויים בממשק המשתמש בין מצבי Interactive ו-Ambient, כמו עמעום המסך והסרת נתונים לא חיוניים. - יוצרים פריסה חדשה עם צריכת חשמל נמוכה למצב Ambient בהתאם לשיטות המומלצות.
- כדי למנוע מהמערכת לחזור לתצוגת השעון, צריך להשתמש ב-Ongoing Activity API למשך האימון.
למידע על הטמעה מלאה, אפשר לעיין בדוגמה לתרגיל מבוססת-Compose ב-GitHub. בדוגמה הזו מוצג גם שימוש ב-composable AmbientAware מהספרייה Horologist כדי לפשט את הטיפול במצב סביבה ב-Compose.