Tạo đường liên kết sâu đến một đích đến

Trên Android, đường liên kết sâu là đường đưa bạn đến thẳng một đích đến cụ thể trong ứng dụng.

Thành phần Điều hướng cho phép bạn tạo hai loại đường liên kết sâu: rõ ràngngầm ẩn.

Tạo đường liên kết sâu rõ ràng

Đường liên kết sâu rõ ràng là một bản sao của đường liên kết sâu có sử dụng PendingIntent đưa người dùng đến một vị trí cụ thể trong ứng dụng. Ví dụ: bạn có thể hiển thị một đường liên kết sâu rõ ràng trong thông báo hoặc tiện ích ứng dụng.

Khi người dùng mở ứng dụng thông qua một đường liên kết sâu rõ ràng, ngăn xếp lui tác vụ sẽ bị xóa và thay thế bằng đích đến của đường liên kết sâu. Khi lồng ghép biểu đồ, đích xuất phát từ mỗi cấp độ lồng ghép – tức là đích xuất phát từ mỗi phần tử <navigation> trong hệ phân cấp – cũng được thêm vào ngăn xếp. Có nghĩa là khi người dùng nhấn nút Quay lại từ một đích đến liên kết sâu, họ sẽ điều hướng trở lại ngăn xếp điều hướng như đã nhập ứng dụng từ điểm truy cập của ứng dụng.

Bạn có thể sử dụng lớp NavDeepLinkBuilder tạo một PendingIntent, như trong ví dụ bên dưới. Lưu ý nếu ngữ cảnh được cung cấp không phải là Activity, hàm tạo sẽ sử dụng PackageManager.getLaunchIntentForPackage() làm hoạt động mặc định để khởi chạy nếu có.

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();

Theo mặc định, NavDeepLinkBuilder sẽ chạy đường liên kết sâu rõ ràng đến lần chạy mặc định Activity được khai báo trong tệp kê khai của ứng dụng. Nếu NavHost nằm trong tác vụ khác, bạn phải chỉ định tên thành phần khi tạo trình tạo đường liên kết sâu:

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();

Nếu có ComponentName, bạn có thể chuyển trực tiếp đến trình tạo:

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();

Nếu đã có sẵn NavController, bạn cũng có thể tạo một đường liên kết sâu bằng cách sử dụng NavController.createDeepLink().

Tạo đường liên kết sâu ngầm ẩn

Đường liên kết sâu ngầm ẩn dùng để chỉ một đích đến cụ thể trong ứng dụng. Khi đường liên kết sâu được gọi (ví dụ: khi người dùng nhấp vào một đường liên kết), Android có thể mở ứng dụng tại đích đến tương ứng.

Đường liên kết sâu có thể được so khớp theo URI, hành động theo ý định và loại MIME. Bạn có thể chỉ định nhiều kiểu khớp cho một đường liên kết sâu, nhưng lưu ý việc so khớp URI sẽ được ưu tiên trước tiên, sau đó là thao tác, rồi đến loại MIME.

Dưới đây là một ví dụ về đường liên kết sâu chứa URI, một hành động và loại 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>

