
Sử dụng các mục tiêu Chia sẻ trực tiếp để giúp người dùng các ứng dụng khác chia sẻ URL, hình ảnh hoặc các loại dữ liệu khác với ứng dụng của bạn một cách dễ dàng và nhanh chóng hơn. Tính năng Chia sẻ trực tiếp hoạt động bằng cách trình bày danh bạ từ các ứng dụng nhắn tin và mạng xã hội ngay trên Trang chia sẻ của Android mà người dùng không cần phải chọn ứng dụng rồi tìm kiếm danh bạ.
ShortcutManagerCompat
là một API AndroidX cung cấp Lối tắt chia sẻ và có khả năng tương thích ngược với API ChooserTargetService
không dùng nữa. Đây là cách ưu tiên để xuất bản cả Lối tắt để chia sẻ và ChooserTargets
. Để xem hướng dẫn, hãy xem phần Sử dụng AndroidX để cung cấp cả Lối tắt chia sẻ và ChooserTargets trên trang này.
Xuất bản mục tiêu Chia sẻ trực tiếp
Hàng Chia sẻ trực tiếp của trang chia sẻ chỉ hiển thị các lối tắt động do Sharing Shortcuts API cung cấp. Hoàn tất các bước sau để xuất bản các mục tiêu của tính năng Chia sẻ trực tiếp.
Trong tệp tài nguyên XML của ứng dụng, hãy khai báo các phần tử
share-target
.<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> <share-target android:targetClass="com.example.android.sharingshortcuts.SendMessageActivity"> <data android:mimeType="text/plain" /> <category android:name="com.example.android.sharingshortcuts.category.TEXT_SHARE_TARGET" /> </share-target> </shortcuts>
Khi ứng dụng của bạn khởi động, hãy dùng
setDynamicShortcuts
để sắp xếp các lối tắt động theo mức độ quan trọng.Chỉ số càng thấp thì mức độ quan trọng càng cao. Nếu bạn đang tạo một ứng dụng giao tiếp, thì đó có thể là những cuộc trò chuyện hàng đầu được sắp xếp theo mức độ gần đây khi xuất hiện trong ứng dụng của bạn. Đừng xuất bản các lối tắt đã cũ; một cuộc trò chuyện không có hoạt động của người dùng trong 30 ngày qua được coi là đã cũ.
Kotlin
ShortcutManagerCompat.setDynamicShortcuts(myContext, listOf(shortcut1, shortcut2, ..))
Java
List<ShortcutInfoCompat> shortcuts = new ArrayList<>(); shortcuts.add(shortcut1); shortcuts.add(shortcut2); ... ShortcutManagerCompat.setDynamicShortcuts(myContext, shortcuts);
Nếu bạn đang phát triển một ứng dụng giao tiếp, hãy báo cáo việc sử dụng lối tắt thông qua
pushDynamicShortcut
ngay lập tức mỗi khi người dùng nhận hoặc gửi tin nhắn cho một người liên hệ. Hãy xem phần Báo cáo việc sử dụng lối tắt cho ứng dụng giao tiếp trên trang này để biết thêm thông tin. Ví dụ: báo cáo mức sử dụng cho những tin nhắn do người dùng gửi bằng cách chỉ định các liên kết tính năng trong lối tắt thông quaShortcutInfoCompat.Builder#addCapabilityBinding
với tính năngactions.intent.SEND_MESSAGE
.Kotlin
val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(firstName) .setLongLabel(fullName) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.SEND_MESSAGE").build() ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)
Java
ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(firstName) .setLongLabel(fullName) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.SEND_MESSAGE") .build(); ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);
Nếu người dùng xoá một người liên hệ, hãy dùng biểu tượng
removeLongLivedShortcut
. Đây là cách ưu tiên để xoá lối tắt, bất kể lối tắt đó có được các dịch vụ hệ thống lưu vào bộ nhớ đệm hay không. Đoạn mã sau đây cho thấy ví dụ về cách thực hiện việc này.Kotlin
val deleteShortcutId = "..." ShortcutManagerCompat.removeLongLivedShortcuts(myContext, listOf(deleteShortcutId))
Java
String deleteShortcutId = "..."; ShortcutManagerCompat.removeLongLivedShortcuts( myContext, Arrays.asList(deleteShortcutId));
Cải thiện thứ hạng của mục tiêu Chia sẻ trực tiếp
Trang chia sẻ nội dung của Android cho thấy một số lượng cố định các mục tiêu Chia sẻ trực tiếp. Các đề xuất này được sắp xếp theo thứ hạng. Bạn có thể cải thiện thứ hạng của các lối tắt bằng cách làm như sau:
- Đảm bảo tất cả
shortcutIds
đều là giá trị duy nhất và không bao giờ được dùng lại cho các mục tiêu khác nhau. - Đảm bảo lối tắt tồn tại lâu dài bằng cách gọi
setLongLived(true)
. - Đối với các lối tắt liên quan đến cuộc trò chuyện, hãy báo cáo việc sử dụng lối tắt cho tin nhắn đi và đến bằng cách xuất bản lại các lối tắt tương ứng thông qua
ShortcutManagerCompat.pushDynamicShortcut
. Hãy xem phần Báo cáo mức sử dụng lối tắt cho ứng dụng giao tiếp trên trang này để biết thông tin chi tiết. - Tránh cung cấp các mục tiêu Chia sẻ trực tiếp không liên quan hoặc lỗi thời, chẳng hạn như danh bạ mà người dùng chưa nhắn tin trong vòng 30 ngày qua.
- Đối với ứng dụng SMS, hãy tránh cung cấp lối tắt cho mã rút gọn hoặc cuộc trò chuyện được xác định là có khả năng là nội dung rác. Người dùng khó có thể chia sẻ những cuộc trò chuyện đó.
- Gọi
setCategories()
để liên kết lối tắt với các thuộc tínhmimeType
thích hợp. Ví dụ: đối với một ứng dụng SMS, nếu người liên hệ không bật RCS hoặc MMS, bạn sẽ không liên kết lối tắt tương ứng với các loại MIME không phải văn bản, chẳng hạn nhưimage/*
vàvideo/*
. - Đối với một cuộc trò chuyện nhất định, sau khi một lối tắt động được đẩy và việc sử dụng được báo cáo, đừng thay đổi mã nhận dạng lối tắt. Điều này đảm bảo việc lưu giữ dữ liệu sử dụng để xếp hạng.
Nếu người dùng nhấn vào bất kỳ mục tiêu nào của tính năng Chia sẻ trực tiếp, ứng dụng của bạn phải đưa họ đến một giao diện người dùng nơi họ có thể thực hiện hành động trực tiếp trên chủ đề của mục tiêu. Đừng cho người dùng thấy giao diện người dùng phân biệt và đừng đặt họ vào một giao diện người dùng không liên quan đến mục tiêu được nhấn. Ví dụ: trong một ứng dụng nhắn tin, khi nhấn vào một mục tiêu Chia sẻ trực tiếp, người dùng sẽ được chuyển đến chế độ xem cuộc trò chuyện với người mà họ đã chọn. Bàn phím sẽ xuất hiện và thông báo sẽ được điền sẵn dữ liệu được chia sẻ.
Sharing Shortcuts API
Kể từ Android 10 (API cấp 29), ShortcutInfo.Builder
đã thêm các phương thức và tính năng nâng cao cung cấp thông tin bổ sung về mục tiêu chia sẻ:
setCategories()
- Bắt đầu từ Android 10, các danh mục cũng được dùng để lọc những lối tắt có thể xử lý ý định hoặc hành động chia sẻ. Hãy xem phần Khai báo đích chia sẻ để biết thông tin chi tiết. Trường này là bắt buộc đối với các lối tắt được dùng làm mục tiêu chia sẻ.
setLongLived()
Chỉ định xem một lối tắt có hợp lệ hay không khi lối tắt đó đã bị ứng dụng huỷ xuất bản hoặc ẩn (dưới dạng lối tắt động hoặc lối tắt được ghim). Nếu là một lối tắt tồn tại lâu dài, thì lối tắt đó có thể được lưu vào bộ nhớ đệm bởi nhiều dịch vụ hệ thống, ngay cả sau khi bị huỷ xuất bản dưới dạng một lối tắt động.
Việc tạo một lối tắt có thời gian tồn tại lâu dài có thể cải thiện thứ hạng của lối tắt đó. Hãy xem bài viết Đạt được thứ hạng cao nhất để biết thông tin chi tiết.
setShortLabel()
,setLongLabel()
Khi xuất bản một lối tắt cho một cá nhân, vui lòng thêm họ tên của người đó vào
setLongLabel()
và mọi tên ngắn, chẳng hạn như biệt hiệu hoặc tên, vàosetShortLabel()
.
Hãy xem ví dụ về cách xuất bản Lối tắt chia sẻ trên GitHub.
Cung cấp hình ảnh lối tắt
Để tạo Lối tắt chia sẻ, bạn cần thêm hình ảnh thông qua biểu tượng setIcon()
.
Lối tắt chia sẻ có thể xuất hiện trên các nền tảng hệ thống và có thể được định hình lại.
Ngoài ra, một số thiết bị chạy Android phiên bản 7, 8 hoặc 9 (API cấp 25, 26, 27 và 28) có thể chỉ hiển thị biểu tượng bitmap mà không có nền, điều này làm giảm đáng kể độ tương phản. Để đảm bảo lối tắt của bạn xuất hiện như dự kiến, hãy cung cấp một bitmap thích ứng bằng cách sử dụng IconCompat.createWithAdaptiveBitmap()
.
Đảm bảo rằng các bitmap thích ứng tuân theo cùng nguyên tắc và kích thước được đặt cho biểu tượng thích ứng. Cách phổ biến nhất để thực hiện việc này là điều chỉnh tỷ lệ của bitmap hình vuông dự kiến thành 72x72 dp và đặt bitmap đó vào giữa một canvas trong suốt có kích thước 108x108 dp. Nếu biểu tượng của bạn có các vùng trong suốt, bạn cần thêm màu nền; nếu không, các vùng trong suốt sẽ xuất hiện màu đen.
Không cung cấp hình ảnh được che theo một hình dạng cụ thể. Ví dụ: trước Android 10 (API cấp 29), thường có các hình đại diện người dùng cho ChooserTarget
của tính năng Chia sẻ trực tiếp được che thành hình tròn. Trang chia sẻ nội dung trong Android và các nền tảng hệ thống khác trong Android 10 hiện định hình và tạo chủ đề cho hình ảnh lối tắt.
Phương thức ưu tiên để cung cấp Lối tắt chia sẻ, thông qua ShortcutManagerCompat
, tự động định hình các đối tượng Chia sẻ trực tiếp ChooserTarget
tương thích ngược thành hình tròn cho bạn.
Khai báo đích chia sẻ
Bạn phải khai báo mục tiêu chia sẻ trong tệp tài nguyên của ứng dụng, tương tự như định nghĩa lối tắt tĩnh. Thêm các định nghĩa về mục tiêu chia sẻ bên trong phần tử gốc <shortcuts>
trong tệp tài nguyên, cùng với các định nghĩa khác về lối tắt tĩnh. Mỗi phần tử <share-targets>
chứa thông tin về kiểu dữ liệu được chia sẻ, các danh mục trùng khớp và lớp mục tiêu sẽ xử lý ý định chia sẻ. Mã XML sẽ có dạng như sau:
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> <share-target android:targetClass="com.example.android.sharingshortcuts.SendMessageActivity"> <data android:mimeType="text/plain" /> <category android:name="com.example.android.sharingshortcuts.category.TEXT_SHARE_TARGET" /> </share-target> </shortcuts>
Phần tử dữ liệu trong mục tiêu chia sẻ tương tự như thông số kỹ thuật dữ liệu trong bộ lọc ý định. Mỗi mục tiêu chia sẻ có thể có nhiều danh mục. Các danh mục này chỉ được dùng để so khớp các lối tắt đã xuất bản của một ứng dụng với các định nghĩa về mục tiêu chia sẻ của ứng dụng đó. Danh mục có thể có bất kỳ giá trị tuỳ ý nào do ứng dụng xác định.
Trong trường hợp người dùng chọn Lối tắt chia sẻ trong Trang chia sẻ nội dung trong Android khớp với ví dụ về target-share ở trên, ứng dụng sẽ nhận được ý định chia sẻ sau đây:
Action: Intent.ACTION_SEND ComponentName: {com.example.android.sharingshortcuts / com.example.android.sharingshortcuts.SendMessageActivity} Data: Uri to the shared content EXTRA_SHORTCUT_ID: <ID of the selected shortcut>
Nếu người dùng mở đích chia sẻ từ lối tắt trên trình chạy, ứng dụng sẽ nhận được ý định được tạo khi thêm lối tắt chia sẻ vào ShortcutManagerCompat.
Vì đây là một ý định khác, nên Intent.EXTRA_SHORTCUT_ID
sẽ không có sẵn và bạn sẽ phải truyền mã nhận dạng theo cách thủ công nếu cần.
Báo cáo về việc sử dụng lối tắt cho ứng dụng giao tiếp
Nếu đang phát triển một ứng dụng giao tiếp, bạn có thể cải thiện thứ hạng của mình trong Trang chia sẻ Android bằng cách báo cáo mức sử dụng cho cả tin nhắn đi và đến.
Để làm như vậy, hãy xuất bản lại lối tắt trò chuyện đại diện cho người liên hệ thông qua ShortcutManagerCompat.pushDynamicShortcut
.
Các chế độ liên kết khả năng và cách sử dụng lối tắt tương thích ngược với Android 5.0 (API 21).
Báo cáo về việc sử dụng lối tắt cho tin nhắn gửi đi
Về chức năng, việc báo cáo mức sử dụng cho các tin nhắn do người dùng gửi tương tự như việc nhấp vào nút "gửi" sau khi tạo tin nhắn.
Để kích hoạt báo cáo về việc sử dụng, hãy chỉ định các liên kết tính năng trong lối tắt thông qua ShortcutInfoCompat.Builder#addCapabilityBinding
bằng tính năng actions.intent.SEND_MESSAGE
.
Kotlin
val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(firstName) .setLongLabel(fullName) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.SEND_MESSAGE").build() ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)
Java
ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(firstName) .setLongLabel(fullName) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.SEND_MESSAGE") .build(); ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);
Nếu thông báo gửi đi là cho một cuộc trò chuyện nhóm, bạn cũng phải thêm giá trị tham số Audience
vì loại recipient
được liên kết với chức năng này.
Kotlin
val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(groupShortTitle) .setLongLabel(groupLongTitle) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.SEND_MESSAGE", "message.recipient.@type", listOf("Audience")).build() ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)
Java
ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(groupShortTitle) .setLongLabel(groupLongTitle) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.SEND_MESSAGE", "message.recipient.@type", Arrays.asList("Audience")) .build(); ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);
Báo cáo về việc sử dụng lối tắt cho tin nhắn đến
Để kích hoạt báo cáo sử dụng khi người dùng nhận được một tin nhắn, chẳng hạn như SMS, tin nhắn trò chuyện, email hoặc thông báo, bạn phải chỉ định thêm các liên kết tính năng trong lối tắt thông qua ShortcutInfoCompat.Builder#addCapabilityBinding
bằng tính năng actions.intent.RECEIVE_MESSAGE
.
Kotlin
val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(firstName) .setLongLabel(fullName) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.RECEIVE_MESSAGE").build() ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)
Java
ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(firstName) .setLongLabel(fullName) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.RECEIVE_MESSAGE") .build(); ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);
Nếu tin nhắn đến từ một cuộc trò chuyện nhóm, bạn cũng phải thêm giá trị tham số Audience
vì loại sender
được liên kết với khả năng này.
Kotlin
val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(groupShortTitle) .setLongLabel(groupLongTitle) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.RECEIVE_MESSAGE", "message.sender.@type", listOf("Audience")).build() ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)
Java
ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier) ... .setShortLabel(groupShortTitle) .setLongLabel(groupLongTitle) .setCategories(matchedCategories) .setLongLived(true) .addCapabilityBinding("actions.intent.RECEIVE_MESSAGE", "message.sender.@type", Arrays.asList("Audience")) .build(); ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);
Sử dụng AndroidX để cung cấp cả Lối tắt để chia sẻ và ChooserTargets
Để có thể hoạt động với thư viện tương thích AndroidX, tệp kê khai của ứng dụng phải chứa tập hợp meta-data chooser-target-service và intent-filters. Xem Direct Share API ChooserTargetService
hiện tại.
Dịch vụ này đã được khai báo trong thư viện tương thích, vì vậy, người dùng không cần khai báo dịch vụ trong tệp kê khai của ứng dụng. Tuy nhiên, bạn phải xem xét đường liên kết từ hoạt động chia sẻ đến dịch vụ này như một nhà cung cấp mục tiêu của bộ chọn.
Trong ví dụ sau, quá trình triển khai ChooserTargetService
là androidx.core.content.pm.ChooserTargetServiceCompat
, đã được xác định trong AndroidX:
<activity android:name=".SendMessageActivity" android:label="@string/app_name" android:theme="@style/SharingShortcutsDialogTheme"> <!-- This activity can respond to Intents of type SEND --> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <!-- Only needed if you import the sharetarget AndroidX library that provides backwards compatibility with the old DirectShare API. The activity that receives the Sharing Shortcut intent needs to be taken into account with this chooser target provider. --> <meta-data android:name="android.service.chooser.chooser_target_service" android:value="androidx.sharetarget.ChooserTargetServiceCompat" /> </activity>
Câu hỏi thường gặp về lối tắt để chia sẻ
Dữ liệu về việc sử dụng lối tắt được lưu trữ như thế nào và có rời khỏi thiết bị không?
Các lối tắt được lưu trữ hoàn toàn trên thiết bị trong thư mục dữ liệu hệ thống trong một phân vùng ổ đĩa được mã hoá. Chỉ các dịch vụ hệ thống và chính ứng dụng xuất bản các lối tắt mới có thể truy cập vào thông tin trong lối tắt, chẳng hạn như biểu tượng, ý định, tên của người dùng và tài nguyên.
Lịch sử của tính năng Chia sẻ trực tiếp là gì?
Chúng tôi đã giới thiệu tính năng Chia sẻ trực tiếp trong Android 6.0 (API cấp 23) để cho phép các ứng dụng cung cấp các đối tượng ChooserTarget
thông qua một ChooserTargetService
. Kết quả được truy xuất một cách phản ứng theo yêu cầu, dẫn đến thời gian tải mục tiêu chậm.
Trong Android 10 (API cấp 29), chúng tôi đã thay thế API DirectShare ChooserTargetService
bằng API Lối tắt chia sẻ mới. Thay vì truy xuất kết quả một cách phản ứng theo yêu cầu, Sharing Shortcuts API cho phép các ứng dụng xuất bản trước các mục tiêu Direct Share. Điều này giúp tăng tốc nhanh chóng quá trình truy xuất các mục tiêu của tính năng Chia sẻ trực tiếp khi chuẩn bị ShareSheet. Cơ chế ChooserTargetService
Chia sẻ trực tiếp sẽ tiếp tục hoạt động, nhưng hệ thống sẽ xếp hạng các mục tiêu được cung cấp theo cách này thấp hơn bất kỳ mục tiêu nào sử dụng Sharing Shortcuts API.
Android 11 (API cấp 30) đã ngừng sử dụng dịch vụ ChooserTargetService
và Sharing Shortcuts API là cách duy nhất để cung cấp các mục tiêu Chia sẻ trực tiếp.
Lối tắt đã xuất bản cho mục tiêu chia sẻ khác với lối tắt của trình chạy như thế nào (cách sử dụng lối tắt thông thường khi nhấn và giữ biểu tượng ứng dụng trong trình chạy)?
Mọi lối tắt được xuất bản cho mục đích "mục tiêu chia sẻ" cũng là một lối tắt của trình chạy và sẽ xuất hiện trong trình đơn khi bạn nhấn và giữ biểu tượng ứng dụng. Giới hạn tối đa về số lượng lối tắt cho mỗi hoạt động cũng áp dụng cho tổng số lối tắt mà một ứng dụng đang xuất bản (kết hợp mục tiêu chia sẻ và lối tắt cũ của trình chạy).
Hướng dẫn về số lượng lối tắt chia sẻ mà bạn nên xuất bản.
Số lượng lối tắt chia sẻ bị giới hạn ở mức tương tự như số lượng lối tắt động có sẵn thông qua getMaxShortcutCountPerActivity(android.content.Context)
. Bạn có thể xuất bản bất kỳ số nào trong giới hạn đó nhưng phải lưu ý rằng các lối tắt chia sẻ có thể xuất hiện trong thao tác nhấn và giữ trình chạy ứng dụng cũng như trong bảng chia sẻ. Hầu hết trình chạy ứng dụng khi người dùng nhấn và giữ đều hiển thị tối đa 4 hoặc 5 lối tắt ở chế độ dọc và 8 lối tắt ở chế độ ngang. Hãy xem Câu hỏi thường gặp này để biết thêm thông tin và hướng dẫn về cách chia sẻ lối tắt.