מצב תנומה של אפליקציה

אם האפליקציה מטרגטת את Android 11 (רמת API 30) ואילך, והמשתמש לא מטרגט את ליצור אינטראקציה עם האפליקציה במשך מספר חודשים, המערכת מציבה את במצב תנומה. המערכת מבצעת אופטימיזציה לנפח האחסון במקום לביצועים, והיא מגינה על נתוני המשתמשים. התנהגות המערכת הזו דומה למה שקורה כשהמשתמש משבית את האפליקציה באופן ידני מהגדרות המערכת.

ההשפעות של מצב תנומה

כפי שמוצג בטבלה 1, ההשפעות של מצב תרדמה תלויות בגרסה של SDK היעד של האפליקציה, וגם במכשיר שבו האפליקציה פועלת:

טבלה 1. ההשפעה של מצב תרדמה על האפליקציה
גרסת יעד של SDK מאפייני המכשיר אפקטים של מצב תנומה
Android מגרסה 12 ואילך מכשיר עם Android מגרסה 12 ואילך

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

האפליקציה לא יכולה להריץ משימות או התראות מהרקע.

האפליקציה לא יכולה לקבל התראות דחיפה, כולל הודעות עם עדיפות גבוהה שנשלחות דרך Firebase Cloud Messaging.

כל קובץ של האפליקציה המטמון הוסרו.

Android 11 מערכת ההפעלה Android 11 ההרשאות בזמן הריצה של האפליקציה יאפסו.
Android 11 מפעילה את Android 6.0 (רמת API 23) עד Android 10 (רמת API 29), כולל, והוא מופעל על ידי Google Play Services

ההרשאות של האפליקציה בתחילת ההפעלה אופסו.

ההתנהגות הזו תיכנס לתוקף בדצמבר 2021. מידע נוסף על האפשרות לאפס את ההרשאות באופן אוטומטי זמין במאמר הזה בבלוג.

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

בפעם הבאה שהמשתמש יוצר אינטראקציה עם האפליקציה, האפליקציה יוצאת ממצב תנומה כדי ליצור שוב משרות, התראות והתראות.

עם זאת, המערכת לא מבצעת את הפעולות הבאות באפליקציה:

  1. עליך להעניק מחדש את ההרשאות בתחילת ההפעלה של האפליקציה.

    המשתמש צריך להעניק שוב את ההרשאות האלה לאפליקציה.

  2. לתזמן מחדש את כל המשימות, ההתראות וההתראות שתוזמנו לפני האפליקציה שלך עברה למצב תנומה.

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

שימוש באפליקציות

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

דוגמאות לשימוש באפליקציות

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

ב-Android מגרסה 11 ואילך, גם ההתנהגויות הבאות נחשבות לאינטראקציות של משתמש:

  • המשתמש יוצר אינטראקציה עם ווידג'ט.
  • המשתמש יוצר אינטראקציה עם התראה, מלבד סגירת ההתראה.

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

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

שאינם דוגמאות

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

פטורים של המערכת ממצב תנומה

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

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

פטורים של משתמשים ממצב תנומה

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

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

כדי לבקש פטור, צריך לבצע את הפעולות בקטעים הבאים.

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

כדי לבדוק אם המשתמש כבר השבית את מצב ההרדמה של האפליקציה, צריך להשתמש ב-API‏ getUnusedAppRestrictionsStatus().

לפרטים נוספים על השימוש ב-API הזה באפליקציה, אפשר לעיין בדוגמה לקוד API שבדף הזה.

לבקש מהמשתמש להשבית את מצב תנוחת התנומה באפליקציה

אם המשתמש עדיין לא השבית את מצב ההרדמה של האפליקציה, תוכלו לשלוח לו בקשה. כדי לעשות זאת, מבצעים את השלבים הבאים:

  1. הצגת ממשק משתמש שמסביר למשתמש למה צריך להשבית מצב תנומה של האפליקציה.
  2. מפעילים את createManageUnusedAppRestrictionsIntent() API, כפי שמוצג בדוגמה לקוד API. ה-API הזה יוצר Intent שטוען את המסך פרטי האפליקציה בהגדרות. מכאן המשתמש יכול להשבית את מצב תנודת החורף באפליקציה.

    חשוב לקרוא ל-startActivityForResult() ולא ל-startActivity() כששולחים את הכוונה הזו.

    כפי שמוצג בטבלה 2, המיקום והשם של האפשרות תלויים המאפיינים של המכשיר שבו האפליקציה מותקנת:

    טבלה 2. אפשרות להשבתת מצב תנומה עבור אפליקציה
    מאפייני המכשיר הדף שבו האפשרות מופיעה השם של האפשרות להשבית
    פועלת מערכת Android בגרסה 13 ואילך נתונים מאפליקציות השהיית הפעילות באפליקציה אם אין בה שימוש
    מערכת ההפעלה Android 12 פועלת נתונים מאפליקציות הסרת הרשאות ופינוי נפח אחסון
    פועלת עם Android 11 פרטי האפליקציה > הרשאות הסרת ההרשאות אם האפליקציה לא נמצאת בשימוש
    מערכת ההפעלה Android 6.0 עד Android 10, כולל, מופעל על ידי Google Play שירותים אפליקציית Play > תפריט > Play Protect > הרשאות עבור 'לא בשימוש' אפליקציות הסרת ההרשאות אם האפליקציה לא נמצאת בשימוש

