Giống như việc một ứng dụng có thể gửi dữ liệu đến các ứng dụng khác, nó cũng có thể nhận dữ liệu từ ứng dụng. Suy nghĩ về cách người dùng tương tác với ứng dụng của bạn và loại dữ liệu mà bạn muốn nhận từ các ứng dụng khác. Ví dụ: trên mạng xã hội ứng dụng mạng có thể muốn nhận nội dung văn bản, chẳng hạn như URL trang web thú vị này từ một ứng dụng khác.
Người dùng các ứng dụng khác thường xuyên gửi dữ liệu đến ứng dụng của bạn thông qua hệ điều hành Android Trang chia sẻ nội dung hoặc trình phân giải ý định. Các ứng dụng gửi dữ liệu đến ứng dụng của bạn phải đặt Loại MIME cho dữ liệu đó. Ứng dụng của bạn có thể nhận dữ liệu do một ứng dụng khác gửi trong các cách sau:
Activity
có thẻintent-filter
phù hợp trong tệp kê khai- Chia sẻ lối tắt do ứng dụng của bạn xuất bản.
Mục tiêu Chia sẻ trực tiếp là các đường liên kết sâu đến một Hoạt động cụ thể trong ứng dụng. Họ thường đại diện cho một người hoặc một nhóm và Trang chia sẻ nội dung Android sẽ hiển thị họ. Ví dụ: một ứng dụng nhắn tin có thể đưa ra mục tiêu Chia sẻ trực tiếp cho một người liên kết sâu trực tiếp vào cuộc trò chuyện với người đó. Xem Cung cấp mục tiêu Chia sẻ trực tiếp cho .
Hỗ trợ loại MIME
Lý tưởng nhất là một ứng dụng phải nhận được phạm vi MIME lớn nhất có thể.
Ví dụ: một ứng dụng nhắn tin được thiết kế để gửi văn bản, hình ảnh và video
lý tưởng nhất là hỗ trợ nhận text/*
, image/*
và video/*
. Sau đây là một vài
các loại MIME phổ biến để gửi và nhận dữ liệu đơn giản trong Android.
Người nhận đăng ký | Người gửi gửi |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
Đuôi tệp được hỗ trợ | application/pdf |
Hãy tham khảo sổ đăng ký chính thức IANA về các loại nội dung nghe nhìn MIME.
Tạo mục tiêu chia sẻ tuyệt vời
Khi người dùng nhấn vào một mục tiêu chia sẻ được liên kết với một hoạt động cụ thể, họ xác nhận và chỉnh sửa được nội dung được chia sẻ trước khi sử dụng. Đây là đặc biệt quan trọng đối với dữ liệu văn bản.
Nhận dữ liệu kèm theo một hoạt động
Việc nhận dữ liệu thông qua một hoạt động bao gồm việc cập nhật tệp kê khai, xử lý nội dung đến và đảm bảo rằng người dùng nhận ra ứng dụng của bạn.
Cập nhật tệp kê khai
Bộ lọc ý định cho hệ thống biết ý định mà một thành phần ứng dụng chấp nhận.
Tương tự như cách bạn tạo ý định bằng hành động ACTION_SEND
trong
Gửi dữ liệu đơn giản đến các ứng dụng khác
bài học, bạn sẽ tạo bộ lọc ý định để nhận ý định bằng thao tác này. Bạn
hãy xác định bộ lọc ý định trong tệp kê khai bằng cách sử dụng phần tử <intent-filter>
.
Ví dụ: nếu ứng dụng của bạn xử lý việc nhận nội dung văn bản, một tệp kê khai
bao gồm một hoặc nhiều hình ảnh thuộc bất kỳ loại nào sẽ trông giống như đoạn mã sau:
<activity android:name=".ui.MyActivity" > <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> </activity>
Khi một ứng dụng khác cố gắng chia sẻ bất kỳ nội dung nào trong số này bằng cách tạo một
ý định và chuyển ý định đó đến startActivity()
, ứng dụng của bạn
được liệt kê dưới dạng một tuỳ chọn trong Trang chia sẻ nội dung Android hoặc trình phân giải ý định. Nếu người dùng
chọn ứng dụng của bạn, thao tác này sẽ khởi động hoạt động tương ứng (.ui.MyActivity
trong
ví dụ trước). Khi đó, bạn có trách nhiệm xử lý nội dung phù hợp.
trong mã và giao diện người dùng.
Xử lý nội dung đến
Để xử lý nội dung do Intent
phân phối, hãy gọi
getIntent()
để nhận đối tượng Intent
. Sau khi có đối tượng,
bạn có thể kiểm tra nội dung của email để xác định việc cần làm tiếp theo. Nếu hoạt động này có thể
có thể khởi động từ các phần khác của hệ thống (chẳng hạn như trình chạy), hãy thực hiện thao tác này
cân nhắc khi kiểm tra ý định.
Hãy cẩn thận hơn khi kiểm tra dữ liệu được gửi đến, vì bạn sẽ không bao giờ biết được dữ liệu nào khác có thể gửi cho bạn. Ví dụ: có thể bạn đã đặt sai loại MIME hoặc hình ảnh đang được gửi có thể cực kỳ lớn. Ngoài ra, hãy nhớ xử lý dữ liệu nhị phân trong một luồng riêng biệt thay vì luồng chính ("giao diện người dùng").
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... when { intent?.action == Intent.ACTION_SEND -> { if ("text/plain" == intent.type) { handleSendText(intent) // Handle text being sent } else if (intent.type?.startsWith("image/") == true) { handleSendImage(intent) // Handle single image being sent } } intent?.action == Intent.ACTION_SEND_MULTIPLE && intent.type?.startsWith("image/") == true -> { handleSendMultipleImages(intent) // Handle multiple images being sent } else -> { // Handle other intents, such as being started from the home screen } } ... } private fun handleSendText(intent: Intent) { intent.getStringExtra(Intent.EXTRA_TEXT)?.let { // Update UI to reflect text being shared } } private fun handleSendImage(intent: Intent) { (intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let { // Update UI to reflect image being shared } } private fun handleSendMultipleImages(intent: Intent) { intent.getParcelableArrayListExtra<Parcelable>(Intent.EXTRA_STREAM)?.let { // Update UI to reflect multiple images being shared } }
Java
void onCreate (Bundle savedInstanceState) { ... // Get intent, action and MIME type Intent intent = getIntent(); String action = intent.getAction(); String type = intent.getType(); if (Intent.ACTION_SEND.equals(action) && type != null) { if ("text/plain".equals(type)) { handleSendText(intent); // Handle text being sent } else if (type.startsWith("image/")) { handleSendImage(intent); // Handle single image being sent } } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { if (type.startsWith("image/")) { handleSendMultipleImages(intent); // Handle multiple images being sent } } else { // Handle other intents, such as being started from the home screen } ... } void handleSendText(Intent intent) { String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); if (sharedText != null) { // Update UI to reflect text being shared } } void handleSendImage(Intent intent) { Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); if (imageUri != null) { // Update UI to reflect image being shared } } void handleSendMultipleImages(Intent intent) { ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if (imageUris != null) { // Update UI to reflect multiple images being shared } }
Việc cập nhật giao diện người dùng sau khi nhận được dữ liệu có thể đơn giản như điền sẵn
EditText
hoặc có thể cao hơn
phức tạp như áp dụng bộ lọc ảnh thú vị cho một hình ảnh. Tùy chọn
cho ứng dụng của bạn những gì sẽ xảy ra tiếp theo.
Đảm bảo người dùng nhận ra ứng dụng của bạn
Ứng dụng của bạn được thể hiện bằng biểu tượng và nhãn trong Android Trang chia sẻ nội dung và trình phân giải ý định. Cả hai đều được xác định trong tệp kê khai. Bạn có thể đặt nhãn bộ lọc ý định hoặc hoạt động để cung cấp thêm ngữ cảnh.
Kể từ Android 10 (API cấp 29), Trang chia sẻ nội dung Android chỉ sử dụng các biểu tượng được đặt trong
tệp kê khai trên thẻ application
. Android bỏ qua các biểu tượng được đặt trên
Các thẻ intent-filter
và activity
.