Tujuan aktivitas

Di grafik navigasi, tujuan dapat berupa aktivitas. Meskipun praktik terbaiknya adalah memiliki satu aktivitas di aplikasi Anda, aplikasi sering menggunakan aktivitas terpisah untuk komponen atau layar 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 informasi selengkapnya, lihat Membangun grafik secara terprogram menggunakan DSL Kotlin.

XML

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

Secara default, library Navigation melampirkan NavController ke tata letak Activity, dan grafik navigasi aktif tercakup ke Activity yang aktif. Jika pengguna menavigasi ke 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-nya 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 mungkin lebih memilih level pengalihan melalui intent implisit. intent-filter dalam entri manifes untuk Activity tujuan menentukan cara Anda perlu menyusun 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 harus dikonfigurasi dengan atribut action dan data yang cocok dengan yang ada dalam 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 dikirimkan sebagai bagian dari URL. Misalnya, Anda dapat mengirim ID Pengguna dalam 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.