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

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

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 الحالي إلى تقييد نطاق التطبيق الحالي، والذي يتضمن التطبيق الرئيسي.

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