แอปสามารถรับข้อมูลจากแอปอื่นๆ ได้เช่นเดียวกับที่ส่งข้อมูลไปยังแอปอื่นๆ ลองนึกถึงวิธีที่ผู้ใช้โต้ตอบกับแอปพลิเคชันของคุณและประเภทข้อมูลที่ต้องการรับจากแอปพลิเคชันอื่นๆ เช่น แอปพลิเคชันโซเชียลเน็ตเวิร์กอาจสนใจรับเนื้อหาข้อความ เช่น URL ของเว็บที่น่าสนใจ จากแอปอื่น
ผู้ใช้แอปอื่นๆ ส่งข้อมูลไปยังแอปของคุณผ่าน Android Sharesheet หรือโปรแกรมแก้ไข Intent เป็นประจำ แอปที่ส่งข้อมูลไปยังแอปของคุณต้องตั้งค่าประเภท MIME สําหรับข้อมูลนั้น แอปของคุณรับข้อมูลที่ส่งโดยแอปอื่นได้ดังนี้
Activity
ที่มีแท็กintent-filter
ที่ตรงกันในไฟล์ Manifest- การแชร์ทางลัดที่แอปของคุณเผยแพร่
เป้าหมายการแชร์โดยตรงคือ Deep Link ที่ไปยังกิจกรรมที่เฉพาะเจาะจงภายในแอป ซึ่งมักจะแสดงถึงบุคคลหรือกลุ่ม และชีตการแชร์ของ Android จะแสดงเป้าหมายเหล่านี้ เช่น แอปรับส่งข้อความสามารถระบุเป้าหมายการแชร์โดยตรงสําหรับบุคคลที่ลิงก์ในรายละเอียดไปยังการสนทนากับบุคคลนั้นโดยตรง ดูวิธีการโดยละเอียดได้ที่หัวข้อระบุเป้าหมายการแชร์โดยตรง
รองรับประเภท MIME
โดยหลักการแล้ว แอปต้องรับประเภท MIME ได้หลากหลายที่สุด
ตัวอย่างเช่น แอปรับส่งข้อความที่ออกแบบมาสำหรับการส่งข้อความ รูปภาพ และวิดีโอควรรองรับการรับ text/*
, image/*
และ video/*
ต่อไปนี้คือประเภท MIME ที่พบบ่อยสำหรับส่งและรับข้อมูลธรรมดาใน Android
ผู้รับลงทะเบียนเพื่อรับ | ผู้ส่งส่ง |
---|---|
text/* |
|
`image/*` |
|
video/* |
|
นามสกุลไฟล์ที่รองรับ | application/pdf |
โปรดดูที่รีจิสทรีอย่างเป็นทางการของประเภทสื่อ MIME ของ IANA
สร้างเป้าหมายการแชร์ที่น่าสนใจ
เมื่อผู้ใช้แตะเป้าหมายการแชร์ที่เชื่อมโยงกับกิจกรรมหนึ่งๆ ผู้ใช้ควรยืนยันและแก้ไขเนื้อหาที่แชร์ก่อนใช้งานได้ ซึ่งสำคัญอย่างยิ่งสำหรับข้อมูลข้อความ
รับข้อมูลด้วยกิจกรรม
การรับข้อมูลด้วยกิจกรรมเกี่ยวข้องกับการอัปเดตไฟล์ Manifest, การจัดการเนื้อหาขาเข้า และการตรวจสอบว่าผู้ใช้จดจำแอปของคุณได้
อัปเดตไฟล์ Manifest
ตัวกรอง Intent จะแจ้งให้ระบบทราบว่าคอมโพเนนต์แอปยอมรับ Intent ใด
คุณสร้างตัวกรอง Intent เพื่อรับ Intent ที่มีการดำเนินการนี้ในลักษณะเดียวกับการสร้าง Intent ที่มีการดำเนินการ ACTION_SEND
ในบทเรียนการส่งข้อมูลอย่างง่ายไปยังแอปอื่นๆ คุณกำหนดตัวกรอง Intent ในไฟล์ Manifest ได้โดยใช้องค์ประกอบ <intent-filter>
ตัวอย่างเช่น หากแอปจัดการการรับเนื้อหาข้อความ ไฟล์ Manifest ที่มีรูปภาพอย่างน้อย 1 รูปไม่ว่าประเภทใดก็ตามจะมีลักษณะดังนี้
<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>
เมื่อแอปอื่นพยายามแชร์สิ่งเหล่านี้ด้วยการสร้าง Intent และส่งไปยัง startActivity()
แอปพลิเคชันของคุณจะแสดงเป็นตัวเลือกในหน้าจอการแชร์ของ Android หรือเครื่องมือแก้ไข Intent หากผู้ใช้เลือกแอปของคุณ ระบบจะเริ่มกิจกรรมที่เกี่ยวข้อง (.ui.MyActivity
ในตัวอย่างก่อนหน้านี้) จากนั้นคุณก็จัดการเนื้อหาอย่างเหมาะสมภายในโค้ดและ UI ได้
จัดการเนื้อหาขาเข้า
หากต้องการจัดการเนื้อหาที่ส่งโดย Intent
ให้เรียกใช้ getIntent()
เพื่อรับออบเจ็กต์ Intent
เมื่อได้รับวัตถุแล้ว ให้ตรวจสอบเนื้อหาเพื่อพิจารณาสิ่งที่ต้องทำต่อไป หากกิจกรรมนี้เริ่มได้จากส่วนอื่นๆ ของระบบ (เช่น ตัวเปิด) ให้พิจารณาเรื่องนี้เมื่อตรวจสอบ Intent
โปรดตรวจสอบข้อมูลที่เข้ามาอย่างละเอียด เพราะคุณไม่ทราบว่าแอปพลิเคชันอื่นอาจส่งอะไรให้คุณ เช่น อาจมีการตั้งค่าประเภท MIME ที่ไม่ถูกต้อง หรือรูปภาพที่ส่งอาจมีขนาดใหญ่มาก นอกจากนี้ โปรดอย่าลืมประมวลผลข้อมูลไบนารีในเธรดแยกต่างหาก ไม่ใช่เธรดหลัก ("UI")
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 } }
การอัปเดต UI หลังจากได้รับข้อมูลอาจทำได้ง่ายๆ เพียงป้อนข้อมูลใน EditText
หรืออาจซับซ้อนกว่านั้น เช่น การใช้ฟิลเตอร์รูปภาพที่น่าสนใจกับรูปภาพ การดำเนินการต่อนั้นขึ้นอยู่กับแอปของคุณ
ตรวจสอบว่าผู้ใช้จดจำแอปของคุณได้
แอปของคุณจะแสดงด้วยไอคอนและป้ายกำกับใน Android Sharesheet และ Intent Resolver โดยทั้ง 2 รายการนี้กำหนดไว้ในไฟล์ Manifest คุณสามารถตั้งค่าป้ายกํากับตัวกรองกิจกรรมหรือความตั้งใจเพื่อให้บริบทเพิ่มเติม
ตั้งแต่ Android 10 (API ระดับ 29) เป็นต้นไป แถบแชร์ของ Android จะใช้เฉพาะไอคอนที่ตั้งค่าไว้ในไฟล์ Manifest บนแท็ก application
Android ไม่สนใจไอคอนที่ตั้งค่าไว้ในแท็ก intent-filter
และ activity