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

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

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

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

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

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

पीछे जाने पर झलक दिखाने वाले जेस्चर की सुविधा के लिए, आपको अपना ऐप्लिकेशन अपडेट करना होगा. इसके लिए, AndroidX Activity 1.6.0 या इसके बाद के वर्शन वाले एपीआई में, पीछे की ओर ले जाने वाले OnBackPressedCallback का इस्तेमाल करें या नए 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 का इस्तेमाल करने के लिए, पक्का करें कि आपके ऐप्लिकेशन में androidx.activity:activity-compose डिपेंडेंसी (वर्शन 1.8.0 या उसके बाद का वर्शन) शामिल हो:

// In your build.gradle.kts file:
dependencies {
    implementation("androidx.activity:activity-compose:1.8.0")
}

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 या इसके बाद के वर्शन पर भी अपग्रेड करें.

कस्टम बैक नेविगेशन का इस्तेमाल करने वाले ऐप्लिकेशन को अपडेट करना

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

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

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

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

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

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

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

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

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

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

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

  3. OnBackPressed या KeyEvent.KEYCODE_BACK का इस्तेमाल करके, बैक इवेंट को इंटरसेप्ट करना बंद करें.

  4. AndroidX Activity 1.6.0 या इसके बाद के वर्शन पर अपग्रेड करना न भूलें.

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

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

ऑप्ट आउट करने के लिए, 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 के साथ चालू करता है, तो पीछे जाने पर झलक दिखाने वाला हाथ का जेस्चर ऐनिमेशन काम नहीं करते. ऐसे में, आपको बैक इवेंट को मैनेज करना होगा. कारोबारी नियमों को चलाने या लॉग करने के लिए, इन कॉलबैक को न बनाएं.

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

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

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

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

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

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

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

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

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

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

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

Android 13 या Android 14 पर काम करने वाले डिवाइसों पर, डेवलपर विकल्प चालू किया जा सकता है. इससे, आपको वापस होम स्क्रीन पर जाने का ऐनिमेशन टेस्ट करने का विकल्प मिलता है. यह ऐनिमेशन, इमेज 1 में दिखाया गया है:

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

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

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