Quản lý lối tắt

Sau khi tạo lối tắt, bạn có thể cần phải quản lý các lối tắt đó trong suốt thời gian hoạt động của ứng dụng. Ví dụ: bạn nên tối ưu hoá ứng dụng bằng cách xác định tần suất người dùng hoàn tất các thao tác cụ thể bằng lối tắt. Trong trường hợp khác, bạn có thể quyết định vô hiệu hoá lối tắt được ghim để ngăn ứng dụng thực hiện các thao tác lỗi thời hoặc bị thiếu. Đối với các lối tắt được tham chiếu trong các cuộc trò chuyện, bạn nên theo dõi việc sử dụng để cung cấp những tín hiệu cải thiện thứ hạng lối tắt.

Trang này mô tả một số cách phổ biến khác để quản lý khẩu lệnh nhanh.

Hành vi của lối tắt

Các phần sau chứa thông tin chung về hành vi của lối tắt, bao gồm chế độ hiển thị, thứ tự hiển thị và thứ hạng.

Chế độ hiển thị lối tắt

Lối tắt tĩnh và lối tắt động sẽ xuất hiện trong một trình chạy hoặc trợ lý được hỗ trợ khi người dùng thực hiện một cử chỉ hoặc lệnh thoại cụ thể. Trên các trình chạy được hỗ trợ, cử chỉ là thao tác chạm và giữ biểu tượng trình chạy của ứng dụng, nhưng cử chỉ có thể khác đối với các ứng dụng trình chạy khác. Với Trợ lý Google, các lối tắt có thể hiển thị trong Trợ lý hoặc khởi chạy thông qua lệnh thoại của người dùng.

Lớp LauncherApps cung cấp API để các ứng dụng trình chạy truy cập vào lối tắt.

Do lối tắt được ghim xuất hiện trong chính trình chạy, nên các lối tắt đó sẽ luôn hiển thị. Lối tắt được ghim chỉ bị xoá khỏi trình chạy trong các trường hợp sau:

  • Người dùng xoá lối tắt.
  • Đã gỡ cài đặt ứng dụng liên kết với lối tắt.
  • Người dùng xoá dữ liệu của một ứng dụng bằng cách chuyển đến phần Cài đặt > Ứng dụng và thông báo, chọn ứng dụng rồi nhấn vào Bộ nhớ > Xoá bộ nhớ.

Đích chia sẻ là một tập hợp con các lối tắt động xuất hiện trong hàng chia sẻ trực tiếp của trang chia sẻ trong Android.

Ảnh chụp màn hình của Trang chia sẻ nội dung trên Android
Hình 1. Trang chia sẻ nội dung về Android. Mục tiêu chia sẻ trực tiếp xuất hiện ở hàng đầu tiên, tiếp theo là xếp hạng ứng dụng rồi đến danh sách Ứng dụng.

Thứ tự hiển thị lối tắt

Khi trình chạy hiển thị lối tắt của một ứng dụng, các lối tắt đó phải xuất hiện theo thứ tự sau:

  1. Lối tắt tĩnh: lối tắt có phương thức isDeclaredInManifest() trả về true.
  2. Lối tắt động: lối tắt có phương thức ShortcutInfo.isDynamic() trả về true.

Trong mỗi loại lối tắt (tĩnh và động), lối tắt được sắp xếp theo thứ tự tăng thứ hạng theo ShortcutInfo.getRank. Trợ lý Google cũng xem xét thứ hạng lối tắt khi xác định các khẩu lệnh nhanh theo ngữ cảnh để hiển thị cho người dùng.

Thứ hạng là số nguyên không âm, liên tiếp nhau. Các lối tắt tĩnh được xếp hạng từ đầu đến cuối theo thứ tự xuất hiện trong tệp shortcuts.xml. Đối với khẩu lệnh nhanh động, bạn có thể cập nhật thứ hạng của các khẩu lệnh nhanh hiện có khi gọi updateShortcuts(Context, List), addDynamicShortcuts(Context, List), pushDynamicShortcut(Context, ShortcutInfoCompat) hoặc setDynamicShortcuts(Context, List).

Thứ tự của mục tiêu chia sẻ dựa trên nhiều yếu tố, bao gồm nhật ký người dùng trước đây, số ngày gần đây, tần suất, gợi ý thứ hạng, mức sử dụng ứng dụng và mức độ ưu tiên đặt ra cho cuộc trò chuyện được liên kết với lối tắt chia sẻ. Các mục tiêu chia sẻ được tạo bằng Shared Shortcuts API (API lối tắt chia sẻ) sẽ được ưu tiên hơn các mục tiêu chia sẻ do ChooserTargetService (đã ngừng sử dụng trong Android 11) tạo ra. Trên Android 12 trở lên, các mục tiêu chia sẻ do ChooserTargetService không dùng nữa tạo ra sẽ không còn xuất hiện trong trang chia sẻ nữa.

