ऐप्लिकेशन का हाइबरनेशन मोड

अगर आपका ऐप्लिकेशन, Android 11 (एपीआई लेवल 30) या इसके बाद के वर्शन को टारगेट करता है और उपयोगकर्ता कुछ महीनों तक आपके ऐप्लिकेशन का इस्तेमाल नहीं करता है, तो सिस्टम आपके ऐप्लिकेशन को हाइबरनेशन मोड में डाल देता है. सिस्टम, परफ़ॉर्मेंस के बजाय स्टोरेज के लिए बची जगह को ऑप्टिमाइज़ करता है. साथ ही, सिस्टम उपयोगकर्ता के डेटा की सुरक्षा करता है. सिस्टम का यह व्यवहार, उस व्यवहार से मिलता-जुलता है जो तब होता है, जब उपयोगकर्ता सिस्टम सेटिंग से आपके ऐप्लिकेशन को मैन्युअल तरीके से बंद करता है.

हाइबरनेशन के असर

पहली टेबल में दिखाया गया है कि हाइबरनेशन की सुविधा का असर, आपके ऐप्लिकेशन के टारगेट एसडीके वर्शन और उस डिवाइस पर पड़ता है जिस पर आपका ऐप्लिकेशन चल रहा है:

पहली टेबल. ऐप्लिकेशन के हाइबरनेशन मोड में होने पर क्या होता है
टारगेट किए जा रहे एसडीके का वर्शन डिवाइस की विशेषताएं हाइबरनेशन मोड में डालने पर होने वाले असर
Android 12 या उसके बाद का वर्शन Android 12 या इसके बाद के वर्शन पर चलता हो

आपके ऐप्लिकेशन की रनटाइम अनुमतियां रीसेट हो जाती हैं. इस कार्रवाई का असर वैसा ही होता है जैसा तब होता है, जब उपयोगकर्ता सिस्टम सेटिंग में जाकर अनुमति देखता है और आपके ऐप्लिकेशन के ऐक्सेस लेवल को अस्वीकार करें पर सेट करता है.

आपका ऐप्लिकेशन, बैकग्राउंड में टास्क या सूचनाएं नहीं दिखा सकता.

आपका ऐप्लिकेशन पुश नोटिफ़िकेशन नहीं पा सकता. इनमें Firebase Cloud Messaging के ज़रिए भेजे गए सबसे ज़रूरी मैसेज भी शामिल हैं.

आपके ऐप्लिकेशन के कैश मेमोरी में मौजूद सभी फ़ाइलें हटा दी जाती हैं.

Android 11 Android 11 पर चलता हो आपके ऐप्लिकेशन की रनटाइम अनुमतियां रीसेट हो जाती हैं.
Android 11 Android 6.0 (एपीआई लेवल 23) से लेकर Android 10 (एपीआई लेवल 29) तक के वर्शन पर काम करता हो और Google Play services के साथ काम करता हो

आपके ऐप्लिकेशन की रनटाइम अनुमतियां रीसेट हो जाती हैं.

यह बदलाव दिसंबर 2021 से लागू होगा. अनुमतियों को अपने-आप रीसेट होने की सुविधा को अरबों और डिवाइसों के लिए उपलब्ध कराने के बारे में इस ब्लॉग पोस्ट में ज़्यादा जानें.

जब कोई ऐप्लिकेशन हाइबरनेशन मोड से बाहर निकलता है, तब सिस्टम का व्यवहार

जब उपयोगकर्ता अगली बार आपके ऐप्लिकेशन का इस्तेमाल करेगा, तब आपका ऐप्लिकेशन हाइबरनेशन मोड से बाहर आ जाएगा. इसके बाद, यह फिर से टास्क, सूचनाएं, और सूचनाएं बना सकता है.

