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

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

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

Compose में कस्टम बैक नेविगेशन लागू करना

Jetpack Compose में, BackHandler कंपोज़ेबल का इस्तेमाल करके, पिछले पेज पर वापस जाने के लिए कस्टम नेविगेशन को मैनेज किया जा सकता है.

Navigation Compose का इस्तेमाल करते समय, पिछली ऐक्टिविटी पर जाने के लिए आम तौर पर NavController.navigateUp() या NavController.popBackStack() का इस्तेमाल किया जाता है. हालांकि, BackHandler उन मामलों में काम आता है जहां आपको उपयोगकर्ता के सिस्टम के बैक बटन दबाने या बैक जेस्चर का इस्तेमाल करने पर, कस्टम व्यवहार लागू करना होता है. उदाहरण के लिए, अगर आपके ऐप्लिकेशन में WebView दिखाया जा रहा है, तो हो सकता है कि आप उपयोगकर्ताओं को सिस्टम के 'वापस जाएं' बटन को दबाने पर, ब्राउज़िंग इतिहास पर वापस जाने की अनुमति देना चाहें.

अगर आपने कंपोज़ेबल ट्री के अलग-अलग लेवल पर, एक से ज़्यादा BackHandler कंपोज़ेबल चालू किए हैं, तो सबसे अंदरूनी कंपोज़ेबल ही वापस जाने के इवेंट को इंटरसेप्ट करेगा.

Views की मदद से, कस्टम बैक नेविगेशन लागू करना

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

OnBackPressedDispatcher यह कंट्रोल करता है कि बैक बटन के इवेंट, एक या उससे ज़्यादा OnBackPressedCallback ऑब्जेक्ट को कैसे भेजे जाते हैं. OnBackPressedCallback के कंस्ट्रक्टर में, चालू की गई शुरुआती स्थिति के लिए बूलियन वैल्यू होती है. जब कोई कॉलबैक चालू होता है, तब ही डिसपैचर, कॉलबैक के handleOnBackPressed() को कॉल करेगा. उदाहरण के लिए, जब 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 चालू न हो. Callback one को सिर्फ़ तब शुरू किया जाएगा, जब callback two चालू नहीं होगा. इसी तरह, अन्य सुविधाएं भी काम करेंगी.

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

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

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