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

पहली इमेज. फ़ोन पर, अनुमान लगाकर बैक जेस्चर की सुविधा के काम करने का मॉकअप

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

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

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

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

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

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

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

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

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

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 API AndroidX बैक पोर्टिंग के मौजूदा वर्शन को माइग्रेट करना
ऐसे प्लैटफ़ॉर्म एपीआई जिनका इस्तेमाल नहीं किया जा सकता AndroidX के ऐसे ऐप्लिकेशन को AndroidX API पर माइग्रेट करना जिनमें बैक नेविगेशन के लिए काम न करने वाले एपीआई शामिल हैं

AndroidX बैक नेविगेशन को लागू करने की सुविधा माइग्रेट करना

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

यह पक्का करने के लिए कि OnBackPressedDispatcher का इस्तेमाल करने वाले एपीआई (जैसे कि फ़्रैगमेंट और नेविगेशन कॉम्पोनेंट), पीछे जाने पर झलक दिखाने वाले जेस्चर के साथ आसानी से काम करें, 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"
}

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

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

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

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

  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>

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

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

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

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

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

<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. observable data holder type का इस्तेमाल करके, उस स्थिति को तय करें. जैसे, StateFlow या Compose State. इसके बाद, स्थिति में बदलाव होने पर कॉलबैक को चालू या बंद करें.

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

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

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

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

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

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

सिंगल रिस्पॉन्सबिलिटी वाले कॉलबैक बनाना

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

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

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

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

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

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

इसी तरह, अगर पहले के कॉलबैक बंद हैं और इस FragmentManager की पिछली गतिविधियां खाली नहीं हैं, तो childFragmentManager का कॉलबैक चलता है. इस उदाहरण में, इस इंटरनल कॉलबैक को बंद कर दिया गया है.

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

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

प्रिडिक्टिव बैक जेस्चर ऐनिमेशन की जांच करना

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

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

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

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

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