Hầu hết trình chạy đều hiển thị tối đa 4 lối tắt. Đối với bất kỳ tổ hợp lối tắt tĩnh và lối tắt động nào được xác định, trình chạy sẽ hiển thị tối đa 2 lối tắt tĩnh và 2 lối tắt động. Ví dụ: nếu bạn xác định 4 lối tắt tĩnh và tạo 3 lối tắt động theo phương thức lập trình, thì trình chạy sẽ hiển thị 2 lối tắt tĩnh đầu tiên và 2 lối tắt động được xếp hạng cao nhất.

Quản lý nhiều ý định và hoạt động

Nếu muốn ứng dụng thực hiện nhiều thao tác khi người dùng kích hoạt một khẩu lệnh nhanh, bạn có thể định cấu hình ứng dụng đó để kích hoạt các hoạt động liên tiếp. Bạn có thể hoàn thành việc này bằng cách chỉ định nhiều ý định, bắt đầu một hoạt động từ một hoạt động khác hoặc đặt cờ ý định, tuỳ thuộc vào loại lối tắt.

Gán nhiều ý định

Khi tạo lối tắt bằng ShortcutInfoCompat.Builder, bạn có thể sử dụng setIntents() thay vì setIntent(). Bằng cách gọi setIntents(), bạn có thể chạy nhiều hoạt động trong ứng dụng khi người dùng chọn một lối tắt, đặt tất cả trừ hoạt động gần đây nhất trong danh sách ở ngăn xếp lui. Sau đó, nếu người dùng nhấn vào nút quay lại của thiết bị, họ sẽ thấy một hoạt động khác trong ứng dụng của bạn thay vì quay lại trình chạy của thiết bị.

Bắt đầu một hoạt động từ một hoạt động khác

Lối tắt tĩnh không được có cờ ý định tuỳ chỉnh. Ý định đầu tiên của lối tắt tĩnh luôn có Intent.FLAG_ACTIVITY_NEW_TASKIntent.FLAG_ACTIVITY_CLEAR_TASK set. Tức là khi ứng dụng đang chạy, tất cả hoạt động hiện có trong ứng dụng sẽ bị huỷ bỏ khi bạn chạy một lối tắt tĩnh. Nếu không muốn hành vi này, bạn có thể sử dụng hoạt động đàn hồi (nhún nhảy) – một hoạt động vô hình bắt đầu một hoạt động khác – trong Activity.onCreate(Bundle) gọi Activity.finish():

  1. Trong tệp AndroidManifest.xml, hãy thêm thuộc tính android:taskAffinity="" vào hoạt động đàn hồi.
  2. Trong tệp tài nguyên lối tắt, hãy tham chiếu đến hoạt động đàn hồi trong ý định trong lối tắt tĩnh.

Để biết thêm thông tin về các hoạt động đàn hồi, hãy xem phần Bắt đầu một hoạt động từ một hoạt động khác.

Đặt cờ cho ý định

Bạn có thể phát hành lối tắt động bằng bất kỳ bộ cờ Intent nào. Bạn nên chỉ định Intent.FLAG_ACTIVITY_CLEAR_TASK cùng với các cờ khác. Ngược lại, nếu bạn cố gắng bắt đầu một tác vụ khác trong khi ứng dụng đang chạy, thì hoạt động mục tiêu có thể sẽ không xuất hiện.

Để tìm hiểu thêm về tác vụ và cờ ý định, hãy xem phần Tác vụ và ngăn xếp lui.

Cập nhật lối tắt

Biểu tượng trình chạy của mỗi ứng dụng có thể chứa tối đa một số lối tắt tĩnh và động kết hợp bằng giá trị mà getMaxShortcutCountPerActivity trả về. Không có giới hạn về số lượng lối tắt được ghim mà một ứng dụng có thể tạo.

Khi lối tắt động được ghim, ngay cả khi nhà xuất bản xoá lối tắt đó dưới dạng lối tắt động, thì lối tắt được ghim vẫn hiển thị và có thể khởi chạy. Điều này cho phép một ứng dụng có nhiều hơn getMaxShortcutCountPerActivity() số lượng lối tắt.

