אפליקציות שפועלות כל הזמן ומצב רגישות של המערכת

מערכת Wear OS מטפלת באופן אוטומטי במעבר של אפליקציה פעילה למצב צריכת אנרגיה נמוכה כשהמשתמש כבר לא משתמש בשעון. המצב הזה נקרא מצב רגיש לסביבה של המערכת. האפליקציה תמשיך לפעול אחרי שהמשתמש יבצע פעולה בשעון אם אחד מהתנאים הבאים מתקיים:

  • האינטראקציה של המשתמש מתרחשת בטווח זמן מסוים (לפני זמן הקצוב לתפוגה).
  • האפליקציה הצהירה על פעילות מתמשכת והפעילה אותה.

בתרחישי שימוש ספציפיים – לדוגמה, משתמש שרוצה לראות את קצב הלב והקצב במהלך ריצה – אפשר גם לקבוע מה יוצג במצב האווירה של המערכת. אפליקציות Wear OS שפועלות גם במצב אווירה וגם במצב אינטראקטיבי נקראות אפליקציות שפועלות תמיד.

הצגת אפליקציה באופן קבוע משפיעה על חיי הסוללה, לכן חשוב להביא בחשבון את ההשפעה הזו כשמוסיפים את התכונה הזו לאפליקציה.

הגדרת הפרויקט

כדי לתמוך במצב אווירה:

  1. יוצרים או מעדכנים את הפרויקט על סמך ההגדרות בדף Create and run a wearable app.
  2. (נדרש רק ב-Wear OS 4 ואילך) מוסיפים את ההרשאה WAKE_LOCK לקובץ המניפסט של Android:
<uses-permission android:name="android.permission.WAKE_LOCK" android:maxSdkVersion="33"/>

הפעלת מצב תמיד מופעל

החל מגרסה 6 של Wear OS, אפליקציות עם הערך targetSdkVersion שמוגדר כ-36 ומעלה פועלות כל הזמן כברירת מחדל. האפליקציות האלה יישארו גלויות במצב האווירה של המערכת למשך פרק זמן מוגבל, ללא הגדרה כלשהי. אם הערך של targetSdkVersion באפליקציה שלכם נמוך מ-36, או אם האפליקציה צריכה לפעול ב-Wear OS 5 ואילך, תוכלו להשתמש בכיתה AmbientLifecycleObserver כדי להפעיל את האפליקציה תמיד.

תגובה לאירועים במצב רגיש לסביבה באמצעות הכיתה AmbientLifecycleObserver

אפליקציות יכולות גם להשתמש בכיתה AmbientLifecycleObserver כדי להגיב ישירות לאירועים במצב אווירה:

  1. מטמיעים את הממשק AmbientLifecycleObserver.AmbientLifecycleCallback, כמו בדוגמה הבאה. בשלב הזה השיטות ריקות, אבל בהמשך המדריך מוסבר אילו שינויים צריך לבצע בתצוגה הוויזואלית כדי להיכנס למצב האווירה ולצאת ממנו.

    Kotlin

    val ambientCallback = object : AmbientLifecycleObserver.AmbientLifecycleCallback {
        override fun onEnterAmbient(ambientDetails: AmbientLifecycleObserver.AmbientDetails) {
        // ... Called when moving from interactive mode into ambient mode.
        }
    
        override fun onExitAmbient() {
        // ... Called when leaving ambient mode, back into interactive mode.
        }
    
        override fun onUpdateAmbient() {
        // ... Called by the system in order to allow the app to periodically
        // update the display while in ambient mode. Typically the system will
        // call this every 60 seconds.
        }
    }
  2. יוצרים AmbientLifecycleObserver ומירשם את הצופה. בדרך כלל, משתמשים ב-onCreate() או ב-composable ברמה העליונה אם משתמשים ב-Compose ל-Wear OS, כדי לאפשר הפעלה של ההתנהגות 'תמיד פועל' לאורך מחזור החיים של הפעילות.

    Kotlin

    private val ambientObserver = AmbientLifecycleObserver(activity, callback)
    
    override fun onCreate(savedInstanceState: Bundle) {
      super.onCreate(savedInstanceState)
      lifecycle.addObserver(observer)
    
      // ...
    }
  3. מסירים את המתבונן באמצעות קריאה ל-removeObserver() כשאין יותר צורך בהתנהגות של תמיד-מופעל. לדוגמה, אפשר להפעיל את השיטה הזו ב-method‏ onDestroy() של הפעילות.

עדכון הטקסט של השעה באמצעות הווידג'ט TimeText

החל מגרסה 6 של Wear OS, הווידג'ט TimeText מודע למצב האווירה. אם האפליקציה צריכה לעדכן רק את טקסט השעה בכל דקה במצב אווירה, אפשר להשתמש רק בווידג'ט TimeText בלי להשתמש ב-AmbientLifecycleObserver.

אפליקציות שפועלות תמיד יכולות לעבור לרקע

