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

Tính năng liên kết sâu giúp bạn đưa người dùng trực tiếp vào ứng dụng của mình từ trình duyệt web, thông báo, mạng xã hội, quảng cáo và các nguồn khác. Đường liên kết sâu cung cấp các lượt chuyển đổi trực tiếp từ ứng dụng sang ứng dụng và từ web sang ứng dụng, có thể giúp bạn tăng mức độ tương tác thông qua nội dung theo bối cảnh và được nhắm đến.

Hướng dẫn này giải thích cách hoạt động của tính năng liên kết sâu, cũng như cách tạo và kiểm thử các đường liên kết sâu đến nội dung của bạn.

Đối với những đường liên kết sâu tham chiếu đến trang web hoặc miền của riêng bạn, bạn nên sử dụng Đường liên kết đến ứng dụng. Đường liên kết này mang lại trải nghiệm liền mạch và đáng tin cậy cho người dùng.

Cách hoạt động của tính năng liên kết sâu

Liên kết sâu là một chức năng chung của hệ thống Android, được hỗ trợ trên mọi phiên bản và mọi thiết bị. Nó tận dụng hệ thống Ý định của Android để định tuyến đường liên kết sâu đến các ứng dụng mà người dùng quan tâm. Những ứng dụng muốn xử lý một URI liên kết sâu cụ thể sẽ khai báo một bộ lọc Ý định phù hợp trong tệp kê khai ứng dụng.

Trong thời gian chạy, khi người dùng nhấn vào một đường liên kết, Android sẽ kích hoạt một ý định và cố gắng định tuyến ý định đó đến một ứng dụng. Vì nhiều ứng dụng có thể khai báo các bộ lọc ý định khớp với một URI nhất định, nên Android sẽ thực hiện các thao tác sau theo thứ tự này để định tuyến ý định:

  1. Mở ứng dụng mặc định của người dùng có thể xử lý URI, nếu có.
  2. Mở ứng dụng duy nhất có thể xử lý URI.
  3. Cho phép người dùng chọn một ứng dụng trong hộp thoại phân định.

Điều này có nghĩa là mặc dù bộ lọc ý định của bạn khớp với một URI nhất định, nhưng không có gì đảm bảo rằng hệ thống sẽ định tuyến ý định đường liên kết sâu đến ứng dụng của bạn. Người dùng đóng vai trò chính trong việc quản lý ứng dụng nào xử lý ý định, điều này giúp họ kiểm soát và có quyền lựa chọn. Để kiểm soát đường liên kết sâu đến trang web và miền của riêng bạn, hãy thử sử dụng Đường liên kết trong ứng dụng.

Hộp thoại phân biệt của Android cho phép người dùng xem tất cả các ứng dụng đã cài đặt và đã đăng ký để xử lý một ý định về đường liên kết sâu. Người dùng cũng có thể chọn một ứng dụng làm ứng dụng mặc định cho loại đường liên kết này. Sau khi người dùng đặt một ứng dụng mặc định, hệ thống sẽ không còn hiển thị hộp thoại cho ý định cụ thể đó nữa và ứng dụng đã chọn sẽ tự động mở.

Hình 1. Hộp thoại phân định

Hành vi của hộp thoại phân biệt đã phát triển qua các phiên bản Android. Ví dụ: trên Android 12 trở lên, theo mặc định, các đường liên kết trên web không phải là Đường liên kết ứng dụng đã xác minh thường sẽ mở trong một trình duyệt web, trong khi trên các phiên bản trước, một hộp thoại phân định có thể xuất hiện nếu một ứng dụng có thể xử lý đường liên kết trên web.

Lưu ý: Kể từ Android 12 (API cấp 31), ý định chung trên web chỉ phân giải thành một hoạt động trong ứng dụng của bạn nếu ứng dụng của bạn được phê duyệt cho miền cụ thể có trong ý định đó trên web. Nếu ứng dụng của bạn không được phê duyệt cho miền này, thì ý định trên web sẽ chuyển sang ứng dụng trình duyệt mặc định của người dùng.

Các loại đường liên kết sâu

