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

หากแอปของคุณสามารถดำเนินการที่อาจเป็นประโยชน์ต่อแอปอื่นได้ ให้เตรียมแอปให้พร้อมตอบสนองต่อคำขอการดำเนินการโดยระบุตัวกรอง 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() ให้กิจกรรมนั้น ไม่เช่นนั้นระบบจะละเว้นผลลัพธ์