आपके नेविगेशन ग्राफ़ में, कोई डेस्टिनेशन एक ऐक्टिविटी हो सकती है. हालांकि, अपने ऐप्लिकेशन में एक ही ऐक्टिविटी रखना सबसे सही तरीका है. फिर भी, ऐप्लिकेशन में अलग-अलग कॉम्पोनेंट या स्क्रीन के लिए अक्सर अलग-अलग ऐक्टिविटी का इस्तेमाल किया जाता है. ऐसे मामलों में, ऐक्टिविटी डेस्टिनेशन काम के हो सकते हैं.
Compose और Kotlin DSL
Compose और फ़्रैगमेंट के साथ 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>
यह XML, 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>
मौजूदा applicationId के लिए targetPackage तय करने से, दायरा मौजूदा ऐप्लिकेशन तक सीमित हो जाता है. इसमें मुख्य ऐप्लिकेशन भी शामिल होता है.
इस तरीके का इस्तेमाल उन मामलों में भी किया जा सकता है जहां आपको किसी खास ऐप्लिकेशन को डेस्टिनेशन बनाना हो. यहां दिए गए उदाहरण में, एक ऐसे ऐप्लिकेशन को डेस्टिनेशन के तौर पर तय किया गया है जिसका applicationId, com.example.android.another.app है.
<?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>
इस उदाहरण में, userId वैल्यू तय करने के लिए, Safe Args
या 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);
इस उदाहरण में, {userId} के लिए someUser को बदला गया है. साथ ही,
https://example.com?userId=someUser की यूआरआई वैल्यू बनाई गई है.