Có 3 loại đường liên kết sâu mà bạn có thể hỗ trợ trên Android:

  • Đường liên kết sâu tuỳ chỉnh: Đây là những đường liên kết sâu sử dụng một lược đồ URI tuỳ chỉnh (chẳng hạn như example://products/123) để đưa người dùng đến thẳng một phần nội dung cụ thể trong ứng dụng. Chúng rất hữu ích cho hoạt động điều hướng nội bộ hoặc các đường liên kết từ những nguồn mà bạn kiểm soát, nhưng chúng không phải là đường liên kết web tiêu chuẩn và vẫn có thể kích hoạt hộp thoại phân biệt nếu một ứng dụng khác đăng ký cùng một lược đồ tuỳ chỉnh.
  • Đường liên kết trang web: Đây là các đường liên kết sâu sử dụng các lược đồ httphttps tiêu chuẩn. Chúng linh hoạt hơn vì là URL tiêu chuẩn, nhưng trên Android 12 trở lên, chúng gần như luôn kích hoạt hộp thoại phân biệt, nghĩa là theo mặc định, chúng có khả năng được trình duyệt web của người dùng xử lý thay vì được định tuyến đến ứng dụng của bạn.
  • Đường liên kết trong ứng dụng: Có từ Android 6.0 (API cấp 23), đây là những đường liên kết trang web đã xác minh. Thông qua quy trình liên kết trang web, bạn có thể chứng minh cho hệ thống Android rằng bạn sở hữu miền đó. Sau khi xác minh, hệ thống sẽ tự động định tuyến các đường liên kết cho miền đó trực tiếp đến ứng dụng của bạn, bỏ qua hoàn toàn hộp thoại phân định. Điều này giúp mang lại trải nghiệm liền mạch và đáng tin cậy cho người dùng.

Thêm bộ lọc ý định cho đường liên kết đến

Để tạo một đường liên kết đến nội dung trong ứng dụng, hãy thêm một bộ lọc ý định chứa các phần tử và giá trị thuộc tính sau đây vào tệp kê khai:

<action>

Chỉ định thao tác theo ý định ACTION_VIEW để có thể truy cập vào bộ lọc ý định từ Google Tìm kiếm.

<data>

Thêm một hoặc nhiều thẻ <data>, mỗi thẻ đại diện cho một định dạng URI phân giải thành hoạt động. Ít nhất, thẻ <data> phải có thuộc tính android:scheme.

Bạn có thể thêm các thuộc tính khác để tinh chỉnh thêm loại URI mà hoạt động chấp nhận. Ví dụ: bạn có thể có nhiều hoạt động chấp nhận các URI tương tự, nhưng chỉ khác nhau dựa trên tên đường dẫn. Trong trường hợp này, hãy sử dụng thuộc tính android:path hoặc các biến thể pathPattern hoặc pathPrefix của thuộc tính này để phân biệt hoạt động mà hệ thống sẽ mở cho các đường dẫn URI khác nhau.

<category>

Thêm danh mục BROWSABLE. Đây là yêu cầu bắt buộc để bộ lọc ý định có thể truy cập được từ trình duyệt web. Nếu không có tham số này, việc nhấp vào một đường liên kết trong trình duyệt sẽ không thể phân giải thành ứng dụng của bạn.

Bạn cũng nên thêm danh mục DEFAULT. Điều này cho phép ứng dụng của bạn phản hồi các ý định ngầm. Nếu không có thuộc tính này, hoạt động chỉ có thể bắt đầu nếu ý định chỉ định tên thành phần ứng dụng của bạn.

Đoạn mã XML sau đây cho biết cách bạn có thể chỉ định một bộ lọc ý định trong tệp kê khai để liên kết sâu. Cả URI "example://gizmos""http://www.example.com/gizmos" đều phân giải thành hoạt động này.

<activity
    android:name="com.example.android.GizmosActivity"
    android:label="@string/title_gizmos" >
    <intent-filter android:label="@string/filter_view_http_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
        <data android:scheme="http"
              android:host="www.example.com"
              android:pathPrefix="/gizmos" />
        <!-- note that the leading "/" is required for pathPrefix-->
    </intent-filter>
    <intent-filter android:label="@string/filter_view_example_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "example://gizmos” -->
        <data android:scheme="example"
              android:host="gizmos" />
    </intent-filter>
</activity>

Lưu ý rằng 2 bộ lọc ý định này chỉ khác nhau ở phần tử <data>. Mặc dù bạn có thể thêm nhiều phần tử <data> vào cùng một bộ lọc, nhưng điều quan trọng là bạn phải tạo các bộ lọc riêng biệt khi muốn khai báo các URL riêng biệt (chẳng hạn như một tổ hợp cụ thể của schemehost), vì nhiều phần tử <data> trong cùng một bộ lọc ý định thực sự được hợp nhất với nhau để tính đến tất cả các biến thể của các thuộc tính kết hợp. Ví dụ: hãy cân nhắc những điều sau:

<intent-filter>
  ...
  <data android:scheme="https" android:host="www.example.com" />
  <data android:scheme="app" android:host="open.my.app" />
</intent-filter>

Có vẻ như tính năng này chỉ hỗ trợ https://www.example.comapp://open.my.app. Tuy nhiên, nó thực sự hỗ trợ 2 ký tự đó, cộng với các ký tự sau: app://www.example.comhttps://open.my.app.

Thận trọng: Nếu nhiều hoạt động chứa các bộ lọc ý định phân giải thành cùng một Đường liên kết đến ứng dụng Android đã xác minh, thì không có gì đảm bảo hoạt động nào sẽ xử lý đường liên kết đó.

Sau khi bạn thêm bộ lọc ý định có URI cho nội dung hoạt động vào tệp kê khai ứng dụng, Android có thể định tuyến mọi Intent có URI trùng khớp đến ứng dụng của bạn trong thời gian chạy.

Để tìm hiểu thêm về cách xác định bộ lọc ý định, hãy xem phần Cho phép ứng dụng khác bắt đầu Hoạt động của bạn.

Đọc dữ liệu từ các ý định đến

Sau khi hệ thống bắt đầu hoạt động của bạn thông qua một bộ lọc ý định, bạn có thể sử dụng dữ liệu do Intent cung cấp để xác định nội dung cần hiển thị. Gọi các phương thức getData()getAction() để truy xuất dữ liệu và thao tác được liên kết với Intent đến. Bạn có thể gọi các phương thức này bất cứ lúc nào trong vòng đời của hoạt động, nhưng thường thì bạn nên thực hiện trong các lệnh gọi lại sớm như onCreate() hoặc onStart.

Sau đây là một đoạn mã cho biết cách truy xuất dữ liệu từ Intent:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

    val action: String? = intent?.action
    val data: Uri? = intent?.data
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent = getIntent();
    String action = intent.getAction();
    Uri data = intent.getData();
}

