गतिविधि के डेस्टिनेशन

आपके नेविगेशन ग्राफ़ में, डेस्टिनेशन को कोई गतिविधि माना जा सकता है. हालांकि, यह सबसे अच्छा है कोई एक गतिविधि होती है, तो ऐप्लिकेशन अक्सर अलग-अलग ऐप्लिकेशन में अलग-अलग कॉम्पोनेंट या स्क्रीन के लिए अलग-अलग गतिविधियां. Gemini पर आपकी गतिविधि डेस्टिनेशन ऐसे मामलों में फ़ायदेमंद साबित हो सकते हैं.

Compose और Kotlin DSL

अपने नेविगेशन ग्राफ़ में गतिविधि का डेस्टिनेशन जोड़ना ज़रूरी है फ़्रैगमेंट के साथ Kotlin DSL का इस्तेमाल करते समय, दोनों फ़ॉर्मैट में. ऐसा इसलिए है, क्योंकि अपने NavGraph को अपने NavHost कंपोज़ेबल में पास करने पर, createGraph() लैम्डा.

ज़्यादा जानकारी के लिए, Kotlin की मदद से प्रोग्राम के हिसाब से ग्राफ़ बनाना DSL.

XML

गतिविधि का डेस्टिनेशन बनाना, फ़्रैगमेंट बनाने जैसा ही है गंतव्य. हालांकि, गतिविधि गंतव्य की प्रकृति काफ़ी अलग हैं.

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

गतिविधि का डेस्टिनेशन जोड़ने के लिए, Activity डेस्टिनेशन के साथ उसकी जानकारी दें पूरी तरह क्वालिफ़ाइड क्लास का नाम:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/navigation_graph"
    app:startDestination="@id/simpleFragment">

    <activity
        android:id="@+id/sampleActivityDestination"
        android:name="com.example.android.navigation.activity.DestinationActivity"
        android:label="@string/sampleActivityTitle" />
</navigation>

यह एक्सएमएल, startActivity() को दिए गए कॉल के बराबर है:

Kotlin

startActivity(Intent(context, DestinationActivity::class.java))

Java

startActivity(new Intent(context, DestinationActivity.class));

कुछ मामलों में, ऐसा भी हो सकता है कि यह तरीका सही न हो. उदाहरण के लिए, आपके शायद आपकी ऐक्टिविटी क्लास पर कंपाइल-टाइम डिपेंडेंसी न हो या इंप्लिसिट इंटेंट के ज़रिए जाने के लिए, इनडायरेक्ट लेवल को प्राथमिकता दी जाती है. कॉन्टेंट बनाने Activity डेस्टिनेशन की मेनिफ़ेस्ट एंट्री में intent-filter तय करता है कि आपको Activity डेस्टिनेशन को कैसे स्ट्रक्चर करना है.

उदाहरण के लिए, यहां दी गई मेनिफ़ेस्ट फ़ाइल देखें:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.navigation.activity">
    <application>
        <activity android:name=".DestinationActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <data
                    android:host="example.com"
                    android:scheme="https" />
                <category android:name="android.intent.category.BROWSABLE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>

इससे जुड़े Activity डेस्टिनेशन को कॉन्फ़िगर करना ज़रूरी है action और data एट्रिब्यूट, मेनिफ़ेस्ट एंट्री में मौजूद एट्रिब्यूट से मेल खाते हैं:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/navigation_graph"
    app:startDestination="@id/simpleFragment">
    <activity
        android:id="@+id/localDestinationActivity"
        android:label="@string/localActivityTitle"
        app:action="android.intent.action.VIEW"
        app:data="https://example.com"
        app:targetPackage="${applicationId}" />
</navigation>

targetPackage को मौजूदा applicationId में तय करने से, मौजूदा ऐप्लिकेशन का स्कोप जिसमें मुख्य ऐप्लिकेशन शामिल हो.

यह तरीका उन मामलों में भी इस्तेमाल किया जा सकता है जहां किसी खास ऐप्लिकेशन को गंतव्य. नीचे दिए गए उदाहरण में, डेस्टिनेशन को एक ऐसा ऐप्लिकेशन बताया गया है जिसमें com.example.android.another.app में से applicationId आइटम.

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/navigation_graph"
    app:startDestination="@id/simpleFragment">
    <activity
        android:id="@+id/localDestinationActivity"
        android:label="@string/localActivityTitle"
        app:action="android.intent.action.VIEW"
        app:data="https://example.com"
        app:targetPackage="com.example.android.another.app" />
</navigation>

डाइनैमिक आर्ग्युमेंट

पिछले उदाहरणों में, डेस्टिनेशन पर जाने के लिए तय यूआरएल का इस्तेमाल किया गया था. आप भी डाइनैमिक यूआरएल का इस्तेमाल करना होगा जहां अतिरिक्त जानकारी यूआरएल. उदाहरण के लिए, यूज़र आईडी को इससे मिलते-जुलते फ़ॉर्मैट में भी भेजा जा सकता है https://example.com?userId=<actual user ID>.

इस मामले में, data एट्रिब्यूट के बजाय, dataPattern का इस्तेमाल करें. इसके बाद, नाम वाले प्लेसहोल्डर की जगह इस्तेमाल किए जाने वाले आर्ग्युमेंट दिए जा सकते हैं dataPattern वैल्यू:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/navigation_graph"
    app:startDestination="@id/simpleFragment">
    <activity
        android:id="@+id/localDestinationActivity"
        android:label="@string/localActivityTitle"
        app:action="android.intent.action.VIEW"
        app:dataPattern="https://example.com?userId={userId}"
        app:targetPackage="com.example.android.another.app">
        <argument
            android:name="userId"
            app:argType="string" />
    </activity>
</navigation>

इस उदाहरण में, Safe Args में से किसी एक का इस्तेमाल करके, userId वैल्यू तय की जा सकती है या Bundle के साथ:

Kotlin

navController.navigate(
    R.id.localDestinationActivity,
    bundleOf("userId" to "someUser")
)

Java

Bundle args = new Bundle();
args.putString("userId", "someUser");
navController.navigate(R.id.localDestinationActivity, args);

यह उदाहरण someUser को {userId} से बदल देता है और एक यूआरआई मान बनाता है https://example.com?userId=someUser.