דוגמה לקוד API

הדוגמה הבאה בקוד מראה איך לבדוק אם תנומה תרדמת מופעלת והדרך הנכונה לבקש מהמשתמשים להשבית את מצב תנומה של האפליקציה.

Kotlin
val future: ListenableFuture<Int> =
    PackageManagerCompat.getUnusedAppRestrictionsStatus(context)
future.addListener({ onResult(future.get()) }, ContextCompat.getMainExecutor(context))

fun onResult(appRestrictionsStatus: Int) {
  when (appRestrictionsStatus) {
    // Couldn't fetch status. Check logs for details.
    ERROR -> { }

    // Restrictions don't apply to your app on this device.
    FEATURE_NOT_AVAILABLE -> { }

    // The user has disabled restrictions for your app.
    DISABLED -> { }

    // If the user doesn't start your app for a few months, the system will
    // place restrictions on it. See the API_* constants for details.
    API_30_BACKPORT, API_30, API_31 -> handleRestrictions(appRestrictionsStatus)
  }
}

fun handleRestrictions(appRestrictionsStatus: Int) {
  // If your app works primarily in the background, you can ask the user
  // to disable these restrictions. Check if you have already asked the
  // user to disable these restrictions. If not, you can show a message to
  // the user explaining why permission auto-reset or app hibernation should be
  // disabled. Then, redirect the user to the page in system settings where they
  // can disable the feature.
  val intent = IntentCompat.createManageUnusedAppRestrictionsIntent(context, packageName)

  // You must use startActivityForResult(), not startActivity(), even if
  // you don't use the result code returned in onActivityResult().
  startActivityForResult(intent, REQUEST_CODE)
}

API של פלטפורמה מדור קודם

מערכת ההפעלה כוללת גם API לאינטראקציה עם מצב תנומה . עם זאת, ה-API פועל רק במכשירים עם Android מגרסה 11 ואילך. ה-API לא מטפל בתכונות של תנודת תנומה שהועברו לאחור גרסאות Android. לכן לא מומלץ להשתמש ב-API.

אם אתם צריכים להמשיך להשתמש ב-API באופן זמני למטרות תאימות, תוכלו להיעזר ברשימה הבאה:

הפעלה ידנית של התנהגות במצב תרדמה

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

  1. (Android 12 ואילך בלבד) הפעלת ההתנהגות של מצב תנומה המכשיר:

    adb shell device_config put app_hibernation app_hibernation_enabled true
    
  2. מגדירים את ברירת המחדל של משך הזמן שהמערכת תמתין כדי להיכנס למצב תנומה. כך אפשר לשחזר אותו אחרי הבדיקה:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  3. קיצור משך זמן ההמתנה של המערכת. בדוגמה הבאה, המערכת משתנה כך שהאפליקציה תעבור למצב תרדמה רק שנייה אחת אחרי שתפסיקו את האינטראקציה עם האפליקציה:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  4. מריצים את הפקודה הבאה כדי להמתין לסיום של כל השידורים בזמן האתחול במכשיר הבדיקה:

    adb shell am wait-for-broadcast-idle
    

    בסיום השידור, הפקודה הזו מחזירה את ההודעה: All broadcast queues are idle!

  5. הפעלת תהליך תנומה של האפליקציה באופן ידני:

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  6. (Android מגרסה 12 ואילך בלבד) מוודאים שהאפליקציה נמצאת במצב תנומה, תוך שימוש באחת מהן באחת מהשיטות הבאות:

    • שימו לב שבמכשיר הבדיקה מוצגת עכשיו התראה על כך שאפליקציות שלא בשימוש נמצאות במצב תרדמה.
    • מריצים את הפקודה הבאה:

      adb shell cmd app_hibernation get-state PACKAGE-NAME
      
  7. שחזור ברירת המחדל של משך הזמן שהמערכת ממתינה לפני שהיא מציבה האפליקציה למצב תנומה:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold