หากแอปสามารถดำเนินการที่อาจเป็นประโยชน์กับแอปอื่นได้ เตรียมความพร้อมเพื่อตอบคําขอดําเนินการโดยการระบุ ตัวกรองความตั้งใจที่เหมาะสมในกิจกรรม
ตัวอย่างเช่น หากคุณ
สร้างแอปโซเชียลที่แชร์ข้อความหรือรูปภาพกับเพื่อนของผู้ใช้
รองรับ Intent ACTION_SEND
จากนั้น เมื่อผู้ใช้เริ่ม "การแชร์" จากแอปอื่น แอปของคุณจะปรากฏเป็นตัวเลือกใน
กล่องโต้ตอบตัวเลือก (หรือที่เรียกว่ากล่องโต้ตอบการชี้แจง) ดังที่แสดงในรูปที่ 1
![](https://developer.android.com/static/images/training/basics/intent-chooser.png?authuser=9&hl=th)
รูปที่ 1 กล่องโต้ตอบตัวเลือก
หากต้องการให้แอปอื่นๆ เริ่มกิจกรรมในลักษณะนี้ คุณต้องเพิ่ม <intent-filter>
ในไฟล์ Manifest ของเอลิเมนต์ <activity>
ที่เกี่ยวข้อง
เมื่อติดตั้งแอปในอุปกรณ์แล้ว ระบบจะระบุความตั้งใจของคุณ
กรองและเพิ่มข้อมูลไปยังแคตตาล็อก Intent ภายในที่แอปที่ติดตั้งทั้งหมดรองรับ
เมื่อแอปโทรหา startActivity()
หรือ startActivityForResult()
ระบบจะตรวจสอบกิจกรรมที่ตอบสนองต่อ
Intent
เพิ่มตัวกรอง Intent
หากต้องการกำหนด Intent ที่กิจกรรมของคุณสามารถจัดการได้อย่างเหมาะสม ให้สร้างตัวกรอง Intent แต่ละรายการที่เพิ่ม ในแง่ของประเภทการทำงานและข้อมูลกิจกรรม ยอมรับ
ระบบอาจส่ง Intent
ไปยังกิจกรรม หากกิจกรรมดังกล่าวมี
ตัวกรอง Intent ที่มีคุณสมบัติตามเกณฑ์ต่อไปนี้ของออบเจ็กต์ Intent
- การทำงาน
- สตริงที่มีชื่อการดำเนินการ ปกติแล้วค่าใดค่าหนึ่งที่แพลตฟอร์มกำหนด เช่น
เป็น
ACTION_SEND
หรือACTION_VIEW
ระบุข้อมูลนี้ในตัวกรอง Intent ด้วยองค์ประกอบ
<action>
ค่าที่คุณระบุในองค์ประกอบนี้ต้องเป็นชื่อสตริงแบบเต็มของการดำเนินการ แทนที่จะเป็น ค่าคงที่ของ API ดังที่แสดงในตัวอย่างในหน้านี้ - ข้อมูล
- คำอธิบายของข้อมูลที่เชื่อมโยงกับความตั้งใจ
ระบุข้อมูลนี้ในตัวกรอง Intent ด้วยองค์ประกอบ
<data>
ใช้รายการเดียว แอตทริบิวต์อย่างน้อย 1 รายการในองค์ประกอบนี้ คุณสามารถระบุประเภท MIME, คำนำหน้า URI รูปแบบ URI หรือชุดค่าผสมของสิ่งนี้และรายการอื่นๆ ที่ระบุประเภทข้อมูล ยอมรับหมายเหตุ: หากไม่จำเป็นต้องประกาศรายละเอียดเกี่ยวกับข้อมูล
Uri
เช่น เมื่อกิจกรรมได้รับการจัดการ "เพิ่มเติม" ประเภทอื่น แทน URI ให้ระบุเฉพาะแอตทริบิวต์android:mimeType
เพื่อประกาศประเภทของ ข้อมูลที่คุณดำเนินการได้ เช่นtext/plain
หรือimage/jpeg
- หมวดหมู่
- มอบวิธีเพิ่มเติมในการกำหนดลักษณะของกิจกรรมที่จัดการกับความตั้งใจซึ่งมักเกี่ยวข้องกัน
กับท่าทางสัมผัสของผู้ใช้
หรือตำแหน่งที่เป็นจุดเริ่ม ซึ่งมีหมวดหมู่ต่างๆ มากมาย
แต่ระบบส่วนใหญ่มักไม่ค่อยมีการใช้งาน อย่างไรก็ตาม Intent แบบไม่เจาะจงปลายทางทั้งหมดจะกำหนดด้วย
CATEGORY_DEFAULT
โดยค่าเริ่มต้นระบุข้อมูลนี้ในตัวกรอง Intent ด้วย
<category>
ในตัวกรอง Intent คุณสามารถประกาศเกณฑ์ที่กิจกรรมยอมรับได้
โดยประกาศแต่ละรายการพร้อมองค์ประกอบ XML ที่เกี่ยวข้องซึ่งฝังอยู่ใน <intent-filter>
ตัวอย่างเช่น ต่อไปนี้คือกิจกรรมที่มีตัวกรอง Intent ที่จัดการ Intent ACTION_SEND
เมื่อประเภทข้อมูลเป็นข้อความหรือรูปภาพ
<activity android:name="ShareActivity"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> <data android:mimeType="image/*"/> </intent-filter> </activity>
เคล็ดลับ: หากคุณต้องการให้ไอคอนในกล่องโต้ตอบตัวเลือกแตกต่างออกไป
จากไอคอนเริ่มต้นของกิจกรรม ให้เพิ่ม android:icon
ใน<intent-filter>
Intent ที่เข้ามาใหม่แต่ละรายการจะระบุการดำเนินการเพียง 1 รายการและข้อมูล 1 ประเภท แต่สามารถประกาศหลายรายการได้
อินสแตนซ์ของเอลิเมนต์ <action>
, <category>
และ <data>
ในแต่ละเอลิเมนต์
<intent-filter>
หากการทำงานและข้อมูล 2 คู่ไม่เกี่ยวข้องกันใน พฤติกรรมของผู้ใช้ ให้สร้างตัวกรอง Intent แยกต่างหากเพื่อระบุการดำเนินการที่ยอมรับได้ เมื่อจับคู่กับประเภทข้อมูลใด
ตัวอย่างเช่น สมมติว่ากิจกรรมจัดการทั้งข้อความและรูปภาพสำหรับทั้ง Intent ACTION_SEND
และ ACTION_SENDTO
ในกรณีนี้ คุณต้องกำหนด 2 อย่างแยกกัน
ตัวกรอง Intent สำหรับการดำเนินการ 2 รายการ เนื่องจาก Intent ACTION_SENDTO
ต้องใช้ข้อมูล Uri
เพื่อระบุ
ที่อยู่ของผู้รับโดยใช้รูปแบบ URI send
หรือ sendto
ตัวอย่างนี้จะแสดงในตัวอย่างต่อไปนี้
<activity android:name="ShareActivity"> <!-- Filter for sending text; accepts SENDTO action with sms URI schemes --> <intent-filter> <action android:name="android.intent.action.SENDTO"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="sms" /> <data android:scheme="smsto" /> </intent-filter> <!-- Filter for sending text or images; accepts SEND action and text or image data --> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="image/*"/> <data android:mimeType="text/plain"/> </intent-filter> </activity>
หมายเหตุ: หากต้องการรับ Intent แบบไม่เจาะจงปลายทาง คุณต้องใส่
CATEGORY_DEFAULT
ในตัวกรอง Intent เมธอด startActivity()
และ startActivityForResult()
ดำเนินการกับ Intent ทั้งหมดเสมือนว่า
ประกาศหมวดหมู่ CATEGORY_DEFAULT
แล้ว หากคุณไม่ประกาศ
ในตัวกรอง Intent ความตั้งใจโดยนัยจะไม่จับคู่กับกิจกรรมของคุณ
ดูข้อมูลเพิ่มเติมเกี่ยวกับการส่งและรับ ACTION_SEND
Intent ที่มีพฤติกรรมการแชร์ผ่านโซเชียล โปรดดูการรับข้อมูลอย่างง่ายจากแอปอื่นๆ
นอกจากนี้ คุณยังจะพบข้อมูลที่เป็นประโยชน์เกี่ยวกับการแชร์ข้อมูลใน
การแชร์ข้อมูลอย่างง่ายและ
การแชร์ไฟล์
จัดการความตั้งใจในกิจกรรมของคุณ
หากต้องการตัดสินใจว่าจะดำเนินการใดกับกิจกรรมของคุณ โปรดอ่าน
Intent
ที่ใช้ในการเริ่มต้น
เมื่อกิจกรรมเริ่มต้นขึ้น ให้โทรหา getIntent()
เพื่อเรียกข้อมูล
Intent
ที่เริ่มกิจกรรมแล้ว โดยเลือกได้ทุกเมื่อในระหว่าง
วงจรของกิจกรรม แต่โดยทั่วไปแล้วคุณก็ทำได้ระหว่างการเรียกกลับในช่วงต้น เช่น
onCreate()
หรือ onStart()
ตัวอย่างนี้จะแสดงในตัวอย่างต่อไปนี้
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) val data: Uri? = intent?.data // Figure out what to do based on the intent type if (intent?.type?.startsWith("image/") == true) { // Handle intents with image data } else if (intent?.type == "text/plain") { // Handle intents with text } }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get the intent that started this activity Intent intent = getIntent(); Uri data = intent.getData(); // Figure out what to do based on the intent type if (intent.getType().indexOf("image/") != -1) { // Handle intents with image data } else if (intent.getType().equals("text/plain")) { // Handle intents with text } }
แสดงผลลัพธ์
หากต้องการส่งคืนผลลัพธ์ไปยังกิจกรรมที่มีการเรียกให้แสดง ให้เรียกใช้ setResult()
เพื่อระบุรหัสผลลัพธ์และผลลัพธ์ Intent
เมื่อการดำเนินการเสร็จสิ้นและผู้ใช้กลับไปที่ต้นฉบับ
กิจกรรม โทรหา finish()
ปิดและทำลายกิจกรรมของคุณ ตัวอย่างนี้จะแสดงในตัวอย่างต่อไปนี้
Kotlin
// Create intent to deliver some kind of result data Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")).also { result -> setResult(Activity.RESULT_OK, result) } finish()
Java
// Create intent to deliver some kind of result data Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")); setResult(Activity.RESULT_OK, result); finish();
คุณต้องระบุรหัสผลลัพธ์พร้อมกับผลลัพธ์เสมอ โดยทั่วไปแล้วจะเป็น RESULT_OK
หรือ RESULT_CANCELED
จากนั้นคุณจะสามารถ
ให้ข้อมูลเพิ่มเติมด้วย Intent
ตามที่จำเป็น
หมายเหตุ: ผลลัพธ์จะตั้งค่าเป็น
RESULT_CANCELED
โดยค่าเริ่มต้น ดังนั้นหากผู้ใช้แตะที่แถบ "กลับ"
ก่อนที่จะเสร็จสิ้นการทำงาน และก่อนที่คุณจะตั้งค่าผลลัพธ์ กิจกรรมดั้งเดิมจะได้รับ
"ยกเลิกแล้ว" ผลลัพธ์
หากคุณต้องการแสดงผลจำนวนเต็มที่ระบุตัวเลือกผลลัพธ์อย่างใดอย่างหนึ่ง คุณสามารถตั้งค่า
รหัสผลลัพธ์เป็นค่าที่สูงกว่า 0 หากคุณใช้โค้ดผลลัพธ์เพื่อแสดงจำนวนเต็มและคุณ
ไม่จำเป็นต้องมี Intent
คุณสามารถโทรหา setResult()
และส่งผ่านเฉพาะรหัสผลลัพธ์:
Kotlin
setResult(RESULT_COLOR_RED) finish()
Java
setResult(RESULT_COLOR_RED); finish();
ในกรณีนี้ อาจมีผลลัพธ์ที่เป็นไปได้เพียงไม่กี่รายการ ดังนั้น โค้ดผลลัพธ์จะอยู่ในเครื่อง จำนวนเต็มที่กำหนด (มากกว่า 0) การดำเนินการนี้จะทำงานได้ดีเมื่อคุณส่งคืนผลลัพธ์ไปยังกิจกรรม ในแอปของคุณเอง เนื่องจากกิจกรรมที่ได้รับผลการค้นหาสามารถอ้างอิงถึงสาธารณะ คงที่เพื่อระบุค่าของรหัสผลลัพธ์
หมายเหตุ: ไม่จำเป็นต้องตรวจสอบว่ากิจกรรมเริ่มต้นแล้วหรือไม่
ด้วย startActivity()
หรือ startActivityForResult()
เพียงโทรหา setResult()
หาก Intent ที่เริ่มต้นกิจกรรมของคุณ
อาจคาดหวังผลลัพธ์ได้ หากกิจกรรมเริ่มต้นที่เรียกว่า startActivityForResult()
ระบบจะนำส่งกิจกรรมดังกล่าว
ผลลัพธ์ที่คุณระบุให้กับ setResult()
ไม่เช่นนั้นระบบจะไม่สนใจผลลัพธ์