หากแอปของคุณสามารถดำเนินการที่อาจเป็นประโยชน์ต่อแอปอื่นได้ ให้เตรียมแอปให้พร้อมตอบสนองต่อคำขอการดำเนินการโดยระบุตัวกรอง Intent ที่เหมาะสมในกิจกรรม
ตัวอย่างเช่น หากคุณสร้างแอปโซเชียลที่แชร์ข้อความหรือรูปภาพกับเพื่อนของผู้ใช้ได้ ให้รองรับ Intent ACTION_SEND
จากนั้น เมื่อผู้ใช้เริ่มการดำเนินการ "แชร์" จากแอปอื่น แอปของคุณจะปรากฏเป็นตัวเลือกในกล่องโต้ตอบตัวเลือก (หรือที่เรียกว่า กล่องโต้ตอบการแยกความกำกวม) ดังที่แสดงในรูปที่ 1
รูปที่ 1 กล่องโต้ตอบตัวเลือก
หากต้องการให้แอปอื่นๆ เริ่มกิจกรรมของคุณด้วยวิธีนี้ คุณต้องเพิ่มองค์ประกอบ <intent-filter>
ในไฟล์ Manifest สำหรับองค์ประกอบ <activity> ที่เกี่ยวข้อง
เมื่อติดตั้งแอปในอุปกรณ์ ระบบจะระบุตัวกรอง Intent และเพิ่มข้อมูลลงในแคตตาล็อก Intent ภายในที่แอปที่ติดตั้งทั้งหมดรองรับ
เมื่อแอปเรียก startActivity() หรือ startActivityForResult() ด้วย Intent แบบไม่เจาะจงปลายทาง ระบบจะตรวจสอบกิจกรรมที่ตอบสนองต่อ Intent ได้
เพิ่มตัวกรอง Intent
หากต้องการกำหนด Intent ที่กิจกรรมของคุณจัดการได้อย่างถูกต้อง ให้กำหนดตัวกรอง Intent แต่ละรายการที่คุณเพิ่มให้เฉพาะเจาะจงมากที่สุดเท่าที่จะเป็นไปได้ในแง่ของประเภทการดำเนินการและข้อมูลที่กิจกรรมยอมรับ
ระบบอาจส่ง Intent ที่ระบุไปยังกิจกรรมหากกิจกรรมนั้นมี
ตัวกรอง Intent ที่ตรงตามเกณฑ์ต่อไปนี้ของออบเจ็กต์ Intent
- การทำงาน
- สตริงที่ตั้งชื่อการดำเนินการที่จะทำ โดยปกติจะเป็นค่าที่แพลตฟอร์มกำหนดไว้ค่าใดค่าหนึ่ง เช่น
ACTION_SENDหรือACTION_VIEWระบุค่านี้ในตัวกรอง Intent ด้วยองค์ประกอบ
<action>ค่าที่คุณระบุในองค์ประกอบนี้ต้องเป็นชื่อสตริงแบบเต็มของการดำเนินการแทนที่จะเป็นค่าคงที่ของ API ดังที่แสดงในตัวอย่างในหน้านี้ - ข้อมูล
- คำอธิบายข้อมูลที่เชื่อมโยงกับ Intent
ระบุค่านี้ในตัวกรอง Intent ด้วยองค์ประกอบ
<data>การใช้แอตทริบิวต์อย่างน้อย 1 รายการในองค์ประกอบนี้จะช่วยให้คุณระบุประเภท MIME, คำนำหน้า URI, สคีม URI หรือการผสมผสานระหว่างแอตทริบิวต์เหล่านี้กับแอตทริบิวต์อื่นๆ ที่ระบุประเภทข้อมูลที่ยอมรับได้หมายเหตุ: หากไม่จำเป็นต้องประกาศรายละเอียดเกี่ยวกับ
Uriของข้อมูล เช่น เมื่อกิจกรรมของคุณจัดการข้อมูล "พิเศษ" ประเภทอื่นแทนที่จะเป็น URI ให้ระบุเฉพาะแอตทริบิวต์android:mimeTypeเพื่อประกาศประเภทข้อมูลที่กิจกรรมของคุณจัดการ เช่นtext/plainหรือimage/jpeg - หมวดหมู่
- ระบุวิธีเพิ่มเติมในการระบุกิจกรรมที่จัดการ Intent ซึ่งมักจะเกี่ยวข้องกับท่าทางของผู้ใช้หรือตำแหน่งที่เริ่มกิจกรรม ระบบรองรับหมวดหมู่ต่างๆ มากมาย แต่ส่วนใหญ่ไม่ค่อยได้ใช้ อย่างไรก็ตาม ระบบจะกำหนด 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 ขาเข้าแต่ละรายการจะระบุการดำเนินการและประเภทข้อมูลเพียงรายการเดียว แต่คุณสามารถประกาศองค์ประกอบ <action>, <category> และ <data> หลาย
อินสแตนซ์ใน
<intent-filter> แต่ละรายการได้
หากการดำเนินการและข้อมูล 2 คู่มีลักษณะการทำงานที่แยกจากกัน ให้สร้างตัวกรอง Intent แยกต่างหากเพื่อระบุการดำเนินการที่ยอมรับได้เมื่อจับคู่กับประเภทข้อมูลใด
ตัวอย่างเช่น สมมติว่ากิจกรรมของคุณจัดการทั้งข้อความและรูปภาพสำหรับ Intent ACTION_SEND และ ACTION_SENDTO ในกรณีนี้ คุณต้องกำหนดตัวกรอง Intent 2 รายการแยกกัน
สำหรับการดำเนินการ 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 จะไม่มี Intent โดยนัยใดๆ ที่ส่งไปยังกิจกรรมของคุณ
ดูข้อมูลเพิ่มเติมเกี่ยวกับการส่งและรับ ACTION_SEND
Intent ที่ดำเนินการตามลักษณะการทำงานของการแชร์ในโซเชียลได้ที่ การรับข้อมูลอย่างง่ายจากแอปอื่นๆ
นอกจากนี้ คุณยังดูข้อมูลที่เป็นประโยชน์เกี่ยวกับการแชร์ข้อมูลได้ที่
การแชร์ข้อมูลอย่างง่าย และ
การแชร์ไฟล์
จัดการ 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() ให้กิจกรรมนั้น ไม่เช่นนั้นระบบจะละเว้นผลลัพธ์