हालांकि, सिस्टम आपके ऐप्लिकेशन के लिए ये काम नहीं करता:

  1. अपने ऐप्लिकेशन को रनटाइम की अनुमतियां फिर से दें.

    उपयोगकर्ता को आपके ऐप्लिकेशन के लिए, इन अनुमतियों को फिर से देना होगा.

  2. उन सभी कामों, सूचनाओं, और सूचनाओं को फिर से शेड्यूल करें जिन्हें ऐप्लिकेशन के हाइबरनेट होने से पहले शेड्यूल किया गया था.

    इस वर्कफ़्लो को आसानी से लागू करने के लिए, WorkManager का इस्तेमाल करें. ACTION_BOOT_COMPLETED ब्रॉडकास्ट रिसीवर में, टास्क को फिर से शेड्यूल करने का लॉजिक भी जोड़ा जा सकता है. यह लॉजिक तब लागू होता है, जब आपका ऐप्लिकेशन हाइबरनेशन मोड से बाहर आता है और डिवाइस बूट अप हो जाता है.

ऐप्लिकेशन का उपयोग

यहां दिए गए सेक्शन में, ऐप्लिकेशन के इस्तेमाल के उदाहरण दिए गए हैं. साथ ही, उन कार्रवाइयों के उदाहरण भी दिए गए हैं जिन्हें सिस्टम, ऐप्लिकेशन का इस्तेमाल नहीं मानता.

ऐप्लिकेशन के इस्तेमाल के उदाहरण

जब आपके ऐप्लिकेशन में कोई गतिविधि फिर से शुरू होती है, तो सिस्टम इस इवेंट को उपयोगकर्ता इंटरैक्शन मानता है. इसलिए, सिस्टम आपके ऐप्लिकेशन को हाइबरनेट होने में ज़्यादा समय देता है.

Android 11 और इसके बाद के वर्शन में, इन गतिविधियों को भी उपयोगकर्ता के इंटरैक्शन माना जाता है:

  • उपयोगकर्ता, विजेट से इंटरैक्ट करता है.
  • उपयोगकर्ता, सूचना को खारिज करने के अलावा, किसी सूचना से इंटरैक्ट करता है.

ध्यान दें कि हाइबरनेशन के लिए ऐप्लिकेशन के इस्तेमाल के लिए, उपयोगकर्ता के इंटरैक्शन की ज़रूरत नहीं होती. जब तक पैकेज का कोई कॉम्पोनेंट चालू रहता है, तब तक उसे ऐप्लिकेशन का इस्तेमाल माना जाता है. इसके कुछ उदाहरण यहां दिए गए हैं:

  • ऐसे ऐप्लिकेशन जो डिवाइस पर मौजूद किसी दूसरे ऐप्लिकेशन या ओएस से सेवा या कॉन्टेंट पाने के लिए जुड़े हुए हैं. उदाहरण के लिए, इनपुट के तरीके का संपादक (आईएमई) या पासवर्ड मैनेजर.
  • पैकेज में मौजूद ब्रॉडकास्ट रिसीवर, किसी बाहरी पैकेज से साफ़ तौर पर ब्रॉडकास्ट पा रहे हैं.

उदाहरण नहीं

अगर आपका ऐप्लिकेशन सिर्फ़ यहां दी गई सूची में बताए गए व्यवहार दिखाता है, तो कुछ महीनों बाद वह हाइबरनेशन मोड में चला जाता है:

सिस्टम को हाइबरनेट होने से छूट देना

Android, इस्तेमाल के कुछ उदाहरणों में सिस्टम-लेवल पर ऐप्लिकेशन के हाइबरनेशन मोड से छूट देता है. अगर आपका ऐप्लिकेशन इनमें से किसी एक कैटगरी में आता है, तो उसे ऐप्लिकेशन के इस्तेमाल से जुड़े मानकों से छूट मिलती है. साथ ही, वह हाइबरनेट नहीं होगा.

