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

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