คลาส 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
มีรายละเอียดอยู่ในส่งคำของานไปยังบริการที่ทำงานอยู่เบื้องหลัง