लॉन्चर पर ऐप्लिकेशन नहीं दिख रहे हैं
ऐसा कोई भी ऐप्लिकेशन जिसकी शॉर्टकट टाइल, लॉन्चर पर चालू नहीं है.
वर्क प्रोफ़ाइल वाले ऐप्लिकेशन
कोई भी ऐसा ऐप्लिकेशन जिसे उपयोगकर्ता ने वर्क प्रोफ़ाइल पर इंस्टॉल किया हो. ध्यान दें कि अगर वही ऐप्लिकेशन निजी प्रोफ़ाइल पर भी मौजूद है, तो सिर्फ़ वर्क प्रोफ़ाइल वाले ऐप्लिकेशन को छूट मिलेगी.
डिवाइस नीति नियंत्रक
ऐसे ऐप्लिकेशन जो डिवाइसों पर डिवाइस की स्थानीय नीतियां और सिस्टम ऐप्लिकेशन को कंट्रोल करते हैं.
मोबाइल और इंटरनेट सेवा देने वाली कंपनी के खास ऐप्लिकेशन
मोबाइल और इंटरनेट सेवा देने वाली कंपनियां, डिवाइसों पर पहले से लोड किए गए किसी भी ऐप्लिकेशन को शामिल कर सकती हैं. साथ ही, वे ऐसे ऐप्लिकेशन को भी शामिल कर सकती हैं जो अनुबंध के तहत सेवा देने की उनकी ज़िम्मेदारियों को पूरा करने के लिए ज़रूरी हैं. उदाहरण के लिए, वॉइसमेल या ग्राहक सेवा वाले ऐप्लिकेशन.
तीसरे पक्ष के इंस्टॉलर ऐप्लिकेशन
तीसरे पक्ष के ऐप्लिकेशन स्टोर, इंस्टॉल किए गए ऐप्लिकेशन को ज़रूरी होने पर अपने-आप अपडेट करते हैं.

उपयोगकर्ता के लिए, हाइबरनेशन मोड से जुड़ी छूट

अगर आपको लगता है कि आपके ऐप्लिकेशन के मुख्य इस्तेमाल के उदाहरण पर हाइबरनेशन का असर पड़ा है, तो उपयोगकर्ता से ऐप्लिकेशन को हाइबरनेट न करने का अनुरोध किया जा सकता है. यह छूट उन स्थितियों में काम आती है जब उपयोगकर्ता को उम्मीद होती है कि आपका ऐप्लिकेशन मुख्य रूप से बैकग्राउंड में काम करेगा. भले ही, उपयोगकर्ता आपके ऐप्लिकेशन के साथ इंटरैक्ट न कर रहा हो. जैसे, जब आपका ऐप्लिकेशन इनमें से कोई काम करता है:

  • परिवार के सदस्यों की जगह की जानकारी समय-समय पर शेयर करके, उन्हें सुरक्षित रखें.
  • किसी डिवाइस और आपके ऐप्लिकेशन के सर्वर के बीच डेटा सिंक करना.
  • स्मार्ट डिवाइसों, जैसे कि टीवी से इंटरैक्ट करना.
  • स्मार्टवॉच जैसे साथी डिवाइसों से कनेक्ट करें.

छूट पाने का अनुरोध करने के लिए, यहां दिए गए चरणों को पूरा करें.

देखें कि उपयोगकर्ता ने आपके ऐप्लिकेशन के लिए, हाइबरनेशन की सुविधा पहले ही बंद कर दी है या नहीं

यह देखने के लिए कि उपयोगकर्ता ने आपके ऐप्लिकेशन के लिए, हाइबरनेशन की सुविधा पहले ही बंद कर दी है या नहीं, getUnusedAppRestrictionsStatus() एपीआई का इस्तेमाल करें.

अपने ऐप्लिकेशन में इस एपीआई का इस्तेमाल करने के तरीके के बारे में ज़्यादा जानने के लिए, इस पेज पर एपीआई कोड का उदाहरण देखें.

उपयोगकर्ता से, आपके ऐप्लिकेशन के लिए हाइबरनेशन की सुविधा बंद करने के लिए कहें

