Tạo đường liên kết sâu đến nội dung ứng dụng

Khi một đường liên kết được nhấp hoặc yêu cầu có lập trình gọi một ý định URI web, hệ thống Android sẽ thử từng hành động sau đây theo thứ tự tuần tự cho đến khi yêu cầu thành công:

  1. Mở ứng dụng mà người dùng ưu tiên có thể xử lý URI (nếu có).
  2. Mở ứng dụng duy nhất có sẵn 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.

Hãy làm theo các bước bên dưới để tạo và kiểm tra các đường liên kết đến nội dung của bạn. Bạn cũng có thể dùng Trợ lý về đường liên kết trong ứng dụng trong Android Studio để thêm Đường liên kết trong ứng dụng Android.

Lưu ý: Kể từ Android 12 (API cấp 31), ý định chung trên web sẽ chỉ giải quyết thành một hoạt động trong ứng dụng nếu ứng dụng của bạn được phê duyệt cho miền cụ thể có trong ý định web đó. Nếu ứng dụng của bạn không được phê duyệt cho miền, thì ý định web sẽ được chuyển sang ứng dụng trình duyệt mặc định của 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 của bạn, hãy thêm một bộ lọc ý định có chứa các phần tử và giá trị thuộc tính sau đây trong tệp kê khai:

<action>
Chỉ định thao tác theo ý định ACTION_VIEW để có thể truy cập bộ lọc ý định qua 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 hoạt động. Thẻ <data> ở mức tối thiểu phải bao gồm 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 hay pathPrefix của thuộc tính đó để phân biệt hoạt động nào mà hệ thống sẽ mở cho các đường dẫn URI khác nhau.

<category>
Bao gồm danh mục BROWSABLE. Đây là điều kiện bắt buộc để có thể truy cập bộ lọc ý định trên trình duyệt web. Nếu không có đường liên kết này, việc nhấp vào một đường liên kết trong trình duyệt sẽ không thể giải quyết vấn đề cho ứng dụng của bạn.

Đồng thời, bao gồm danh mục DEFAULT. Nhờ vậy, ứng dụng của bạn có thể phản hồi các ý định ngầm ẩn. Nếu không, 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 thấy 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 cho 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 chỉ khác nhau ở phần tử <data>. Mặc dù có thể đưa nhiều phần tử <data> vào cùng một bộ lọc, nhưng quan trọng là bạn phải tạo các bộ lọc riêng khi có ý định khai báo các URL duy nhất (chẳng hạn như một tổ hợp cụ thể giữ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 để giải thích cho tất cả biến thể của các thuộc tính kết hợp đó. Ví dụ: hãy xem xét những nội dung 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, API này thực sự hỗ trợ hai ngôn ngữ đó, cùng với các thành phần này: 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 cho cùng một Đường liên kết trong ứng dụng Android đã xác minh, thì không có gì đảm bảo về việc 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 bất kỳ Intent nào có URI phù hợ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 các bộ lọc ý định, hãy xem phần Cho phép các ứ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 một bộ lọc ý định, bạn có thể sử dụng dữ liệu do Intent cung cấp để xác định những gì bạn cần kết xuất. Gọi phương thức getData()getAction() để truy xuất dữ liệu và hành động 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 nên thực hiện trong các phương thức gọi lại sớm như onCreate() hoặc onStart().

Dưới đâ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 của người dùng:

  • Đường liên kết sâu phải đưa người dùng đến thẳng nội dung mà không cần có lời nhắc, trang xen kẽ hay thông tin đă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. Bạn có thể nhắc người dùng về các hoạt động tương tác tiếp theo hoặc khi họ mở ứng dụng qua Trình chạy.
  • Làm theo hướng dẫn thiết kế được mô tả trong phần Điều hướng bằng tính năng Quay lại và Lên để ứng dụng của bạn phù hợp với kỳ vọng của người dùng về việc di chuyển ngược sau khi họ truy cập vào ứ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 hoạt động liên kết sâu có phân giải đúng hoạt động ứng dụng 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 bên dưới cố gắng xem một hoạt động mục tiêu của ứng dụng 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

Phần khai báo tệp kê khai và trình xử lý ý định mà bạn thiết lập ở trên sẽ xác định mối kết nối giữa ứng dụng và trang web, cũng như những 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 kết nối này. Bài học tiếp theo 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: