पिछले पेज पर वापस जाने के जेस्चर का इस्तेमाल करने की सुविधा जोड़ें

पहली इमेज. फ़ोन पर, पीछे जाने पर झलक दिखाने वाले जेस्चर का मॉकअप

पीछे जाने पर झलक दिखाने की सुविधा, जेस्चर नेविगेशन की एक सुविधा है. इसकी मदद से, उपयोगकर्ता यह देख सकते हैं कि पीछे की ओर स्वाइप करने पर वे कहां जाएंगे.

उदाहरण के लिए, पीछे जाने का जेस्चर इस्तेमाल करने पर, आपके ऐप्लिकेशन के पीछे होम स्क्रीन की ऐनिमेटेड झलक दिख सकती है. जैसा कि पहली इमेज में मॉकअप में दिखाया गया है.

Android 15 से, पीछे जाने पर झलक दिखाने वाले ऐनिमेशन के लिए, डेवलपर के लिए सेटिंग और टूल का विकल्प उपलब्ध नहीं है. सिस्टम के ऐनिमेशन, जैसे कि होम स्क्रीन पर वापस जाना, एक टास्क से दूसरे टास्क पर जाना, और एक गतिविधि से दूसरी गतिविधि पर जाना अब उन ऐप्लिकेशन के लिए दिखते हैं जिन्होंने पीछे जाने पर झलक दिखाने वाले हाथ के जेस्चर की सुविधा चालू की है. यह सुविधा, ऐप्लिकेशन के सभी लेवल या किसी गतिविधि के लेवल पर चालू की जा सकती है.

होम स्क्रीन पर वापस जाने वाले इस ऐनिमेशन की जांच की जा सकती है. इसके बारे में इस पेज के अगले सेक्शन में बताया गया है.

पीछे जाने पर झलक दिखाने वाले जेस्चर की सुविधा के लिए, आपको अपना ऐप्लिकेशन अपडेट करना होगा. इसके लिए, पिछली सुविधाओं के साथ काम करने वाला OnBackPressedCallback AppCompat 1.6.0-alpha05 (AndroidX) या इसके बाद के वर्शन के साथ काम करने वाला एपीआई या नया OnBackInvokedCallback प्लैटफ़ॉर्म एपीआई इस्तेमाल करना होगा. ज़्यादातर ऐप्लिकेशन, AndroidX एपीआई का इस्तेमाल करते हैं, जो पुराने वर्शन के साथ भी काम करता है.

इस अपडेट से, पीछे जाने के लिए किए गए नेविगेशन को सही तरीके से इंटरसेप्ट किया जा सकता है. इसके लिए, KeyEvent.KEYCODE_BACK और onBackPressed वाले किसी भी क्लास से, जैसे कि Activity और Dialog से, पीछे जाने के लिए किए गए इंटरसेप्शन को, सिस्टम के नए बैक एपीआई से बदलना होगा.

कोडलैब और Google I/O का वीडियो

इस पेज पर मौजूद दस्तावेज़ का इस्तेमाल करने के अलावा, हमारा कोडलैब आज़माएं. इसमें, AndroidX Activity APIs का इस्तेमाल करके, पीछे जाने पर झलक दिखाने वाले जेस्चर को हैंडल करने वाले WebView के इस्तेमाल का एक सामान्य उदाहरण दिया गया है.

Google I/O का हमारा वीडियो भी देखा जा सकता है. इसमें, AndroidX और प्लैटफ़ॉर्म एपीआई को लागू करने के अन्य उदाहरण शामिल हैं.

Compose में, पीछे जाने के लिए किए गए कस्टम जेस्चर हैंडल करना

Compose, पीछे जाने के लिए किए गए कस्टम जेस्चर को हैंडल करने के लिए, PredictiveBackHandler कंपोज़ेबल उपलब्ध कराता है. इस एपीआई की मदद से, पीछे जाने के लिए किए गए जेस्चर पर प्रतिक्रिया दी जा सकती है. साथ ही, BackEventCompat ऑब्जेक्ट का Flow उपलब्ध कराया जा सकता है. इसका इस्तेमाल, उपयोगकर्ता के स्वाइप करने पर, कस्टम ऐनिमेशन या ट्रांज़िशन लागू करने के लिए किया जा सकता है.

PredictiveBackHandler(enabled = isBackHandlerEnabled) { progress: Flow<BackEventCompat> ->
    try {
        progress.collect { backEvent ->
            // Update your UI or animation based on backEvent.progress
        }
        // Handle the final back action (e.g., navigate back)
    } catch (e: CancellationException) {
        // Back gesture was cancelled, reset your UI
    }
}

अगर आपको प्रोग्रेस को ट्रैक किए बिना, सिर्फ़ पीछे जाने के लिए किए गए जेस्चर को इंटरसेप्ट करना है, तो इस्तेमाल करें BackHandler.

डिफ़ॉल्ट रूप से, पीछे जाने के लिए किए गए नेविगेशन का इस्तेमाल करने वाले ऐप्लिकेशन को अपडेट करना

पीछे जाने पर झलक दिखाने की सुविधा, डिफ़ॉल्ट रूप से चालू होती है.

अगर आपका ऐप्लिकेशन, फ़्रैगमेंट या नेविगेशन कॉम्पोनेंट का इस्तेमाल करता है, तो उसे AndroidX Activity 1.6.0-alpha05 या इसके बाद के वर्शन पर अपग्रेड करें.

पीछे जाने के लिए किए गए कस्टम नेविगेशन का इस्तेमाल करने वाले ऐप्लिकेशन को अपडेट करना

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

आपका ऐप्लिकेशन, पीछे जाने के लिए किए गए नेविगेशन को कैसे हैंडल करता है माइग्रेशन का सुझाया गया पाथ (इस पेज पर मौजूद लिंक)
AndroidX APIs AndroidX के मौजूदा बैक ऐक्शन को माइग्रेट करना
प्लैटफ़ॉर्म के ऐसे एपीआई जो काम नहीं करते AndroidX के ऐसे ऐप्लिकेशन को AndroidX APIs पर माइग्रेट करना जिनमें, पीछे जाने के लिए किए गए नेविगेशन के ऐसे एपीआई इस्तेमाल किए गए हैं जो काम नहीं करते

AndroidX के बैक नेविगेशन को माइग्रेट करना

यह इस्तेमाल का सबसे सामान्य (और सबसे ज़्यादा सुझाया गया) उदाहरण है. यह उन नए या मौजूदा ऐप्लिकेशन पर लागू होता है जो OnBackPressedDispatcherकी मदद से, जेस्चर नेविगेशन को हैंडल करते हैं. इसके बारे में, पीछे जाने के लिए किए गए कस्टम नेविगेशन की सुविधा उपलब्ध करानालेख में बताया गया है.

यह पक्का करने के लिए कि OnBackPressedDispatcher (जैसे कि फ़्रैगमेंट और नेविगेशन कॉम्पोनेंट) का इस्तेमाल करने वाले एपीआई, पीछे जाने पर झलक दिखाने वाले जेस्चर के साथ आसानी से काम करें, AndroidX Activity 1.6.0-alpha05 पर अपग्रेड करें.

```xml
// In your build.gradle file:
dependencies {

// Add this in addition to your other dependencies
implementation "androidx.activity:activity:1.6.0-alpha05"
```

AndroidX के ऐसे ऐप्लिकेशन को AndroidX APIs पर माइग्रेट करना जिनमें, पीछे जाने के लिए किए गए नेविगेशन के ऐसे एपीआई इस्तेमाल किए गए हैं जो काम नहीं करते

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

काम न करने वाले एपीआई को AndroidX APIs पर माइग्रेट करने के लिए:

  1. पीछे जाने के लिए किए गए सिस्टम के हैंडलिंग लॉजिक को, OnBackPressedCallback के लागू होने के साथ, AndroidX के OnBackPressedDispatcher पर माइग्रेट करें. ज़्यादा जानकारी के लिए, पीछे जाने के लिए किए गए कस्टम नेविगेशन की सुविधा उपलब्ध कराना लेख देखें.

  2. पीछे जाने के लिए किए गए जेस्चर को इंटरसेप्ट करना बंद करने के लिए, OnBackPressedCallback को बंद करें.

  3. OnBackPressed या KeyEvent.KEYCODE_BACK के ज़रिए, पीछे जाने के लिए किए गए इवेंट को इंटरसेप्ट करना बंद करें.

  4. पक्का करें कि आपने AndroidX Activity 1.6.0-alpha05 पर अपग्रेड किया हो.

    // In your build.gradle file:
    dependencies {
    
    // Add this in addition to your other dependencies
    implementation "androidx.activity:activity:1.6.0-alpha05"
    

पीछे जाने पर झलक दिखाने की सुविधा से ऑप्ट आउट करना

ऑप्ट आउट करने के लिए, AndroidManifest.xml में, <application> टैग में, android:enableOnBackInvokedCallback फ़्लैग को false पर सेट करें.

<application
    ...
    android:enableOnBackInvokedCallback="false"
    ... >
...
</application>

इसे 'false' पर सेट करने से, ये काम होते हैं:

  • पीछे जाने पर झलक दिखाने वाले जेस्चर के सिस्टम ऐनिमेशन को बंद कर दिया जाता है.
  • OnBackInvokedCallback को अनदेखा किया जाता है. हालांकि, OnBackPressedCallback कॉल काम करते रहते हैं.

किसी गतिविधि के लेवल पर ऑप्ट आउट करना

android:enableOnBackInvokedCallback फ़्लैग की मदद से, गतिविधि के लेवल पर, पीछे जाने पर झलक दिखाने वाले सिस्टम ऐनिमेशन से ऑप्ट आउट किया जा सकता है. इस बिहेवियर की वजह से, कई गतिविधियों वाले बड़े ऐप्लिकेशन को, पीछे जाने पर झलक दिखाने वाले जेस्चर पर माइग्रेट करना आसान हो जाता है.

यहां दिए गए कोड में, MainActivity से, होम स्क्रीन पर वापस जाने वाले सिस्टम ऐनिमेशन को चालू करने के लिए, enableOnBackInvokedCallback को सेट करने का एक उदाहरण दिखाया गया है:

<manifest ...>
    <application . . .

        android:enableOnBackInvokedCallback="false">

        <activity
            android:name=".MainActivity"
            android:enableOnBackInvokedCallback="true"
            ...
        </activity>
        <activity
            android:name=".SecondActivity"
            android:enableOnBackInvokedCallback="false"
            ...
        </activity>
    </application>
</manifest>

android:enableOnBackInvokedCallback फ़्लैग का इस्तेमाल करते समय, इन बातों का ध्यान रखें:

  • android:enableOnBackInvokedCallback=false को सेट करने पर, पीछे जाने पर झलक दिखाने वाले ऐनिमेशन बंद हो जाते हैं. यह इस बात पर निर्भर करता है कि आपने टैग कहां सेट किया है. यह सुविधा, गतिविधि के लेवल या ऐप्लिकेशन के लेवल पर बंद की जा सकती है. साथ ही, यह सिस्टम को OnBackInvokedCallback प्लैटफ़ॉर्म एपीआई के कॉल को अनदेखा करने का निर्देश देती है. हालांकि, OnBackPressedCallback के कॉल चलते रहते हैं, क्योंकि OnBackPressedCallback पुराने वर्शन के साथ भी काम करता है और onBackPressed एपीआई को कॉल करता है. यह एपीआई, Android 13 से पहले के वर्शन में काम नहीं करता.
  • ऐप्लिकेशन के लेवल पर, enableOnBackInvokedCallback फ़्लैग को सेट करने पर, ऐप्लिकेशन में मौजूद सभी गतिविधियों के लिए डिफ़ॉल्ट वैल्यू सेट हो जाती है. गतिविधि के लेवल पर फ़्लैग सेट करके, हर गतिविधि के लिए डिफ़ॉल्ट वैल्यू को बदला जा सकता है. जैसा कि ऊपर दिए गए कोड के उदाहरण में दिखाया गया है.

कॉल बैक के सबसे सही तरीके

यहां, सिस्टम के बैक कॉल बैक का इस्तेमाल करने के सबसे सही तरीके दिए गए हैं; PredictiveBackHandler या BackHandler (Compose के लिए), OnBackPressedCallback या OnBackInvokedCallback.

यूज़र इंटरफ़ेस (यूआई) की वह स्थिति तय करना जिससे हर कॉल बैक चालू और बंद होता है

यूज़र इंटरफ़ेस (यूआई) की स्थिति एक ऐसी प्रॉपर्टी है जो यूज़र इंटरफ़ेस (यूआई) के बारे में बताती है. हमारा सुझाव है कि आप यह तरीका अपनाएं.

  1. यूज़र इंटरफ़ेस (यूआई) की वह स्थिति तय करें जिससे हर कॉल बैक चालू और बंद होता है.

  2. उस स्थिति को तय करने के लिए, दिखने वाले डेटा होल्डर टाइप का इस्तेमाल करें. जैसे, StateFlow या Compose State. साथ ही, स्थिति में बदलाव होने पर, कॉल बैक को चालू या बंद करें.

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

यूज़र इंटरफ़ेस (यूआई) के लॉजिक के लिए, सिस्टम के बैक कॉल बैक का इस्तेमाल करना

यूज़र इंटरफ़ेस (यूआई) का लॉजिक तय करता है कि यूज़र इंटरफ़ेस (यूआई) को कैसे दिखाया जाए. यूज़र इंटरफ़ेस (यूआई) के लॉजिक को चलाने के लिए, सिस्टम के बैक कॉल बैक का इस्तेमाल करें. जैसे, डायलॉग दिखाना या ऐनिमेशन चलाना.

अगर आपका ऐप्लिकेशन, PRIORITY_DEFAULT या PRIORITY_OVERLAY के साथ OnBackPressedCallback या OnBackInvokedCallback को चालू करता है, तो पीछे जाने पर झलक दिखाने वाले ऐनिमेशन नहीं चलते. साथ ही, आपको पीछे जाने के लिए किए गए इवेंट को हैंडल करना होगा. कारोबार के लॉजिक को चलाने या लॉग करने के लिए, इन कॉल बैक को न बनाएं.

अगर आपका ऐप्लिकेशन, उपयोगकर्ता के पीछे की ओर स्वाइप करने पर, कारोबार के लॉजिक को चलाता है या लॉग करता है, तो यह तरीका अपनाएं:

  • Android 16 और इसके बाद के वर्शन वाले डिवाइसों पर, PRIORITY_SYSTEM_NAVIGATION_OBSERVER के साथ OnBackInvokedCallback का इस्तेमाल करें. इससे, एक ऐसा ऑब्ज़र्वर-कॉल बैक बनता है जो पीछे जाने के लिए किए गए इवेंट का इस्तेमाल नहीं करता. उदाहरण के लिए, जब उपयोगकर्ता रूट ऐक्टिविटी से पीछे की ओर स्वाइप करता है या दूसरे शब्दों में कहें, तो जब उपयोगकर्ता आपका ऐप्लिकेशन छोड़ देता है, तब इस कॉल बैक को रजिस्टर किया जा सकता है. इस मामले में, पीछे जाने के लिए किए गए इवेंट को लॉग किया जा सकता है या कारोबार के अन्य लॉजिक को चलाया जा सकता है. साथ ही, होम स्क्रीन पर वापस जाने वाला ऐनिमेशन अब भी चलेगा.
  • ऐक्टिविटी-टू-ऐक्टिविटी या फ़्रैगमेंट-टू-ऐक्टिविटी के मामलों में, अगर onDestroy में isFinishing की वैल्यू, ऐक्टिविटी लाइफ़साइकल में true है, तो लॉग करें.
  • फ़्रैगमेंट-टू-फ़्रैगमेंट के मामलों में, अगर onDestroy में isRemoving की वैल्यू, फ़्रैगमेंट के व्यू लाइफ़साइकल में 'true' है, तो लॉग करें. इसके अलावा, FragmentManager.OnBackStackChangedListener में, onBackStackChangeStarted या onBackStackChangeCommitted तरीकों का इस्तेमाल करके लॉग करें.
  • Compose के मामले में, Compose डेस्टिनेशन से जुड़े ViewModel के onCleared() कॉल बैक में लॉग करें. यह जानने के लिए सबसे अच्छा सिग्नल है कि Compose डेस्टिनेशन, बैक स्टैक से कब हटाया गया और कब डिस्ट्रॉय हुआ.

एक ही काम के लिए कॉल बैक बनाना

डिस्पैचर में कई कॉल बैक जोड़े जा सकते हैं. कॉल बैक को एक स्टैक में जोड़ा जाता है. इसमें, सबसे आखिर में जोड़ा गया चालू कॉल बैक, पीछे जाने के लिए किए गए अगले जेस्चर को हैंडल करता है. हर जेस्चर के लिए एक कॉल बैक होता है.

अगर किसी कॉल बैक का एक ही काम है, तो उसकी चालू स्थिति को मैनेज करना आसान होता है. उदाहरण के लिए:

स्टैक में कॉलबैक का क्रम.
दूसरी इमेज. कॉल बैक स्टैक का डायग्राम.

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

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

Compose में भी, स्टैक का वही बिहेवियर लागू होता है: सबसे अंदर मौजूद PredictiveBackHandler या BackHandler को प्राथमिकता मिलती है.

इसी तरह, childFragmentManager का कॉल बैक तब चलता है, जब ऊपर मौजूद कॉल बैक बंद हों और इस FragmentManager के लिए बैक स्टैक खाली न हो. इस उदाहरण में, यह इंटरनल कॉल बैक बंद है.

इसी तरह, supportFragmentManager का इंटरनल कॉल बैक तब चलता है, जब ऊपर मौजूद कॉल बैक बंद हों और उसका स्टैक खाली न हो. इस उदाहरण में, यह कॉल बैक तब चलता है, जब उपयोगकर्ता ने फ़ॉर्म में टेक्स्ट नहीं डाला हो. इस वजह से, "क्या आपको पक्का..." कॉल बैक बंद हो जाता है.

आखिर में, अगर ऊपर मौजूद कॉल बैक बंद हैं, तो सिस्टम, पीछे जाने के लिए किए गए जेस्चर को हैंडल करता है. सिस्टम के ऐनिमेशन ट्रिगर करने के लिए, जैसे कि होम स्क्रीन पर वापस जाना, एक टास्क से दूसरे टास्क पर जाना, और एक गतिविधि से दूसरी गतिविधि पर जाना, supportFragmentManager का बैक स्टैक खाली होना चाहिए, ताकि उसका इंटरनल कॉल बैक बंद हो जाए.

पीछे जाने पर झलक दिखाने वाले जेस्चर के ऐनिमेशन की जांच करना

अगर अब भी Android 13 या Android 14 का इस्तेमाल किया जा रहा है, तो पहली इमेज में दिखाए गए, होम स्क्रीन पर वापस जाने वाले ऐनिमेशन की जांच की जा सकती है.

इस ऐनिमेशन की जांच करने के लिए, यह तरीका अपनाएं:

  1. अपने डिवाइस पर, सेटिंग > सिस्टम > डेवलपर के लिए सेटिंग और टूल पर जाएं.

  2. पीछे जाने पर झलक दिखाने वाले ऐनिमेशन चुनें.

  3. अपडेट किया गया ऐप्लिकेशन लॉन्च करें और उसे आज़माने के लिए, पीछे जाने के लिए किए गए जेस्चर का इस्तेमाल करें.