Tujuan aktivitas

Di grafik navigasi, tujuan dapat berupa aktivitas. Meskipun memiliki satu aktivitas di aplikasi adalah praktik terbaik, aplikasi sering kali menggunakan aktivitas terpisah untuk layar atau komponen yang berbeda dalam aplikasi. Tujuan aktivitas dapat berguna dalam kasus tersebut.

Compose dan DSL Kotlin

Menambahkan tujuan aktivitas ke grafik navigasi pada dasarnya sama di Compose dan saat menggunakan DSL Kotlin dengan fragmen. Hal ini karena saat meneruskan NavGraph ke composable NavHost, Anda menggunakan lambda createGraph() yang sama.

Untuk mengetahui informasi selengkapnya, lihat Membuat grafik secara terprogram menggunakan DSL Kotlin.

XML

Membuat tujuan activity mirip dengan membuat tujuan fragmen. Namun, sifat tujuan aktivitas cukup berbeda.

Secara default, library Navigasi melampirkan NavController ke tata letak Activity, dan grafik navigasi aktif dicakupkan ke Activity aktif. Jika pengguna membuka Activity yang berbeda, grafik navigasi saat ini tidak lagi berada dalam cakupan. Ini berarti tujuan Activity harus dianggap sebagai endpoint dalam grafik navigasi.

Untuk menambahkan tujuan aktivitas, tentukan Activity tujuan dengan nama class yang sepenuhnya memenuhi syarat:

<?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 ini setara dengan panggilan berikut ke startActivity():

Kotlin

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

Java

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

Anda mungkin memiliki kasus saat pendekatan ini tidak sesuai. Misalnya, Anda mungkin tidak memiliki dependensi waktu kompilasi pada class aktivitas, atau Anda mungkin lebih suka level pengalihan melalui intent implisit. intent-filter dalam entri manifes untuk Activity tujuan menentukan cara Anda perlu membuat struktur tujuan Activity.

Misalnya, pertimbangkan file manifes berikut:

<?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>

Tujuan Activity yang sesuai perlu dikonfigurasi dengan atribut action dan data yang cocok dengan yang ada di entri manifes:

<?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>

Menentukan targetPackage ke applicationId saat ini akan membatasi cakupan ke aplikasi saat ini, yang mencakup aplikasi utama.

Mekanisme yang sama dapat digunakan untuk kasus saat Anda ingin aplikasi tertentu menjadi tujuannya. Contoh berikut menentukan tujuan untuk menjadi aplikasi dengan applicationId dari 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>

Argumen dinamis

Contoh sebelumnya menggunakan URL tetap untuk menavigasi ke tujuan. Anda mungkin juga perlu mendukung URL dinamis tempat info tambahan dikirim sebagai bagian dari URL. Misalnya, Anda dapat mengirim ID pengguna di URL dengan format yang mirip dengan https://example.com?userId=<actual user ID>.

Dalam hal ini, gunakan dataPattern, bukan atribut data. Selanjutnya, Anda dapat menyediakan argumen untuk diganti dengan placeholder yang disebutkan dalam nilai 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>

Dalam contoh ini, Anda dapat menentukan nilai userId menggunakan Safe Args atau dengan 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);

Contoh ini menggantikan someUser dengan {userId} dan membuat nilai URI https://example.com?userId=someUser.