वापस जाने के लिए कस्टम नेविगेशन की सुविधा दें

उपयोगकर्ता बैक नेविगेशन का इस्तेमाल करके, स्क्रीन पर पीछे की ओर नेविगेट करते हैं. ज़्यादातर Android डिवाइसों में, फ़िज़िकल, सॉफ़्टवेयर या जेस्चर-आधारित बैक बटन होता है. आम तौर पर, आपको अपने ऐप्लिकेशन में 'वापस जाएं' बटन नहीं जोड़ना चाहिए. हालांकि, Android Automotive OS (AAOS) डिवाइसों के साथ काम करने वाले मोड में, 'वापस जाएं' बटन का इस्तेमाल सिस्टम करता है. यह नेविगेशन को मैनेज करता है, इसलिए आपको अपना नेविगेशन जोड़ने की ज़रूरत नहीं है. ज़्यादा जानकारी के लिए, AAOS के साथ काम करने वाला मोड लेख पढ़ें.

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

कस्टम 'वापस जाएं' नेविगेशन लागू करना

ComponentActivity, FragmentActivity और AppCompatActivity के लिए बुनियादी क्लास है. इसकी मदद से, OnBackPressedDispatcher का इस्तेमाल करके, 'वापस जाएं' बटन के काम करने के तरीके को कंट्रोल किया जा सकता है. OnBackPressedDispatcher को getOnBackPressedDispatcher() को कॉल करके वापस लाया जा सकता है.

OnBackPressedDispatcher यह कंट्रोल करता है कि बैक बटन के इवेंट, एक या एक से ज़्यादा OnBackPressedCallback ऑब्जेक्ट पर कैसे भेजे जाते हैं. OnBackPressedCallback के कन्स्ट्रक्टर में, चालू होने की शुरुआती स्थिति के लिए एक बूलियन लिया जाता है. सिर्फ़ तब, जब कॉलबैक की सुविधा चालू हो (यानी, isEnabled() true दिखाता है) तो ही डिस्पैचर, 'वापस जाएं' बटन के इवेंट को मैनेज करने के लिए, कॉलबैक के handleOnBackPressed() को कॉल करेगा. setEnabled() को कॉल करके, चालू होने की स्थिति बदली जा सकती है.

कॉलबैक, addCallback तरीकों से जोड़े जाते हैं. हमारा सुझाव है कि आप addCallback() के उस तरीके का इस्तेमाल करें जिसमें LifecycleOwner का इस्तेमाल किया जाता है. इससे यह पक्का होता है कि OnBackPressedCallback सिर्फ़ तब जोड़ा जाता है, जब LifecycleOwner का वैल्यू Lifecycle.State.STARTED हो. रजिस्टर किए गए कॉलबैक को ऐक्टिविटी तब भी हटा देती है, जब उनसे जुड़ा LifecycleOwner खत्म हो जाता है. इससे मेमोरी लीक होने से रोका जा सकता है. साथ ही, इसे फ़्रैगमेंट या लाइफ़साइकल के ऐसे मालिकों के साथ इस्तेमाल किया जा सकता है जिनका लाइफ़टाइम, ऐक्टिविटी से कम होता है.

कॉलबैक लागू करने का उदाहरण यहां दिया गया है:

Kotlin

class MyFragment : Fragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // This callback will only be called when MyFragment is at least Started.
        val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
            // Handle the back button event
        }

        // The callback can be enabled or disabled here or in the lambda
    }
    ...
}

Java

public class MyFragment extends Fragment {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // This callback will only be called when MyFragment is at least Started.
        OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
            @Override
            public void handleOnBackPressed() {
                // Handle the back button event
            }
        };
        requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);

        // The callback can be enabled or disabled here or in handleOnBackPressed()
    }
    ...
}

addCallback() की मदद से, एक से ज़्यादा कॉलबैक दिए जा सकते हैं. ऐसा करने पर, कॉलबैक उसी क्रम में ट्रिगर किए जाते हैं जिस क्रम में उन्हें जोड़ा गया है - आखिर में जोड़ा गया कॉलबैक, सबसे पहले बैक बटन इवेंट को मैनेज करने का मौका पाता है. उदाहरण के लिए, अगर आपने one, two, और three नाम के तीन कॉलबैक को क्रम से जोड़ा है, तो उन्हें three, two, और one के क्रम में शुरू किया जाएगा.

कॉलबैक, ज़िम्मेदारी की चेन पैटर्न का पालन करते हैं. चेन में मौजूद हर कॉलबैक को सिर्फ़ तब ट्रिगर किया जाता है, जब उससे पहले का कॉलबैक चालू न हो. इसका मतलब है कि ऊपर दिए गए उदाहरण में, कॉलबैक two सिर्फ़ तब ट्रिगर होगा, जब कॉलबैक three चालू न हो. कॉलबैक one सिर्फ़ तब लागू होगा, जब कॉलबैक two चालू न हो.

ध्यान दें कि addCallback() के ज़रिए जोड़े जाने पर, कॉलबैक को ज़िम्मेदारी की चेन में तब तक नहीं जोड़ा जाता, जब तक कि LifecycleOwner Lifecycle.State.STARTED स्थिति में न आ जाए.

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

हालांकि, अगर आपको OnBackPressedCallback को पूरी तरह से हटाना है, तो आपको remove() को कॉल करना चाहिए. हालांकि, आम तौर पर ऐसा करने की ज़रूरत नहीं होती, क्योंकि जब उनसे जुड़ा LifecycleOwner नष्ट हो जाता है, तो कॉलबैक अपने-आप हट जाते हैं.

गतिविधि onBackPressed()

अगर बैक बटन इवेंट को मैनेज करने के लिए, onBackPressed() का इस्तेमाल किया जा रहा है, तो हमारा सुझाव है कि आप इसके बजाय OnBackPressedCallback का इस्तेमाल करें. हालांकि, अगर आपने यह बदलाव नहीं किया है, तो ये नियम लागू होंगे:

  • super.onBackPressed() को कॉल करने पर, addCallback के ज़रिए रजिस्टर किए गए सभी कॉलबैक का आकलन किया जाता है.
  • Android 12 (एपीआई लेवल 32) और उससे पहले के वर्शन में, onBackPressed को हमेशा कॉल किया जाता है. भले ही, OnBackPressedCallback के रजिस्टर किए गए किसी भी इंस्टेंस का इस्तेमाल किया जा रहा हो.