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

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

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

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

แต่ในกรณีส่วนใหญ่ IntentService เป็นวิธีที่เหมาะสม การดำเนินงานเบื้องหลังอย่างง่าย

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

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

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

หากต้องการสร้างคอมโพเนนต์ IntentService สำหรับแอป ให้กำหนดคลาสที่ ขยาย IntentService และภายใน URL ดังกล่าว ให้กำหนดวิธีการที่ ลบล้าง 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
        ...
    }
}

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