ให้แอปอื่นๆ เริ่มกิจกรรมของคุณ

หากแอปสามารถดำเนินการที่อาจเป็นประโยชน์กับแอปอื่นได้ เตรียมความพร้อมเพื่อตอบคําขอดําเนินการโดยการระบุ ตัวกรองความตั้งใจที่เหมาะสมในกิจกรรม

ตัวอย่างเช่น หากคุณ สร้างแอปโซเชียลที่แชร์ข้อความหรือรูปภาพกับเพื่อนของผู้ใช้ รองรับ Intent ACTION_SEND จากนั้น เมื่อผู้ใช้เริ่ม "การแชร์" จากแอปอื่น แอปของคุณจะปรากฏเป็นตัวเลือกใน กล่องโต้ตอบตัวเลือก (หรือที่เรียกว่ากล่องโต้ตอบการชี้แจง) ดังที่แสดงในรูปที่ 1

รูปที่ 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() ไม่เช่นนั้นระบบจะไม่สนใจผลลัพธ์