สร้างบริการในเบื้องหลัง

คลาส IntentService มีโครงสร้างที่เข้าใจง่ายสำหรับการเรียกใช้การดำเนินการในเธรดเบื้องหลังเดียว ซึ่งช่วยให้จัดการการดำเนินการที่ใช้เวลานานได้ โดยไม่ส่งผลต่อการตอบสนองของอินเทอร์เฟซผู้ใช้ นอกจากนี้ IntentService จะไม่ได้รับผลกระทบจากเหตุการณ์ในวงจรผู้ใช้ส่วนใหญ่ เหตุการณ์นี้จึงยังทำงานต่อไปในกรณีที่จะยุติการให้บริการ AsyncTask

IntentService มีข้อจำกัดบางอย่างดังนี้

  • โดยจะไม่สามารถโต้ตอบกับอินเทอร์เฟซผู้ใช้ของคุณโดยตรง หากต้องการแสดงผลลัพธ์ใน UI คุณต้องส่งไปยัง Activity
  • คำของานจะทำงานตามลำดับ หากการดำเนินการกำลังทำงานใน IntentService และคุณส่งคำขออีกรายการ คำขอจะรอจนกว่าการดำเนินการแรกจะเสร็จสิ้น
  • การดำเนินการที่ทำงานบน IntentService จะหยุดชะงักไม่ได้

อย่างไรก็ตาม ในกรณีส่วนใหญ่ IntentService คือวิธีที่แนะนำในการดำเนินการพื้นฐานอย่างง่ายๆ

คู่มือนี้จะแสดงวิธีทำสิ่งต่างๆ ต่อไปนี้

  • สร้างคลาสย่อยของ IntentService ของคุณเอง
  • สร้างเมธอดการเรียกกลับที่จำเป็น onHandleIntent()
  • กำหนด IntentService ในไฟล์ Manifest

จัดการ Intent ขาเข้า

หากต้องการสร้างคอมโพเนนต์ IntentService สําหรับแอป ให้กําหนดคลาสที่ขยายจาก IntentService และภายในคลาส ให้กําหนดเมธอดที่ลบล้าง onHandleIntent() เช่น

Kotlin

class RSSPullService : IntentService(RSSPullService::class.simpleName)

    override fun onHandleIntent(workIntent: Intent) {
        // Gets data from the incoming Intent
        val dataString = workIntent.dataString
        ...
        // Do work here, based on the contents of dataString
        ...
    }
}

Java

public class RSSPullService extends IntentService {
    @Override
    protected void onHandleIntent(Intent workIntent) {
        // Gets data from the incoming Intent
        String dataString = workIntent.getDataString();
        ...
        // Do work here, based on the contents of dataString
        ...
    }
}

โปรดทราบว่า IntentService จะเรียกใช้ Callback อื่นๆ ของคอมโพเนนต์ Service ปกติ เช่น onStartCommand() โดยอัตโนมัติ ใน IntentService คุณควรหลีกเลี่ยงการลบล้าง Callback เหล่านี้

ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้าง IntentService ได้ที่การขยายคลาส IntentService

กำหนดบริการ Intent ในไฟล์ Manifest

IntentService ต้องมีรายการในไฟล์ Manifest ของแอปพลิเคชัน ให้ป้อนรายการนี้เป็นองค์ประกอบ <service> ที่เป็นส่วนย่อยขององค์ประกอบ <application>

    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name">
        ...
        <!--
            Because android:exported is set to "false",
            the service is only available to this app.
        -->
        <service
            android:name=".RSSPullService"
            android:exported="false"/>
        ...
    </application>

แอตทริบิวต์ android:name ระบุชื่อคลาสของ IntentService

โปรดสังเกตว่าองค์ประกอบ <service> ไม่มีตัวกรองความตั้งใจ Activity ที่ส่งคำของานไปยังบริการจะใช้ Intent ที่ชัดเจนจึงไม่จำเป็นต้องกรอง ซึ่งหมายความว่ามีเพียงคอมโพเนนต์ในแอปเดียวกันหรือแอปพลิเคชันอื่นๆ ที่มีรหัสผู้ใช้เดียวกันเท่านั้นที่จะเข้าถึงบริการได้

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