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

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

ההשלכות של מצב תנומה

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

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

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

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

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

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

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. מפעילים את ה-API createManageUnusedAppRestrictionsIntent(), כפי שמוצג בדוגמה של קוד API. ממשק ה-API הזה יוצר כוונה (intent) שגורמת לטעינת המסך פרטי האפליקציה בהגדרות. משם, המשתמש יכול להשבית את מצב ההרדמה של האפליקציה.

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

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

    טבלה 2. אפשרות להשבית את מצב התרדמה של האפליקציה
    מאפייני המכשיר הדף שבו מופיעה האפשרות שם האפשרות שרוצים להשבית
    פועלת מערכת Android בגרסה 13 ואילך נתונים מאפליקציות השהיית הפעילות באפליקציה אם אין בה שימוש
    מערכת ההפעלה Android 12 פועלת נתונים מאפליקציות הסרת הרשאות ופינוי נפח אחסון
    פועלת עם Android 11 פרטי האפליקציה > הרשאות הסרת ההרשאות אם האפליקציה לא נמצאת בשימוש
    פועלת ב-Android מגרסה 6.0 עד 10, כולל, ומופעלת על ידי Google Play Services אפליקציית 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