Hãy xem xét ví dụ sau. Giả sử giá trị mà getMaxShortcutCountPerActivity() trả về là 4:

  1. Một ứng dụng trò chuyện phát hành 4 lối tắt động, đại diện cho 4 cuộc trò chuyện gần đây nhất: c1, c2, c3 và c4.
  2. Người dùng ghim tất cả 4 lối tắt.
  3. Sau đó, người dùng bắt đầu 3 cuộc trò chuyện bổ sung: c5, c6 và c7. Ứng dụng của nhà xuất bản sẽ phát hành lại các lối tắt động. Danh sách phím tắt động mới là: c4, c5, c6 và c7.

Ứng dụng phải xoá c1, c2 và c3 vì ứng dụng không thể hiển thị nhiều hơn 4 lối tắt động. Tuy nhiên, c1, c2 và c3 vẫn là các lối tắt được ghim mà người dùng có thể truy cập và khởi chạy.

Sau đó, người dùng có thể truy cập vào tổng cộng 7 lối tắt liên kết đến các hoạt động trong ứng dụng của nhà xuất bản. Điều này là do tổng số này bao gồm số lượng lối tắt tối đa và 3 lối tắt được ghim.

  1. Ứng dụng có thể dùng updateShortcuts(Context, List) để cập nhật bất kỳ lối tắt nào trong số 7 lối tắt hiện có. Ví dụ: bạn có thể cập nhật tập hợp lối tắt này khi biểu tượng của các ứng dụng trò chuyện ngang hàng thay đổi.
  2. Bạn có thể sử dụng phương thức addDynamicShortcuts(Context, List)setDynamicShortcuts(Context, List) để cập nhật các lối tắt hiện có bằng cùng mã nhận dạng. Tuy nhiên, bạn không thể dùng các phương thức này để cập nhật các lối tắt không động và được ghim vì 2 phương thức này cố gắng chuyển đổi danh sách lối tắt nhất định thành lối tắt động.

Không có giới hạn về số lượng lối tắt có thể đẩy để hiển thị trên các ứng dụng trợ lý, chẳng hạn như Trợ lý Google. Sử dụng phương thức pushDynamicShortcut() của thư viện Jetpack ShortcutManagerCompat để tạo và cập nhật lối tắt để sử dụng trên các ứng dụng trợ lý. Ngoài ra, hãy thêm thư viện Tích hợp lối tắt của Google vào ứng dụng của bạn để giúp các đường liên kết động đủ điều kiện xuất hiện trên Trợ lý Google.

Để tìm hiểu thêm về nguyên tắc lối tắt ứng dụng, bao gồm cả cách cập nhật lối tắt, hãy xem Các phương pháp hay nhất về lối tắt.

Xử lý các thay đổi về ngôn ngữ của hệ thống

Các ứng dụng phải cập nhật lối tắt động và được ghim khi nhận được thông báo Intent.ACTION_LOCALE_CHANGED cho biết có thay đổi đối với ngôn ngữ hệ thống.

Theo dõi việc sử dụng lối tắt

Để xác định những tình huống mà lối tắt tĩnh và động xuất hiện, trình chạy sẽ kiểm tra nhật ký kích hoạt của các lối tắt. Đối với lối tắt tĩnh, bạn có thể theo dõi thời điểm người dùng hoàn tất các thao tác cụ thể trong ứng dụng bằng cách gọi phương thức reportShortcutUsed() và truyền vào đó mã nhận dạng của lối tắt khi một trong các sự kiện sau đây xảy ra:

  • Người dùng chọn lối tắt có ID được cung cấp.
  • Trong ứng dụng, người dùng tự hoàn tất thao tác tương ứng với lối tắt đó.

Ứng dụng của bạn theo dõi việc sử dụng lối tắt động bằng cách gọi phương thức pushDynamicShortcut() và truyền vào mã nhận dạng lối tắt khi một sự kiện liên quan xảy ra. Việc đẩy việc sử dụng lối tắt động bằng phương thức này cho phép các ứng dụng trợ lý như Trợ lý Google đề xuất khẩu lệnh nhanh phù hợp cho người dùng. Vì phương thức pushDynamicShortcut() báo cáo mức sử dụng khi được gọi, bạn không nên gọi phương thức reportShortcutUsed() cho cùng các lối tắt.

Đối với các lối tắt liên quan đến cuộc trò chuyện, bạn cần phải theo dõi mức sử dụng thư đi và thư đến. Để biết thông tin chi tiết, hãy xem các phương pháp hay nhất về liên quan đến người và cuộc trò chuyện.

Vô hiệu hoá lối tắt

