مقاصد فعالیت

در نمودار ناوبری شما، مقصد می تواند یک فعالیت باشد. در حالی که بهترین تمرین این است که یک فعالیت واحد در برنامه خود داشته باشید، برنامه ها اغلب از فعالیت های جداگانه برای اجزای متمایز یا صفحه نمایش در یک برنامه استفاده می کنند. مقاصد فعالیت می تواند در چنین مواردی مفید باشد.

Compose و Kotlin DSL

افزودن یک مقصد فعالیت به نمودار ناوبری شما اساساً در Compose و هنگام استفاده از Kotlin DSL با قطعات یکسان است. این به این دلیل است که هنگام ارسال NavGraph خود به NavHost composable خود، از همان createGraph() lambda استفاده می کنید.

برای اطلاعات بیشتر، به ساخت یک نمودار به صورت برنامه‌ریزی با استفاده از Kotlin DSL مراجعه کنید.

XML

ایجاد یک مقصد فعالیت مشابه ایجاد یک مقصد قطعه است. با این حال، ماهیت یک مقصد فعالیت کاملاً متفاوت است.

به‌طور پیش‌فرض، کتابخانه Navigation 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() است:

کاتلین

startActivity(Intent(context, DestinationActivity::class.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> ارسال کنید.

در این حالت، به جای ویژگی 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 مشخص کنید:

کاتلین

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

جاوا

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

این مثال someUser را جایگزین {userId} می‌کند و یک مقدار URI از https://example.com?userId=someUser ایجاد می‌کند.