탐색 그래프에서 대상은 활동일 수 있습니다. 앱에 단일 활동이 있는 것이 가장 좋지만 앱은 앱 내의 고유한 구성요소나 화면에 별도의 활동을 사용하는 경우가 많습니다. 이러한 경우 활동 대상이 유용할 수 있습니다.
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));
이 접근법이 적합하지 않은 경우도 있습니다. 예를 들어 활동 클래스에 관한 컴파일 시간 종속 항목이 없거나, 암시적 인텐트를 거치는 간접 수준을 선호할 수 있습니다. 대상 Activity
의 매니페스트 항목에서 intent-filter
는 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
로 지정하면 기본 앱을 포함한 현재 애플리케이션으로 범위가 제한됩니다.
특정 앱을 대상으로 지정하려는 경우에도 이 메커니즘을 사용할 수 있습니다. 다음 예에서는 com.example.android.another.app
의 applicationId
를 갖는 앱을 대상으로 정의합니다.
<?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을 지원해야 할 수도 있습니다. 예를 들어 https://example.com?userId=<actual user ID>
와 유사한 형식의 URL로 사용자 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>
이 예에서는 Safe Args 또는 Bundle
을 사용하여 userId
값을 지정할 수 있습니다.
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}
로 대체하고 https://example.com?userId=someUser
의 URI 값을 만듭니다.