Android에서 딥 링크는 앱 내의 특정 대상으로 직접 이동할 수 있게 하는 링크입니다.
탐색 구성요소를 사용하면 명시적 딥 링크와 암시적 딥 링크라는 두 가지 유형의 딥 링크를 만들 수 있습니다.
명시적 딥 링크 만들기
명시적 딥 링크는 PendingIntent
를 사용하여 사용자를 앱 내 특정 위치로 이동시키는 딥 링크의 단일 인스턴스입니다. 예를 들어 명시적 딥 링크를 알림 또는 앱 위젯의 일부로 표시할 수 있습니다.
사용자가 명시적 딥 링크를 통해 앱을 열면 작업 백 스택이 삭제되고 딥 링크 대상으로 대체됩니다. 그래프를 중첩할 때 각 중첩 수준의 시작 대상, 즉 계층 구조에 있는 각 <navigation>
요소의 시작 대상도 스택에 추가됩니다.
즉, 사용자가 딥 링크 대상에서 뒤로 버튼을 누르면 마치 진입점에서 앱에 들어간 것처럼 탐색 스택을 다시 위로 탐색합니다.
아래 예와 같이 NavDeepLinkBuilder
클래스를 사용하여 PendingIntent
를 구성할 수 있습니다. 제공된 컨텍스트가 Activity
가 아니라면 생성자는 실행할 기본 활동으로 PackageManager.getLaunchIntentForPackage()
를 사용합니다(사용 가능한 경우).
Kotlin
val pendingIntent = NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .createPendingIntent()
Java
PendingIntent pendingIntent = new NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .createPendingIntent();
기본적으로 NavDeepLinkBuilder
는 명시적 딥 링크를 앱의 매니페스트에 선언된 기본 실행 Activity
로 시작합니다. NavHost
가 다른 활동에 있다면 딥 링크 빌더를 만들 때 구성요소 이름을 지정해야 합니다.
Kotlin
val pendingIntent = NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .setComponentName(DestinationActivity::class.java) .createPendingIntent()
Java
PendingIntent pendingIntent = new NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .setComponentName(DestinationActivity.class) .createPendingIntent();
ComponentName
이 있으면 빌더로 직접 전달할 수 있습니다.
Kotlin
val componentName = ... val pendingIntent = NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .setComponentName(componentName) .createPendingIntent()
Java
ComponentName componentName = ...; PendingIntent pendingIntent = new NavDeepLinkBuilder(context) .setGraph(R.navigation.nav_graph) .setDestination(R.id.android) .setArguments(args) .setComponentName(componentName) .createPendingIntent();
기존 NavController
가 있으면 NavController.createDeepLink()
를 사용하여 딥 링크를 만들 수도 있습니다.
암시적 딥 링크 만들기
암시적 딥 링크는 앱의 특정 대상을 참조합니다. 딥 링크가 호출되면(예: 사용자가 링크를 클릭한 경우) Android는 참조 대상에 앱을 열 수 있습니다.
딥 링크는 URI, 인텐트 작업, MIME 유형과 일치할 수 있습니다. 단일 딥 링크에는 여러 일치 유형을 지정할 수 있습니다. 단, 일치되는 유형의 우선순위는 URI 인수가 가장 높고 그다음 작업, MIME 유형순입니다.
다음은 URI, 작업 및 MIME 유형을 포함하는 딥 링크의 예입니다.
<fragment android:id="@+id/a"
android:name="com.example.myapplication.FragmentA"
tools:layout="@layout/a">
<deepLink app:uri="www.example.com"
app:action="android.intent.action.MY_ACTION"
app:mimeType="type/subtype"/>
</fragment>
Navigation Editor를 사용하여 다음과 같이 대상으로 연결되는 암시적 딥 링크를 만들 수도 있습니다.
- Navigation Editor의 Design 탭에서 딥 링크 대상을 선택합니다.
- Attributes 패널의 Deep Links 섹션에서 +를 클릭합니다.
표시되는 Add Deep Link 대화상자에서 딥 링크의 정보를 입력합니다.
다음 내용을 참고하세요.
- 스키마가 없는 URI는 http 또는 https로 가정됩니다. 예를 들어
www.google.com
은http://www.google.com
및https://www.google.com
모두와 일치합니다. {placeholder_name}
형식의 경로 매개변수 자리표시자는 1개 이상의 문자와 일치합니다. 예를 들어http://www.example.com/users/{id}
는http://www.example.com/users/4
와 일치합니다. 탐색 구성요소는 자리표시자 이름을 딥 링크 대상에 관해 정의된 인수와 일치시켜 자리표시자 값을 적절한 유형으로 파싱하려고 시도합니다. 동일한 이름의 인수가 정의되어 있지 않으면 인수 값에 기본String
유형이 사용됩니다. .* 와일드 카드를 사용하면 0개 이상의 문자와 일치시킬 수 있습니다.- 쿼리 매개변수 자리표시자는 경로 매개변수 대신 또는 경로 매개변수와 함께 사용할 수 있습니다. 예를 들어
http://www.example.com/users/{id}?myarg={myarg}
는http://www.example.com/users/4?myarg=28
과 일치합니다. - 기본값 또는 null을 허용하는 값으로 정의된 변수의 쿼리 매개변수 자리표시자는 일치할 필요가 없습니다. 예를 들어
http://www.example.com/users/{id}?arg1={arg1}&arg2={arg2}
는http://www.example.com/users/4?arg2=28
또는http://www.example.com/users/4?arg1=7
과 일치합니다. 경로 매개변수에서는 그렇지 않습니다. 예를 들어http://www.example.com/users?arg1=7&arg2=28
은 필수 경로 매개변수가 제공되지 않았기 때문에 위의 패턴과 일치하지 않습니다. - 관련 없는 쿼리 매개변수는 딥 링크 URI 일치에 영향을 주지 않습니다. 예를 들어
http://www.example.com/users/{id}
는extraneousParam
이 URI 패턴에 정의되어 있지 않더라도http://www.example.com/users/4?extraneousParam=7
과 일치합니다.
- 스키마가 없는 URI는 http 또는 https로 가정됩니다. 예를 들어
(선택사항) Google에서 개발자가 URI의 소유자임을 확인하도록 하려면 Auto Verify를 선택합니다. 자세한 내용은 Android App Links 인증하기를 참고하세요.
Add를 클릭합니다. 선택한 대상에 딥 링크가 있음을 나타내는 링크 아이콘 이 대상 위에 표시됩니다.
Code 탭을 클릭하여 XML 뷰로 전환합니다. 다음과 같이 중첩된
<deepLink>
요소가 대상에 추가되었습니다.<deepLink app:uri="https://www.google.com" />
암시적 딥 링크를 사용 설정하려면 앱의 manifest.xml
파일에도 추가해야 합니다. 다음 예와 같이 기존 탐색 그래프를 가리키는 활동에 단일 <nav-graph>
요소를 추가합니다.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapplication"> <application ... > <activity name=".MainActivity" ...> ... <nav-graph android:value="@navigation/nav_graph" /> ... </activity> </application> </manifest>
프로젝트를 빌드할 때 탐색 구성요소는 <nav-graph>
요소를 생성된 <intent-filter>
요소로 대체하여 탐색 그래프의 모든 딥 링크와 일치시킵니다.
암시적 딥 링크를 트리거할 때 백 스택의 상태는 암시적 Intent
가 Intent.FLAG_ACTIVITY_NEW_TASK
플래그와 함께 실행되었는지에 따라 다릅니다.
- 플래그가 설정되면 작업 백 스택이 삭제되고 딥 링크 대상으로 대체됩니다. 명시적 딥 링크와 마찬가지로 그래프를 중첩할 때 각 중첩 수준의 시작 대상, 즉 계층 구조에 있는 각
<navigation>
요소의 시작 대상도 스택에 추가됩니다. 즉, 사용자가 딥 링크 대상에서 뒤로 버튼을 누르면 마치 진입점에서 앱에 들어간 것처럼 탐색 스택을 다시 위로 탐색합니다. - 플래그가 설정되지 않으면 암시적 딥 링크가 트리거된 이전 앱의 작업 스택에 남게 됩니다. 이 경우 뒤로 버튼을 누르면 다시 이전 앱으로 돌아가는 반면 위로 버튼을 누르면 탐색 그래프 내 계층 구조의 상위 대상에서 앱 작업이 시작됩니다.
딥 링크 처리
탐색을 사용할 때는 항상 기본 launchMode
인 standard
를 사용하는 것이 좋습니다. standard
시작 모드를 사용하면 탐색이 Intent
내의 명시적 또는 암시적 딥 링크를 처리하기 위해 handleDeepLink()
를 호출하여 자동으로 딥 링크를 처리합니다. 그러나 singleTop
과 같은 다른 launchMode
를 사용할 때 Activity
가 재사용되는 경우에는 딥 링크 처리가 자동으로 이루어지지 않습니다. 이 경우에는 다음 예시와 같이 onNewIntent()
의 handleDeepLink()
를 수동으로 호출해야 합니다.
Kotlin
override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) navController.handleDeepLink(intent) }
Java
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); navController.handleDeepLink(intent); }
추가 리소스
탐색에 관한 자세한 내용은 다음 리소스를 참고하세요.