Bạn cũng có thể sử dụng Trình chỉnh sửa điều hướng để tạo đường liên kết sâu ngầm ẩn đến một đích đến như sau:

  1. Trong thẻ Thiết kế của Trình chỉnh sửa điều hướng, hãy chọn đích đến cho đường liên kết sâu.
  2. Nhấp vào dấu + ở mục Đường liên kết sâu trong bảng Thuộc tính.
  3. Trong hộp thoại Thêm đường liên kết sâu xuất hiện, hãy nhập thông tin cho đường liên kết sâu.

    Vui lòng lưu ý những điều sau:

    • Các URI không có lược đồ được giả định là http hoặc https. Ví dụ: www.google.com khớp với cả http://www.google.comhttps://www.google.com.
    • Trình giữ chỗ tham số ở dạng {placeholder_name} khớp với một hoặc nhiều ký tự. Ví dụ: http://www.example.com/users/{id} khớp với: http://www.example.com/users/4. Thành phần Điều hướng cố phân tích giá trị trình giữ chỗ thành các loại thích hợp bằng cách so khớp tên của trình giữ chỗ với đối số đã được xác định cho đích liên kết sâu. Nếu không có đối số nào có cùng tên được xác định, hệ thống sẽ sử dụng loại String mặc định cho giá trị đối số. Bạn có thể dùng ký tự đại diện .* để khớp với tối thiểu 0 ký tự.
    • Bạn có thể sử dụng trình giữ chỗ tham số truy vấn thay vì hoặc kết hợp với các tham số đường dẫn. Ví dụ: http://www.example.com/users/{id}?myarg={myarg} khớp với: http://www.example.com/users/4?myarg=28.
    • Trình giữ chỗ thông số truy vấn không bắt buộc phải có cho các biến được xác định bằng giá trị mặc định hoặc giá trị rỗng. Ví dụ: http://www.example.com/users/{id}?arg1={arg1}&arg2={arg2} khớp với http://www.example.com/users/4?arg2=28 hoặc http://www.example.com/users/4?arg1=7. Điều này không đúng với các tham số đường dẫn. Ví dụ: http://www.example.com/users?arg1=7&arg2=28 không khớp với mẫu trên vì tham số đường dẫn bắt buộc không được cung cấp.
    • Các tham số truy vấn không liên quan sẽ không ảnh hưởng đến việc so khớp URI liên kết sâu. Ví dụ: http://www.example.com/users/{id} phù hợp với http://www.example.com/users/4?extraneousParam=7, mặc dù extraneousParam không được xác định trong mẫu URI.
  4. (không bắt buộc) Đánh dấu vào Tự động xác minh để yêu cầu Google xác minh rằng bạn là chủ sở hữu của URI đó. Để biết thêm thông tin, hãy xem bài viết Xác minh đường liên kết ứng dụng Android.

  5. Nhấp vào Thêm. Biểu tượng đường liên kết xuất hiện phía trên đích đến đã chọn cho biết đích đến này có đường liên kết sâu.

  6. Nhấp vào thẻ để chuyển sang chế độ xem XML. Đã thêm một phần tử <deepLink> lồng ghép vào đích đến:

    <deepLink app:uri="https://www.google.com" />
    

Để bật tính năng liên kết sâu ngầm định, bạn cũng phải thêm các tệp vào manifest.xml của ứng dụng. Thêm phần tử <nav-graph> duy nhất vào thao tác trỏ đến một biểu đồ điều hướng hiện có, như minh họa trong ví dụ sau:

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

Khi tạo dự án, thành phần Điều hướng sẽ thay thế phần tử <nav-graph> bằng các phần tử <intent-filter> đã tạo để khớp với tất mọi đường liên kết sâu trong biểu đồ điều hướng.

Khi kích hoạt một đường liên kết sâu ngầm ẩn, trạng thái của ngăn xếp lui phụ thuộc vào việcIntent được ra mắt cùng vớiIntent.FLAG_ACTIVITY_NEW_TASK gắn cờ:

  • Nếu cờ được đặt, ngăn xếp lui tác vụ sẽ bị xóa và thay thế bằng đích đến liên kết sâu. Như với đường liên kết sâu rõ ràng, khi lồng ghép biểu đồ, đích xuất phát từ mỗi cấp độ lồng ghép – tức là đích xuất phát từ mỗi cấp phần tử <navigation> trong hệ phân cấp cũng được thêm vào ngăn xếp. Điều này có nghĩa là khi người dùng nhấn nút Quay lại từ một đích đến liên kết sâu, họ sẽ điều hướng trở lại ngăn xếp điều hướng như đã nhập ứng dụng từ điểm truy cập của ứng dụng.
  • Nếu cờ không được đặt, bạn sẽ vẫn ở trên ngăn xếp tác vụ của ứng dụng trước, chỗ liên kết sâu ẩn đã được kích hoạt. Trong trường hợp đó, nút Quay lại đưa bạn trở lại ứng dụng trước, còn nút Lên bắt đầu nhiệm vụ của ứng dụng trên đích đến phân cấp gốc trong biểu đồ điều hướng.

Xử lý đường liên kết sâu

Luôn dùng launchMode mặc định trong standard khi sử dụng tính năng Điều hướng. Khi sử dụng chế độ chạy standard, tính năng Điều hướng tự động xử lý các đường liên kết sâu bằng cách gọi handleDeepLink() để xử lý mọi đường liên kết sâu rõ ràng hoặc tiềm ẩn trong Intent. Tuy nhiên, việc này không tự động xảy ra nếu Activity được sử dụng lại khi sử dụng launchMode thay thế, chẳng hạn như singleTop. Trong trường hợp đó, bạn cần gọi handleDeepLink() theo cách thủ công trong onNewIntent(), như ở ví dụ sau:

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);
}

Tài nguyên khác

Để tìm hiểu thêm về cách thao tác, hãy xem các tài nguyên sau.

Mẫu

Lớp học lập trình

Video