החל מגרסה 5 של Wear OS, המערכת מעבירה אפליקציות שפועלות תמיד לרקע אחרי שהן גלויות במצב אווירה למשך פרק זמן מסוים. המשתמשים יכולים להגדיר את הזמן הקצוב לתפוגה בהגדרות המערכת.

אם באפליקציה שפועלת כל הזמן מוצג מידע על משימה שהמשתמש מבצע, כמו הפעלת מוזיקה או סשן אימון, כדאי להשאיר את הפעילות המתמשכת גלויה עד שהמשימה תסתיים. כדי לעשות זאת, משתמשים ב-Ongoing Activity API כדי לפרסם התראה מתמשכת שמקושרת לפעילות שלכם שפועלת כל הזמן.

כדי שהמערכת תזהה את הפעילות המתמשכת, הכוונה למגע בהתראה המתמשכת צריכה להצביע על הפעילות שלכם במצב 'תמיד מחוברים', כפי שמתואר בקטע הקוד הבא:

// Create a pending intent that point to your always-on activity
val touchIntent =
    PendingIntent.getActivity(
        context,
        0,
        Intent(context, MyAlwaysOnActivity::class.java),
        PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
    )

val notificationBuilder =
    NotificationCompat.Builder(this, CHANNEL_ID)
    // ...
    .setOngoing(true)

val ongoingActivity =
    OngoingActivity.Builder(
        applicationContext, NOTIFICATION_ID, notificationBuilder
    )
    // ...
    .setTouchIntent(touchIntent)
    .build()

ongoingActivity.apply(applicationContext)

notificationManager.notify(
    NOTIFICATION_ID,
    notificationBuilder.build()
)

שינוי חוויית המשתמש במצב רגיש לסביבה

כברירת מחדל, כשמטמיעים את התכונה 'תצוגה תמידית', המראה של המסך לא משתנה כשהשעון עובר למצב אווירה. כדי לשנות את ההתנהגות הזו, אפשר לשנות את השיטות ב-AmbientLifecycleCallback.

כדי לחסוך בחשמל:

  • להאיר פחות פיקסלים. מומלץ להציג רק מידע קריטי במצב אווירה, ולספק פרטים נוספים כשהמשתמש עובר למצב אינטראקטיבי.
  • משאירים לפחות 85% מהמסך שחור, מסירים את המילוי ומשתמשים בקווי מתאר לכפתורים ולסמלים גדולים.
  • חשוב להימנע מהצגת מידע מיותר, כמו מיתוג לא פונקציונלי ותמונות רקע.
  • חשוב שהרכיבים יישארו באותו מיקום במצב פעיל ובמצב תצוגה תמידית, ושהשעה תמיד תוצג.
  • לשנות את התוכן כך שיהיה צורך לעדכן אותו בתדירות נמוכה יותר. לדוגמה, הצגת טיימרים לשעה הקרובה במקום לשנייה הקרובה.
  • להסיר או להציג ממשק משתמש של placeholder לתוכן אלפאנומרי שמתעדכן בתדירות גבוהה, כמו מרחק או זמן.
  • הסרת אינדיקטורים של התקדמות שמתעדכנים בתדירות גבוהה, כמו טבעות של ספירה לאחור וסשנים של מדיה.
  • כשהמשתמשים נכנסים למצב 'תמיד מופעל', אם הם היו בעבר במסך הגדרות או הגדרות אישיות באפליקציה, כדאי להציג להם במקום זאת מסך רלוונטי יותר באפליקציה.
  • באובייקט AmbientDetails שמועבר אל onEnterAmbient():
    • אם הערך של deviceHasLowBitAmbient מוגדר, משביתים את סינון הרעשי התמונה (anti-aliasing) במידת האפשר.
    • אם ההגדרה burnInProtectionRequired מוגדרת, כדאי להזיז את התצוגה החזותית מדי פעם ולהימנע מאזורים לבנים מוצקים.
  • מומלץ להימנע מהפעלת אנימציה רציפה במהלך מצב אווירה. החל מגרסה 5.1 של Wear OS, יכול להיות שהאנימציות יפסיקו לפעול במצב האווירה.

רשימת משימות להצגה ללא הפסקות

יכול להיות שתצטרכו שליטה מקסימלית על המסך במצבים שבהם המכשיר עובר מצבים שונים, למשל כשאפליקציית אימון רוצה למנוע את הצגת לוח השעון במהלך אימון. במקרים כאלה, צריך לבצע את הפעולות הבאות:

  1. מטמיעים את הממשק AmbientLifecycleObserver.AmbientLifecycleCallback.
  2. ליצור פריסה חדשה עם צריכת אנרגיה נמוכה לשימוש כשהמכשיר נמצא במצב אווירה סביבתית.
  3. במהלך האימון, מטמיעים פעילות מתמשכת.

דוגמה לאופן שבו אפשר לעשות זאת מופיעה ב דוגמה לתרגיל שמבוססת על compose ב-GitHub, שמשתמשת ב-AmbientAware שאפשר ליצור ממנו רכיבים בספרייה Horologist.