Hãy làm theo các phương pháp hay nhất sau đây để cải thiện trải nghiệm của người dùng:

  • Đường liên kết sâu sẽ đưa thẳng người dùng đến nội dung mà không cần đến lời nhắc, trang xen kẽ hay thao tác đăng nhập. Hãy đảm bảo rằng người dùng có thể xem nội dung ứng dụng ngay cả khi trước đó họ chưa từng mở ứng dụng. Việc nhắc người dùng khi họ thực hiện các thao tác tiếp theo hay khi họ mở ứng dụng qua Trình chạy là việc hoàn toàn hợp lý.
  • Làm theo hướng dẫn thiết kế được mô tả trong phần Điều hướng bằng nút Quay lại và Lên để ứng dụng của bạn đáp ứng được kỳ vọng của người dùng về khả năng điều hướng quay lại sau khi họ mở ứng dụng thông qua một đường liên kết sâu.

Kiểm thử đường liên kết sâu

Bạn có thể sử dụng Cầu gỡ lỗi Android với công cụ trình quản lý hoạt động (am) để kiểm tra xem các URI bộ lọc ý định mà bạn đã chỉ định cho tính năng liên kết sâu có phân giải thành hoạt động ứng dụng chính xác hay không. Bạn có thể chạy lệnh adb trên một thiết bị hoặc trình mô phỏng.

Cú pháp chung để kiểm thử URI bộ lọc ý định bằng adb là:

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d <URI> <PACKAGE>

Ví dụ: lệnh sau đây cố gắng xem một hoạt động của ứng dụng đích được liên kết với URI đã chỉ định.

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d "example://gizmos" com.example.android

Lưu ý: Khi xác định một tập hợp các kiểu nguyên thuỷ trong một tuyến đường, chẳng hạn như **@Serializable data class Product(val colors: List)**, định dạng URL đường liên kết sâu được tạo tự động là **basePath?colors={value**}. Nếu cố gắng chỉ định một URI có nhiều tham số truy vấn (ví dụ: **basepath?colors=red&colors=blue**), bạn phải thoát ký hiệu và (ví dụ: **basepath?colors=red\&colors=blue**).

Nội dung khai báo trong tệp kê khai và trình xử lý ý định mà bạn đặt sẽ xác định mối kết nối giữa ứng dụng và một trang web, cũng như việc cần làm với các đường liên kết đến. Tuy nhiên, để hệ thống coi ứng dụng của bạn là trình xử lý mặc định cho một nhóm URI, bạn cũng phải yêu cầu hệ thống xác minh mối kết nối này. Xác minh đường liên kết đến ứng dụng giải thích cách triển khai quy trình xác minh này.

Để tìm hiểu thêm về ý định và đường liên kết đến ứng dụng, hãy xem các tài nguyên sau: