وجهات الأنشطة

في الرسم البياني للتنقل، يمكن أن تكون الوجهة نشاطًا. في حين أنه من الأفضل ممارسة نشاط واحد في تطبيقك، غالبًا ما تستخدم التطبيقات والأنشطة لمكونات أو شاشة مميزة داخل التطبيق. النشاط يمكن أن تكون مفيدة في مثل هذه الحالات.

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));

قد يكون لديك حالات يكون فيها هذا النهج غير مناسب. على سبيل المثال، قد لا يكون لديك تبعية لوقت التجميع على فئة النشاط، أو قد ويفضلون مستوى عدم التوجيه من خلال نية ضمنية. تشير رسالة الأشكال البيانية intent-filter في إدخال البيان للوجهة Activity يحدد كيفية تنظيم بنية وجهة 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 الحالي إلى تقييد نطاق التطبيق الحالي، والذي يتضمن التطبيق الرئيسي.

يمكن استخدام الآلية نفسها في الحالات التي تريد فيها أن يكون تطبيقًا معيّنًا الوجهة. يحدِّد المثال التالي وجهة لتكون تطبيقًا يتضمّن هذا الاقتراح رقمه 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>

الوسيطات الديناميكية

استخدمت الأمثلة السابقة عناوين URL ثابتة للانتقال إلى الوجهات. قد تريد إلى استخدام عناوين URL الديناميكية التي يتم إرسال معلومات إضافية إليها كجزء من عنوان URL. على سبيل المثال، يمكنك إرسال رقم تعريف المستخدم في عنوان URL بتنسيق مشابه لما يلي: https://example.com?userId=<actual user ID>

في هذه الحالة، استخدِم السمة dataPattern بدلاً من السمة data. يمكنك بعد ذلك تقديم وسيطات سيتم استبدالها بالعناصر النائبة المسماة داخل قيمة 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 باستخدام الوسيطات الآمنة. أو باستخدام 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} وينشئ قيمة معرف موارد منتظم (URI) https://example.com?userId=someUser