Sau khi tạo lối tắt (shortcut), 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ụ như 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ể thông qua lối tắt. Trong trường hợp khác, bạn có thể quyết định vô hiệu hoá một lối tắt được ghim để ngăn ứng dụng của bạn thực hiện các thao tác lỗi thời hoặc bị thiếu. Hướng dẫn này cung cấp một số cách phổ biến để quản lý lối tắt.
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ưu ý quan trọng về bảo mật: Mọi thông tin về lối tắt đều được lưu trữ trong bộ nhớ mã hoá xác thực. Chính vì vậy mà ứng dụng sẽ không thể truy cập vào các lối tắt của người dùng cho đến khi họ mở khoá thiết bị.
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 nhấn và giữ biểu tượng trình chạy của ứng dụng, nhưng cử chỉ thực tế có thể khác đối với các ứng dụng trình chạy khác. Đối với Trợ lý Google, các lối tắt có thể được hiển thị trong Trợ lý hoặc 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 vào Cài đặt > Ứng dụng và thông báo, chọn một ứng dụng rồi nhấn Bộ nhớ > Xoá bộ nhớ.
Thứ tự hiển thị lối tắt
Khi trình chạy hiển thị lối tắt của ứng dụng, các lối tắt đó sẽ xuất hiện theo thứ tự sau:
-
Lối tắt tĩnh: Lối tắt có phương thức
isDeclaredInManifest()
trả về giá trịtrue
. -
Lối tắt động: Lối tắt có phương thức
ShortcutInfo.isDynamic()
trả về giá trịtrue
.
Trong mỗi loại lối tắt (tĩnh và động), các lối tắt sẽ được sắp xếp theo thứ tự tăng dần 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 lối tắt 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. Bạn có thể cập nhật hàng loạt các lối tắt hiện có khi gọi
updateShortcuts(Context, List)
,
addDynamicShortcuts(Context, List)
hoặc
setDynamicShortcuts(Context, List)
.
Lưu ý: Thứ hạng được điều chỉnh tự động nên từng loại lối tắt (tĩnh hoặc động) sẽ có thứ hạng riêng biệt. Ví dụ như nếu có 3 lối tắt động có thứ hạng 0, 1 và 2, thì việc thêm một lối tắt động khác có thứ hạng là 1 có nghĩa là lối tắt này sẽ được đặt ở vị trí thứ hai. Theo đó, lối tắt thứ ba và thứ tư sẽ di chuyển xuống gần cuối danh sách lối tắt và thứ hạng của các lối tắt đó sẽ chuyển thành 2 và 3.
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 lối tắt, 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. Tuỳ thuộc vào loại lối tắt mà bạn có thể thực hiện việc này bằng cách gán nhiều ý định, bắt đầu một hoạt động từ một hoạt động khác hoặc đặt cờ cho ý định.
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. Việc này sẽ đặt tất cả trừ hoạt động cuối cùng trong danh sách lên ngăn xếp lui (back stack). Sau đó, nếu người dùng quyết định nhấn nút quay lại trên thiết bị, họ sẽ thấy một hoạt động khác trong ứng dụng thay vì trở lại trình chạy của thiết bị.
Lưu ý: Khi người dùng chọn một lối tắt rồi nhấn phím quay lại, ứng dụng sẽ chạy hoạt động tương ứng với ý định kế cuối của lối tắt được liệt kê trong tệp tài nguyên. Khuynh hướng hành vi này sẽ tiếp tục khi nhấn nút quay lại nhiều lần cho đến khi người dùng xoá ngăn xếp lui mà lối tắt đã tạo. Khi người dùng nhấn nút quay lại sau đó, hệ thống sẽ đưa họ trở lại trình chạy.
Bắt đầu một hoạt động từ một hoạt động khác
Lối tắt tĩnh không thể có cờ ý định tuỳ chỉnh.
Ý định đầu tiên của lối tắt tĩnh sẽ luôn đặt
Intent.FLAG_ACTIVITY_NEW_TASK
và
Intent.FLAG_ACTIVITY_CLEAR_TASK
. Điều này có nghĩa là khi ứng dụng đang chạy, thì tất cả hoạt động hiện tại trong ứng dụng sẽ bị huỷ bỏ khi chạy một lối tắt tĩnh. Nếu không muốn, bạn có thể sử dụng một hoạt động gián tiếp (trampoline) hoặc một hoạt động ẩn mà bắt đầu một hoạt động khác trong
Activity.onCreate(Bundle)
, sau đó gọi
Activity.finish()
:
- Trong tệp
AndroidManifest.xml
, hoạt động gián tiếp phải bao gồm thuộc tính được gán choandroid:taskAffinity=""
. - Trong tệp tài nguyên lối tắt, ý định trong lối tắt tĩnh phải tham chiếu đến hoạt động gián tiếp.
Để biết thêm thông tin về hoạt động gián tiếp, hãy đọc Bắt đầu một hoạt động từ một hoạt động khác.
Đặt cờ cho ý định
Bạn có thể xuất bản lối tắt động với bất kỳ bộ cờ nào trong số các cờ Intent
.
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 đọc hướng dẫ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 số lượng
getMaxShortcutCountPerActivity()
của cả lối tắt tĩnh và động.
Tuy nhiên, 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 độ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 số lượng getMaxShortcutCountPerActivity()
lối tắt.
Ví dụ như giả sử getMaxShortcutCountPerActivity()
là 4:
- Một ứng dụng trò chuyện xuất bản 4 lối tắt động tương ứng với 4 cuộc trò chuyện gần đây nhất (c1, c2, c3, c4).
- Người dùng ghim tất cả 4 lối tắt.
-
Sau đó, người dùng bắt đầu thêm 3 cuộc trò chuyện khác (c5, c6 và c7), vì vậy ứng dụng của nhà xuất bản sẽ xuất bản lại các lối tắt động. Danh sách lối tắt động mới là: c4, c5, c6, c7.
Ứng dụng phải xoá c1, c2 và c3 vì ứng dụng chỉ được phép hiển thị tối đa 4 lối tắt động. Tuy nhiên, c1, c2 và c3 vẫn được ghim và người dùng có thể truy cập và chạy.
Giờ đây, 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. Nguyên nhân là do tổng số này bao gồm cả số lượng lối tắt tối đa và 3 lối tắt được ghim.
- Ứ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ụ như bạn có thể cập nhật nhóm 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. - Bạn cũng có thể sử dụng phương thức
addDynamicShortcuts(Context, List)
vàsetDynamicShortcuts(Context, List)
để cập nhật các lối tắt hiện có mà có cùng ID. Tuy nhiên, các phương thức đó không thể được dùng để cập nhật lối tắt không động, được ghim vì hai phương thức này chuyển đổi danh sách các lối tắt 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ý 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, bạn cũng phải thêm thư viện Tích hợp lối tắt của Google vào ứng dụng để các 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 đọc phần Các phương pháp hay nhất.
Xử lý các thay đổi về ngôn ngữ của hệ thống
Các ứng dụng nên cập nhật các lối tắt động và được ghim khi nhận được thông báo
Intent.ACTION_LOCALE_CHANGED
, cho biết ngôn ngữ (locale) của hệ thống đã thay đổi.
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 sẽ xuất hiện, trình chạy sẽ kiểm tra lịch sử kích hoạt của các lối tắt. Đối với các 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 ID của lối tắt khimột trong hai sự kiện sau 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 hoàn tất thủ công thao tác ứng với lối tắt.
Ứng dụng 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 của lối tắt khi sự kiện liên quan xảy ra. Việc đẩy 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 lối tắt liên quan cho người dùng. Vì phương thức pushDynamicShortcut()
báo cáo việc sử dụng khi được gọi, nên bạn không nên gọi phương thức reportShortcutUsed()
cho cùng những lối tắt đó.
Lưu ý: Bạn cần có thư viện Tích hợp lối tắt của Google (Google Shortcuts Integration) để cho phép các đường liên kết động mà ứng dụng đẩy vào để chúng đủ điều kiện xuất hiện trên các nền tảng của Google như Trợ lý Google. Khi thêm thư viện này vào ứng dụng, bạn cho phép Trợ lý nhập các đường liên kết động và đề xuất những đường liên kết đó cho người dùng trong ứng dụng Trợ lý.
Vô hiệu hoá lối tắt
Do ứng dụng và người dùng ứng dụng có thể ghim các lối tắt trên trình chạy của thiết bị, nên các lối tắt được ghim này có thể điều 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ể vô hiệu hoá 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()
. Phương thứ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 vô hiệu hoá mọi bản sao lối tắt đã ghim. 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. Phương thức này chấp nhận CharSequence
dưới dạng thông báo lỗi tuỳ chỉnh. Thông báo lỗi sẽ xuất hiện khi người dùng cố gắng chạy bất kỳ lối tắt bị vô hiệu hoá nào.
Lưu ý: Nếu bạn xoá một số lối tắt tĩnh trên ứng dụng khi cập nhật ứng dụng, thì hệ thống sẽ tự động vô hiệu hoá những lối tắt này.
Giới hạn số lần gọi
Khi sử dụng các phương thức
setDynamicShortcuts()
,
addDynamicShortcuts()
hoặc
updateShortcuts()
, hãy lưu ý rằng bạn chỉ có thể gọi các phương thức này một số lần nhất định trong ứng dụng nền, một ứng dụng không có hoạt động hoặc dịch vụ đang chạy ở nền trước. Giới hạn về số lần mà bạn có thể gọi các phương thức này được gọi là giới hạn số lần gọi. Tính năng này dùng để 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ần gọi,
isRateLimitingActive()
sẽ trả về giá trị đúng (true). Tuy nhiên, giới hạn số lần gọi sẽ được đặt lại trong một số sự kiện nhất định, vì vậy, ngay cả các ứng dụng nền cũng có thể gọi các phương thức ShortcutManager
cho đến khi đạt giới hạn số lần gọi. Những sự kiện này bao gồm:
- Ứ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 trong một thông báo.
Nếu gặp phải tình trạng giới hạn số lần gọi trong quá trình phát triển hoặc kiểm thử, bạn có thể vào Tuỳ chọn cho nhà phát triển > Đặt lại giới hạn tốc độ trong ShortcutManager trong phần cài đặt của thiết bị hoặc bạn có thể nhập lệnh sau trong 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 trong ứng dụng khi thay đổi thiết bị bằng cách đưa vào thuộc tính được gán
android:allowBackup="true"
trong tệp kê khai của ứng dụng.
Nếu bạn cho phép sao lưu và khôi phục, hãy lưu ý những vấn đề sau liên quan 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 trên thiết bị mới.
- Lối tắt động không được sao lưu nên bạn phải đưa logic vào ứng dụng để xuất bản lại khi người dùng mở ứng dụng trên thiết bị mới.
- Các lối tắt được ghim sẽ tự động khôi phục trên 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 được ghim. Chính vì vậy mà bạn nên lưu hình ảnh của lối tắt được ghim trong ứng dụng để có thể dễ dàng khôi phục trên các thiết bị mới.
Đoạn mã sau đây hướng dẫn 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 lối tắt được ghim của ứng dụng có được lưu giữ hay không:
Kotlin
class MyMainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (ShortcutManagerCompat.dynamicShortcuts.size == 0) { // Application restored. Need to re-publish dynamic shortcuts. if (ShortcutManagerCompat.pinnedShortcuts.size > 0) { // Pinned shortcuts have been 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. Need to re-publish dynamic shortcuts. if (ShortcutManagerCompat.getPinnedShortcuts().size() > 0) { // Pinned shortcuts have been restored. Use // updateShortcuts() to make sure they contain // up-to-date information. } } } // ... }
Tài nguyên khác
Mẫu Android AppShortcuts minh hoạ thêm về việc sử dụng quy trình được trình bày trên trang này.