अगर उपयोगकर्ता ने आपके ऐप्लिकेशन के लिए, हाइबरनेशन की सुविधा पहले से बंद नहीं की है, तो उसे अनुरोध भेजा जा सकता है. इसके लिए, यह तरीका अपनाएं:

  1. ऐसा यूज़र इंटरफ़ेस (यूआई) दिखाएं जिसमें उपयोगकर्ता को यह बताया गया हो कि उसे आपके ऐप्लिकेशन के लिए, हाइबरनेशन की सुविधा बंद क्यों करनी चाहिए.
  2. createManageUnusedAppRestrictionsIntent() एपीआई को कॉल करें. इसके लिए, एपीआई कोड के उदाहरण में दिया गया तरीका अपनाएं. यह एपीआई एक इंटेंट बनाता है. इससे सेटिंग में ऐप्लिकेशन की जानकारी स्क्रीन लोड होती है. यहां से, उपयोगकर्ता आपके ऐप्लिकेशन के लिए हाइबरनेशन की सुविधा बंद कर सकता है.

    इस इंटेंट को भेजते समय, आपको startActivityForResult() को कॉल करना होगा, न कि startActivity() को.

    टेबल 2 में दिखाए गए तरीके से, विकल्प की जगह और नाम इस बात पर निर्भर करता है कि आपका ऐप्लिकेशन किस डिवाइस पर इंस्टॉल किया गया है:

    टेबल 2. यह विकल्प, आपके ऐप्लिकेशन के लिए हाइबरनेशन मोड बंद करता है
    डिवाइस की विशेषताएं वह पेज जहां विकल्प दिखता है बंद किए जाने वाले विकल्प का नाम
    Android 13 या इसके बाद के वर्शन पर चलता हो ऐप्लिकेशन की जानकारी इस्तेमाल न होने पर, ऐप्लिकेशन की गतिविधि रोकें
    Android 12 पर काम करता हो ऐप्लिकेशन की जानकारी अनुमतियां हटाएं और स्टोरेज खाली करें
    Android 11 पर चलता हो ऐप्लिकेशन की जानकारी > अनुमतियाँ अगर ऐप्लिकेशन इस्तेमाल नहीं किया गया है, तो अनुमतियां हटाएं
    Android 6.0 से लेकर Android 10 तक के वर्शन पर काम करता हो और Google Play services के साथ काम करता हो Play ऐप्लिकेशन > मेन्यू > Play Protect > इस्तेमाल न किए गए ऐप्लिकेशन के लिए अनुमतियां अगर ऐप्लिकेशन इस्तेमाल नहीं किया गया है, तो अनुमतियां हटाएं

एपीआई कोड का उदाहरण

इस कोड के उदाहरण में बताया गया है कि यह कैसे पता लगाया जाए कि आपके ऐप्लिकेशन के लिए हाइबरनेशन की सुविधा चालू है या नहीं. साथ ही, इसमें उपयोगकर्ताओं से अपने ऐप्लिकेशन के लिए हाइबरनेशन की सुविधा बंद करने का सही तरीका बताया गया है.

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)
}

लेगसी प्लैटफ़ॉर्म एपीआई

ऑपरेटिंग सिस्टम में, हाइबरनेशन की सुविधा के साथ इंटरैक्ट करने के लिए एक एपीआई भी शामिल होता है. हालांकि, यह एपीआई सिर्फ़ Android 11 या इसके बाद के वर्शन पर काम करता है. यह एपीआई, हाइबरनेशन की उन सुविधाओं को मैनेज नहीं करता जिन्हें Android के पुराने वर्शन पर वापस लाया गया है. इसलिए, हमारा सुझाव है कि एपीआई का इस्तेमाल न करें.

अगर आपको कुछ समय के लिए एपीआई का इस्तेमाल जारी रखना है, ताकि यह अन्य सिस्टम के साथ काम कर सके, तो यहां दिए गए तरीके से इसका इस्तेमाल करें:

  • यह देखने के लिए कि आपके ऐप्लिकेशन के लिए हाइबरनेशन की सुविधा बंद है या नहीं: isAutoRevokeWhitelisted()
  • उपयोगकर्ता को हाइबरनेशन की सेटिंग वाले पेज पर भेजने के लिए: ACTION_APPLICATION_DETAILS_SETTINGS का इस्तेमाल करके इंटेंट बनाएं

मैन्युअल तरीके से हाइबरनेशन की सुविधा चालू करना

सिस्टम के आपके ऐप्लिकेशन को हाइबरनेशन मोड में रखने के बाद, यह देखने के लिए कि आपका ऐप्लिकेशन कैसा काम करता है, यह तरीका अपनाएं:

  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