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

Tính năng liên kết sâu cho phé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 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, được nhắm mục tiêu.

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à thử nghiệm các đường liên kết sâu đến nội dung của bạn.

Đối với các đườ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 trong ứng dụng để mang lại trải nghiệm liền mạch, đá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 tất cả các phiên bản, trên mọi thiết bị. Thư viện này 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 quan tâm. Các ứ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 hành động 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ó một ứng dụng được chỉ định.
  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à, ngay cả khi bộ lọc ý định của bạn khớp với một URI nhất định, thì cũng không có gì đảm bảo rằng hệ thống sẽ định tuyến ý định liên kết sâu đến ứng dụng của bạn. Người dùng đóng vai trò quan trọng trong việc quản lý ứng dụng nào xử lý ý định, giúp họ có quyền kiểm soát và lựa chọn. Để có thêm quyền kiểm soát đối với các đường liên kết sâu đến trang web và miền của riêng bạn, hãy thử dùng Đường liên kết trong ứng dụng.

Hộp thoại phân định của Android cho phép người dùng xem tất cả ứng dụng cần cài đặt đã đăng ký để xử lý ý định 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 hiển thị hộp thoại cho ý định cụ thể đó nữa và ứng dụng đã chọn sẽ tự động mở.

Hộp thoại phân định của hệ thống Android cho thấy các lựa chọn ứng dụng cho một đường liên kết.
Hình 1. Hộp thoại phân định

Hành vi của hộp thoại phân định đã phát triển qua các phiên bản Android. Ví dụ: trên Android 12 trở lên, các đường liên kết trang web không phải là App Link đã xác minh thường sẽ mở trong trình duyệt web theo mặc định, trong khi trên các phiên bản trước, 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 trang web.

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

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

Để tạo đường liên kết đến nội dung ứ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 này vào tệp kê khai:

<action>

Chỉ định hành động 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. Thẻ <data> phải bao gồm ít nhất 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ự nhau, nhưng khác nhau dựa trê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. Bạn cần có danh mục này để có thể truy cập vào bộ lọc ý định từ trình duyệt web. Nếu không có bộ lọc ý định, thì thao tá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 đến ứng dụng của bạn.

Cũng bao gồm danh mục DEFAULT. Điều này cho phép ứng dụng của bạn phản hồi ý định ngầm ẩn. Nếu không có bộ lọc này, thì hoạt động chỉ có thể được 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 bộ lọc ý định trong tệp kê khai để liên kết sâu. Cả hai URI "example://gizmos" và "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 hai bộ lọc ý định chỉ khác nhau ở phần tử <data>. Mặc dù bạn có thể đưa 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 scheme và host), 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 thuộc tính kết hợp. Ví dụ: hãy xem xét 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ư điều này chỉ hỗ trợ https://www.example.com và app://open.my.app. Tuy nhiên, tiện ích này thực sự hỗ trợ hai loại đó, cộng với các loại sau: app://www.example.com và https://open.my.app.

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 khớp với ứ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ừ ý định đến

Sau khi hệ thống bắt đầu hoạt động của bạn thông qua 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() và getAction() để truy xuất dữ liệu và hành động liên quan đến Intent sắp tới. Bạn có thể gọi các phương thức này bất cứ lúc nào trong suốt 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à đoạn mã cho thấy 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 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à nút Mũi tên 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 cùng với công cụ trình quản lý hoạt động (am) để kiểm tra xem URI bộ lọc ý định mà bạn chỉ định cho đường liên kết sâu có phân giải thành hoạt động chính xác của ứng dụng hay không. Bạn có thể chạy lệnh adb trên một thiết bị hoặc một trình mô phỏng.

Cú pháp chung để kiểm thử URI của 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 mục tiêu đượ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

Kể từ Android 17, bạn cũng có thể sử dụng cờ --debug-link với am start để chẩn đoán cách hệ thống phân giải một URL và kiểm tra các bộ lọc ý định phù hợp hoặc quy tắc Đường liên kết động đến ứng dụng. Để biết thêm thông tin, hãy xem bài viết Chẩn đoán việc phân giải đường liên kết bằng cờ debug-link.

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à 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 tập hợp URI, bạn cũng phải yêu cầu hệ thống xác minh mối liên kết này. Bài viết Xác minh Đường liên kết trong ứ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 trong ứng dụng, hãy xem các tài nguyên sau: