במדריך הזה מוסבר איך להגדיר את האפליקציה כך שתפעל תמיד, איך להגיב למעברים בין מצבי צריכת חשמל ואיך לנהל את התנהגות האפליקציה כדי לספק חוויית משתמש טובה תוך חיסכון בסוללה.
הצגה קבועה של אפליקציה משפיעה באופן משמעותי על חיי הסוללה, ולכן חשוב לקחת בחשבון את ההשפעה על צריכת החשמל כשמוסיפים את התכונה הזו.
מושגים מרכזיים
כשמציגים אפליקציה ל-Wear OS במסך מלא, היא נמצאת באחד משני מצבי צריכת חשמל:
- אינטראקטיבי: מצב צריכת חשמל גבוה שבו המסך בבהירות מלאה, ומאפשר אינטראקציה מלאה של המשתמש.
- סביבה: מצב צריכת חשמל נמוכה שבו המסך מתעמעם כדי לחסוך בחשמל. במצב הזה, ממשק המשתמש של האפליקציה עדיין תופס את כל המסך, אבל המערכת עשויה לשנות את המראה שלו על ידי טשטוש או הצגת תוכן בשכבת-על, כמו השעה. האפשרות הזו נקראת גם תאורת אווירה.
מערכת ההפעלה שולטת במעבר בין המצבים האלה.
אפליקציה שפועלת תמיד היא אפליקציה שמציגה תוכן גם במצב אינטראקטיבי וגם במצב סביבתי.
כשמכשיר נמצא במצב אווירה שבו צריכת החשמל נמוכה, ואפליקציה שפועלת תמיד ממשיכה להציג את ממשק המשתמש שלה, היא נמצאת במצב אמביאקטיבי.
מעברים במערכת והתנהגות ברירת מחדל
כשאפליקציה נמצאת בחזית, המערכת מנהלת את המעברים בין מצבי צריכת החשמל על סמך שני טיימאוטים שמופעלים בגלל חוסר פעילות מצד המשתמש.
- זמן קצוב לתפוגה מס' 1: ממצב אינטראקטיבי למצב סביבתי: אחרי תקופה של חוסר פעילות מצד המשתמש, המכשיר עובר למצב סביבתי.
- הזמן הקצוב לתפוגה מס' 2: חזרה לתצוגת השעון: אחרי תקופה נוספת של חוסר פעילות, המערכת עשויה להסתיר את האפליקציה הנוכחית ולהציג את תצוגת השעון.
מיד אחרי שהמערכת עוברת את המעבר הראשון למצב Ambient, התנהגות ברירת המחדל תלויה בגרסת Wear OS ובהגדרות האפליקציה:
- ב-Wear OS 5 ובגרסאות קודמות, המערכת מציגה צילום מסך מטושטש של האפליקציה שהושהתה, עם השעה שמוצגת מעל. המצב הזה מיוצג בצומת AOD Lite בתרשים הזרימה הבא.
- ב-Wear OS 6 ואילך, אם אפליקציה מטרגטת SDK בגרסה 36 ואילך, היא נחשבת לאפליקציה שפועלת תמיד. התצוגה מוצנעת, אבל האפליקציה ממשיכה לפעול ונשארת גלויה. (יכול להיות שהעדכונים יתבצעו בתדירות נמוכה, למשל פעם בדקה). המצב הזה מיוצג על ידי הצומת Global AOD בתרשים הזרימה הבא.
התאמה אישית של ההתנהגות במצב סביבתי
בכל הגרסאות של Wear OS, אפשר להתאים אישית את המראה או את ההתנהגות של האפליקציה במצב Ambient, באמצעות LocalAmbientModeManager כדי לצפות במעברים בין מצבים ב-Jetpack Compose ב-Wear OS. המצב הזה מיוצג על ידי הצומת 'מצב פעיל של Ambiactive' בתרשים הזרימה הבא.
גילוי מצב הסביבה
כדי להגיב לאירועים במצב סביבה ב-Jetpack Compose ב-Wear OS:
אפשר להשתמש ב-
LocalAmbientModeManagerכדי לעקוב אחרי שינויים בסטטוס של מצב הסביבה במערכת, ולהתאים את הרכיבים הניתנים להרכבה בהתאם. מגדירים את הרכיב כך שיעבור למצב צריכת חשמל נמוכה במצבAmbientMode.Ambient, ויחזור לתצוגה אינטראקטיבית מלאה במצבAmbientMode.Interactive.// In a production application, the AmbientModeManager should be instantiated and provided at // the highest level of the Compose hierarchy (typically in the host Activity's setContent // block) using a CompositionLocalProvider. This ensures proper lifecycle management and // broad accessibility. // For this self-contained demo, AmbientModeManager is created and provided locally: val activityAmbientModeManager = rememberAmbientModeManager() CompositionLocalProvider(LocalAmbientModeManager provides activityAmbientModeManager) { val ambientModeManager = LocalAmbientModeManager.current val ambientMode = ambientModeManager?.currentAmbientMode if (ambientModeManager != null) { ambientModeManager.AmbientTickEffect { // While device is in ambient mode, update properties every minute or so // ... } } // ... val ambientModeName = when (ambientMode) { is AmbientMode.Interactive -> "Interactive" is AmbientMode.Ambient -> "Ambient" else -> "Unknown" } Text(text = "$ambientModeName Mode") // ... }
תרשים זרימה של התנהגות הסביבה
בתרשים הזרימה הבא מוצג אופן הפעולה של המערכת בהתאם לגרסת Wear OS במכשיר, ל-targetSdkVersion של האפליקציה ולשאלה אם היא עוקבת אחרי מעברים בין מצבי סביבה (באמצעות LocalAmbientModeManager או AmbientLifecycleCallback).
שליטה במשך הזמן שהמסך פועל
בקטעים הבאים מוסבר איך לנהל את משך הזמן שבו האפליקציה מוצגת במסך.
איך מונעים חזרה לתצוגת השעון עם פעילות מתמשכת או עדכון בזמן אמת
אחרי תקופה מסוימת במצב סביבה (הזמן הקצוב לתפוגה מס' 2), המערכת בדרך כלל תחזור לתצוגת השעון. המשתמש יכול להגדיר את משך הזמן הקצוב לתפוגה בהגדרות המערכת. בתרחישי שימוש מסוימים, כמו מעקב אחרי משתמשים אחרי אימון, יכול להיות שאפליקציה תצטרך להישאר גלויה למשך זמן ארוך יותר.
ב-Wear OS מגרסה 5 ואילך, אפשר למנוע את זה באמצעות הטמעה של Ongoing Activity. אם האפליקציה שלכם מציגה מידע על משימה שוטפת של המשתמש, כמו אימון, אתם יכולים להשתמש ב-Ongoing Activity API כדי שהאפליקציה תישאר גלויה עד שהמשימה תסתיים. אם משתמש חוזר באופן ידני לתצוגת השעון, האינדיקטור של הפעילות המתמשכת מאפשר לו לחזור לאפליקציה שלכם בלחיצה אחת.
לחלופין, ב-Wear OS 7 ומעלה, אפשר להשתמש בעדכון בזמן אמת במקום בפעילות מתמשכת. לצורך תאימות לאחור, אנחנו ממשיכים לתמוך בפעילות מתמשכת במכשירים עם Wear OS 6 ומטה.
כדי ליישם את זה, כוונת המגע של ההתראה המתמשכת צריכה להצביע על הפעילות שלכם במצב 'תמיד פעיל', כמו שמוצג בקטע הקוד הבא:
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()
שמירת המסך במצב פעולה ומניעת מצב סביבתי
במקרים נדירים, יכול להיות שתצטרכו למנוע לחלוטין מהמכשיר להיכנס למצב רגישות לסביבה. כלומר, כדי להימנע מפסילת בקשה בגלל חריגה מזמן קצוב לתגובה (Timeout) מספר 1. כדי לעשות את זה, אפשר להשתמש במילת המפתח לשינוי keepScreenOn. הפונקציה הזו פועלת כחסימת מצב שינה, ושומרת את המכשיר במצב אינטראקטיבי. חשוב להשתמש באפשרות הזו בזהירות רבה כי היא משפיעה באופן משמעותי על חיי הסוללה.
המלצות לשימוש במצב אווירה
כדי לספק את חוויית המשתמש הטובה ביותר ולחסוך בצריכת החשמל במצב סביבה פעילה, מומלץ לפעול לפי הנחיות העיצוב האלה. ההמלצות האלה נותנות עדיפות לחוויית משתמש ברורה, על ידי מניעת מידע מטעה וצמצום העומס החזותי, ובו-זמנית מבצעות אופטימיזציה של עוצמת התצוגה.
- הפחתת העומס החזותי והגברת עוצמת התצוגה. ממשק משתמש נקי ומינימליסטי מסמן למשתמש שהאפליקציה במצב צריכת חשמל נמוכה, וחוסך משמעותית בסוללה על ידי הגבלת הפיקסלים הבהירים.
- חשוב להקפיד שלפחות 85% מהמסך יהיה שחור (יחס של 15% פיקסלים פעילים או פחות).
- להציג רק את המידע החשוב ביותר, ולהעביר את הפרטים המשניים לתצוגה האינטראקטיבית.
- כדאי להשתמש בקווי מתאר לסמלים או ללחצנים גדולים במקום במילוי מלא, ולהתאים את הניגודיות של קווי המתאר כדי שהרכיבים יישארו קריאים בלי לסכן את הבהוב המסך או את הצריבה שלו.
- אל תשתמשו בבלוקים גדולים של צבע אחיד ובמיתוג או בתמונות רקע לא פונקציונליים.
- טיפול בנתונים דינמיים ובאנימציות לא עדכניים
- הקריאה החוזרת
AmbientTickEffectמופעלת רק מדי פעם – בדרך כלל פעם בדקה – כדי לחסוך בחשמל. בגלל המגבלה הזו, נתונים שמשתנים בתדירות גבוהה – כמו שעון עצר, דופק או מרחק באימון – לא יהיו מעודכנים בין העדכונים. כדי להימנע מהצגת מידע מטעה ושגוי, צריך להחליף את הערכים הדינמיים האלה בתוכן סטטי של placeholder, כמו--. - הסרת אינדיקטורים להתקדמות שנדרשים לעדכונים תכופים כדי להיות שימושיים בהקשר או במצב הנוכחי של המשתמש, כמו טבעות התקדמות לסשנים קצרים של מדיה. אפשר להשאיר את אינדיקטורי ההתקדמות במקרים שבהם עדכונים פעם בדקה עדיין מועילים, למשל כשמדובר בטיימרים ארוכים.
- השהיה או הסרה של כל האנימציות במצב סביבה, כולל אנימציות של אינדיקטורים להתקדמות וטקסט רץ.
- הקריאה החוזרת
- שמירה על פריסה עקבית
- כדי ליצור מעבר חלק, חשוב להקפיד שהאלמנטים יישארו באותו המיקום במצבי אינטראקטיב וסביבה. רכיבי ממשק משתמש אינטראקטיביים כמו לחצנים יכולים להישאר גלויים כי מכשירי Wear OS מודרניים תומכים בהזנת מגע במהלך סשנים של מצב סביבה.
- השעה הנוכחית תמיד תוצג. ב-Jetpack Compose ל-Wear OS,
TimeText(שכלול כברירת מחדל ב-ScreenScaffold) מודע למצב הסביבה ומתעדכן אוטומטית פעם בדקה במצב סביבה.
- התאמה להקשר
- אם המשתמש היה במסך הגדרות או במסך הגדרה כשהמכשיר נכנס למצב סביבתי, כדאי להציג מסך רלוונטי יותר מהאפליקציה במקום תצוגת ההגדרות.
- טיפול בדרישות ספציפיות למכשיר
- כאשר הפונקציה
currentAmbientModeמחזירה את הערךAmbientMode.Ambient:- אם הערך של
isLowBitAmbientSupportedהואtrue, התצוגה תומכת בפחות סיביות לכל צבע במצב סביבה. משביתים את החלקת הקצוות (לדוגמה, בפעולות ציור מותאמות אישית שלCanvasאוPaint) ונמנעים משימוש במעברי צבעים ככל האפשר. - אם הערך של
isBurnInProtectionRequiredהואtrue, המערכת משנה את תוכן התצוגה באופן מחזורי כדי למנוע צריבת פיקסלים. אל תזיזו ידנית רכיבים בממשק המשתמש באפליקציה. במקום זאת, הימנעו מאזורים לבנים מלאים והציבו רכיבים קריטיים בממשק המשתמש במרחק של 10 פיקסלים לפחות מקצה המסך, כדי שהם לא ייחתכו כשהמערכת תזיז את התצוגה. (פריסות רגילות של Wear Compose, כמוScreenScaffold, כבר מספקות ריווח מספיק מהקצה).
- אם הערך של
- כאשר הפונקציה
ניפוי באגים ובדיקות
הפקודות האלה של 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
דוגמה: אפליקציית אימונים
נניח שיש אפליקציית אימונים שצריכה להציג למשתמש מדדים למשך כל סשן האימון. האפליקציה צריכה להישאר גלויה במהלך מעברים בין מצבי הסביבה הפעילה, ולא להיות מוחלפת בתצוגת השעון.
כדי לעשות את זה, המפתח צריך:
- אפשר להשתמש ב-
LocalAmbientModeManagerכדי לטפל בשינויים בממשק המשתמש בין מצבי אינטראקטיבי וסביבתי, כמו עמעום המסך והסרה של נתונים לא חיוניים. - יוצרים פריסה חדשה עם צריכת חשמל נמוכה למצב Ambient בהתאם לשיטות המומלצות.
- כדי למנוע מהמערכת לחזור לתצוגת השעון, צריך להשתמש ב-Ongoing Activity API (או בעדכונים בזמן אמת ב-Wear OS 7 ואילך) למשך האימון.
לדוגמה מלאה של הטמעה, אפשר לעיין בדוגמה של תרגיל שמבוססת על Compose ב-GitHub. בדוגמה הזו אפשר לראות גם איך משתמשים בקומפוזיציה LocalAmbientModeManager כדי לפשט את הטיפול במצב סביבה ב-Compose.