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

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

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

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

टेबल 1. आपके ऐप्लिकेशन पर हाइबरनेशन के असर
टारगेट SDK टूल का वर्शन डिवाइस की विशेषताएं हाइबरनेशन इफ़ेक्ट
Android 12 या इसके बाद वाला वर्शन Android 12 या इसके बाद वाले वर्शन पर चलता हो

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

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

आपके ऐप्लिकेशन को पुश नोटिफ़िकेशन नहीं मिल सकते. इनमें ज़्यादा प्राथमिकता वाले ऐप्लिकेशन भी शामिल हैं इसके ज़रिए भेजे जाने वाले मैसेज Firebase क्लाउड मैसेज सेवा.

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

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 और उसके बाद वाले वर्शन पर, ये सुविधाएं भी मिलती हैं इन्हें यूज़र इंटरैक्शन माना जाता है:

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

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

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

गैर-उदाहरण

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

सिस्टम को हाइबरनेशन मोड से बाहर रखना

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

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

उपयोगकर्ताओं को हाइबरनेशन मोड से छूट

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

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

छूट का अनुरोध करने के लिए, नीचे दिए गए सेक्शन में दिए गए निर्देशों का पालन करें.

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

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

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

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

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

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

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

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

    टेबल 2. विकल्प जो आपके डिवाइस के लिए हाइबरनेशन को बंद करता है ऐप्लिकेशन
    डिवाइस की विशेषताएं वह पेज जहां यह विकल्प दिखता है बंद करने के लिए विकल्प का नाम
    Android 13 या इसके बाद वाले वर्शन पर चलता हो ऐप्लिकेशन की जानकारी इस्तेमाल न होने पर, ऐप्लिकेशन में की जाने वाली गतिविधि रोकना
    Android 12 पर चलता है ऐप्लिकेशन की जानकारी अनुमतियां हटाएं और जगह खाली करें
    Android 11 पर चलता है ऐप्लिकेशन की जानकारी > अनुमतियां ऐप्लिकेशन इस्तेमाल न होने पर अनुमतियां हटाना
    जो Android 6.0 से लेकर Android 10 तक के वर्शन पर काम करता है. Google Play की ओर से सेवाएं 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