แอปสามารถส่งข้อมูลไปยังแอปอื่นๆ ได้ เช่นเดียวกับที่แอปสามารถรับข้อมูลจากแอปอื่นๆ ได้เช่นกัน พิจารณาว่าผู้ใช้โต้ตอบกับแอปพลิเคชันของคุณอย่างไรและคุณต้องการรับข้อมูลประเภทใดจากแอปพลิเคชันอื่นๆ เช่น แอปพลิเคชันเครือข่ายสังคมอาจสนใจรับเนื้อหาข้อความ เช่น URL เว็บที่น่าสนใจ จากแอปอื่น
ผู้ใช้แอปอื่นๆ มักจะส่งข้อมูลไปยังแอปของคุณผ่านชีตการแชร์ของ Android หรือตัวแก้ไข 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 ด้วยACTION_SEND
การดำเนินการในบทเรียนการส่งข้อมูลอย่างง่ายไปยังแอปอื่นๆ
คุณสร้างตัวกรอง Intent เพื่อรับ Intent ด้วยการดำเนินการนี้ คุณ
กำหนดตัวกรอง 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
หรืออาจซับซ้อนกว่านั้น เช่น การใช้ฟิลเตอร์ภาพที่น่าสนใจกับรูปภาพ แอปของคุณจะเป็นผู้กำหนดสิ่งที่เกิดขึ้นต่อไป
ตรวจสอบว่าผู้ใช้รู้จักแอปของคุณ
แอปของคุณจะแสดงด้วยไอคอนและป้ายกำกับในชีตการแชร์และตัวแก้ไข Intent ของ Android ทั้ง 2 อย่างนี้ได้รับการกำหนดไว้ในไฟล์ Manifest คุณสามารถ ตั้งค่าป้ายกำกับตัวกรองกิจกรรมหรือเจตนาเพื่อให้บริบทเพิ่มเติมได้
ตั้งแต่ Android 10 (API ระดับ 29) เป็นต้นไป ชีตการแชร์ของ Android จะใช้เฉพาะไอคอนที่ตั้งค่าไว้ใน
ไฟล์ Manifest ในแท็ก application
Android จะไม่สนใจไอคอนที่ตั้งค่าในแท็ก
intent-filter
และ activity