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

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

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

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

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

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

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

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

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

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 מעניקה פטורים ברמת המערכת ממצב תנומה של האפליקציה. אם האפליקציה שלך שייכת לאחת מהקטגוריות הבאות, היא פטורה מתקני השימוש באפליקציות, ולא תחול חורף.

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

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

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

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

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

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

כדי לבדוק אם המשתמש כבר השבית את מצב תנומה עבור האפליקציה: להשתמש בgetUnusedAppRestrictionsStatus() API.

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

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

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

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

    חשוב להתקשר אל startActivityForResult(), ולא startActivity(), כששולחים את Intent.

    כפי שמוצג בטבלה 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