Vì ứng dụng của bạn và người dùng ứng dụng có thể ghim các lối tắt vào trình chạy của thiết bị, nên các lối tắt được ghim này có thể hướng người dùng đến các thao tác đã lỗi thời hoặc không còn tồn tại trong ứng dụng. Để xử lý trường hợp này, bạn có thể tắt các lối tắt mà bạn không muốn người dùng chọn bằng cách gọi disableShortcuts. Thao tác này sẽ xoá các lối tắt được chỉ định khỏi danh sách lối tắt tĩnh và động, đồng thời tắt bản sao được ghim của các lối tắt này. Bạn cũng có thể sử dụng phiên bản nạp chồng của phương thức này chấp nhận CharSequence dưới dạng thông báo lỗi tuỳ chỉnh. Sau đó, thông báo lỗi đó sẽ xuất hiện khi người dùng cố gắng chạy một lối tắt đã bị vô hiệu hoá.

Giới hạn số lượng yêu cầu

Khi sử dụng phương thức setDynamicShortcuts(), addDynamicShortcuts() hoặc updateShortcuts(), bạn chỉ có thể gọi các phương thức này một số lần cụ thể trong ứng dụng ở chế độ nền – một ứng dụng không có hoạt động hoặc dịch vụ ở nền trước. Giới hạn về số lần cụ thể mà bạn có thể gọi các phương thức này được gọi là giới hạn tốc độ. Tính năng này ngăn ShortcutManagerCompat sử dụng quá nhiều tài nguyên thiết bị.

Khi đang áp dụng giới hạn số lượng yêu cầu, isRateLimitingActive() sẽ trả về giá trị true. Tuy nhiên, giới hạn số lượng yêu cầu được đặt lại trong một số sự kiện nhất định, vì vậy, ngay cả ứng dụng nền cũng có thể gọi các phương thức ShortcutManager cho đến khi đạt lại giới hạn số lượng yêu cầu. Có thể kể đến những sự kiện sau đây:

  • Ứng dụng chạy ở nền trước.
  • Ngôn ngữ bản địa hoá của hệ thống thay đổi.
  • Người dùng thực hiện thao tác trả lời cùng dòng trên một thông báo.

Nếu gặp phải tình trạng giới hạn số lượng yêu cầu trong quá trình phát triển hoặc kiểm thử, bạn có thể chọn Developer Options > Reset ShortcutManager rate-limiting (Tuỳ chọn cho nhà phát triển > Đặt lại giới hạn tốc độ ShortcutManager) trong chế độ cài đặt của thiết bị hoặc bạn có thể nhập lệnh sau vào adb:

$ adb shell cmd shortcut reset-throttling [ --user your-user-id ]

Sao lưu và khôi phục

Bạn có thể cho phép người dùng thực hiện các thao tác sao lưu và khôi phục trên ứng dụng khi thay đổi thiết bị bằng cách thêm thuộc tính android:allowBackup="true" vào tệp kê khai của ứng dụng. Nếu bạn hỗ trợ tính năng sao lưu và khôi phục, hãy lưu ý những điểm sau đây về lối tắt ứng dụng:

  • Các lối tắt tĩnh được tự động xuất bản lại, nhưng chỉ sau khi người dùng cài đặt lại ứng dụng của bạn trên một thiết bị mới.
  • Lối tắt động không được sao lưu, vì vậy, hãy đưa logic vào ứng dụng của bạn để xuất bản lại khi người dùng mở ứng dụng trên một thiết bị mới.
  • Các lối tắt đã ghim sẽ tự động khôi phục vào trình chạy của thiết bị, nhưng hệ thống không sao lưu các biểu tượng liên kết với lối tắt đã ghim. Do đó, hãy lưu hình ảnh của lối tắt đã ghim trong ứng dụng để dễ dàng khôi phục trên thiết bị mới.

Đoạn mã sau đây cho biết cách tốt nhất để khôi phục lối tắt động của ứng dụng và cách kiểm tra xem các lối tắt đã ghim của ứng dụng có được giữ nguyên hay không:

Kotlin

class MyMainActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (ShortcutManagerCompat.dynamicShortcuts.size == 0) {
            // Application restored. Re-publish dynamic shortcuts.
            if (ShortcutManagerCompat.pinnedShortcuts.size > 0) {
                // Pinned shortcuts are restored. Use updateShortcuts() to make
                // sure they contain up-to-date information.
            }

        }
    }
    // ...
}

Java

public class MainActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (ShortcutManagerCompat.getDynamicShortcuts().size() == 0) {
            // Application restored. Re-publish dynamic shortcuts.
            if (ShortcutManagerCompat.getPinnedShortcuts().size() > 0) {
                // Pinned shortcuts are restored. Use pdateShortcuts() to make
                // sure they contain up-to-date information.
            }
        }
    }
    // ...
}