Android 10 ได้เปิดตัวแอตทริบิวต์ android:foregroundServiceType ภายในองค์ประกอบ <service> เพื่อช่วยให้นักพัฒนาแอปมีความตั้งใจมากขึ้นในการกำหนดบริการที่ทำงานอยู่เบื้องหน้าที่แสดงต่อผู้ใช้
หากแอปกำหนดเป้าหมายเป็น Android 14 จะต้องระบุประเภทบริการที่ทำงานอยู่เบื้องหน้าที่เหมาะสม คุณสามารถรวมหลายประเภทเข้าด้วยกันได้เช่นเดียวกับใน Android เวอร์ชันก่อนหน้า รายการนี้แสดงประเภทบริการที่ทำงานอยู่เบื้องหน้าที่คุณเลือกได้
cameraconnectedDevicedataSynchealthlocationmediaPlaybackmediaProjectionmicrophonephoneCallremoteMessagingshortServicespecialUsesystemExempted
หากกรณีการใช้งานในแอปของคุณไม่เกี่ยวข้องกับประเภทใดเลย เราขอแนะนําอย่างยิ่งให้คุณย้ายข้อมูลตรรกะไปใช้ WorkManager หรือการโอนข้อมูลที่เริ่มต้นโดยผู้ใช้
health, remoteMessaging, shortService, specialUse และ systemExempted
เป็นประเภทใหม่ใน Android 14
ข้อมูลโค้ดต่อไปนี้แสดงตัวอย่างการประกาศประเภทบริการที่ทำงานอยู่เบื้องหน้าในไฟล์ Manifest
<manifest ...>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<application ...>
<service
android:name=".MyMediaPlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="false">
</service>
</application>
</manifest>
หากแอปที่กำหนดเป้าหมายเป็น Android 14 ไม่ได้กำหนดประเภทสำหรับบริการที่ระบุในไฟล์ Manifest ระบบจะเพิ่ม MissingForegroundServiceTypeException เมื่อเรียกใช้ startForeground() สำหรับบริการนั้น
ประกาศสิทธิ์ใหม่เพื่อใช้ประเภทบริการที่ทำงานอยู่เบื้องหน้า
หากแอปที่กำหนดเป้าหมายเป็น Android 14 ใช้บริการที่ทำงานอยู่เบื้องหน้า แอปจะต้องประกาศสิทธิ์ที่เฉพาะเจาะจงตามประเภทบริการที่ทำงานอยู่เบื้องหน้าซึ่ง Android 14 เปิดตัว สิทธิ์เหล่านี้จะปรากฏในส่วนที่มีป้ายกำกับว่า "สิทธิ์ที่คุณต้องประกาศในไฟล์ Manifest" ในส่วนกรณีการใช้งานที่ต้องการและการบังคับใช้สำหรับบริการที่ทำงานอยู่เบื้องหน้าแต่ละประเภทในหน้านี้
สิทธิ์ทั้งหมดถือเป็นสิทธิ์ทั่วไปและได้รับสิทธิ์โดยค่าเริ่มต้น ผู้ใช้เพิกถอนสิทธิ์เหล่านี้ไม่ได้
รวมประเภทบริการที่ทำงานอยู่เบื้องหน้าไว้ที่รันไทม์
แนวทางปฏิบัติแนะนำสำหรับแอปพลิเคชันที่เริ่มบริการที่ทำงานอยู่เบื้องหน้าคือให้ใช้ startForeground() เวอร์ชัน ServiceCompat (มีอยู่ใน androidx-core 1.12 ขึ้นไป) ซึ่งคุณส่งค่าจำนวนเต็มแบบ 2 ฐานของประเภทบริการที่ทำงานอยู่เบื้องหน้า คุณเลือกที่จะส่งค่าประเภทต่างๆ ได้อย่างน้อย 1 ค่า
โดยทั่วไปคุณควรประกาศเฉพาะประเภทที่จำเป็นสำหรับ Use Case ที่เฉพาะเจาะจงเท่านั้น ซึ่งจะช่วยให้คุณทำตามความคาดหวังของระบบสำหรับบริการที่ทำงานอยู่เบื้องหน้าแต่ละประเภทได้ง่ายขึ้น ในกรณีที่บริการที่ทำงานอยู่เบื้องหน้าเริ่มต้นด้วยหลายประเภท บริการดังกล่าวต้องเป็นไปตามข้อกำหนดในการบังคับใช้แพลตฟอร์มทั้งหมด
ServiceCompat.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)
หากไม่ได้ระบุประเภทบริการที่ทำงานอยู่เบื้องหน้าในการเรียกใช้ ระบบจะใช้ค่าเริ่มต้นของประเภทนั้นซึ่งกำหนดไว้ในไฟล์ Manifest หากคุณไม่ได้ระบุประเภทบริการในไฟล์ Manifest ระบบจะแสดงMissingForegroundServiceTypeException
หากบริการที่ทำงานอยู่เบื้องหน้าต้องการสิทธิ์ใหม่หลังจากเปิดใช้งาน คุณควรเรียกใช้ startForeground() อีกครั้งและเพิ่มประเภทบริการใหม่ ตัวอย่างเช่น สมมติว่าแอปฟิตเนสเรียกใช้บริการติดตามการวิ่งที่ต้องใช้ข้อมูล location เสมอ แต่อาจจำเป็นต้องหรือไม่ต้องมีสิทธิ์ media คุณจะต้องประกาศทั้ง location และ mediaPlayback ในไฟล์ Manifest หากผู้ใช้เริ่มการวิ่งและต้องการติดตามตำแหน่งเท่านั้น แอปของคุณควรเรียกใช้ startForeground() และส่งเฉพาะประเภทบริการ location จากนั้นหากผู้ใช้ต้องการเริ่มเล่นเสียง ให้เรียกใช้ startForeground() อีกครั้งและส่ง location|mediaPlayback
การตรวจสอบรันไทม์ของระบบ
ระบบจะตรวจสอบการใช้ประเภทบริการที่ทำงานอยู่เบื้องหน้าอย่างเหมาะสม และยืนยันว่าแอปได้ขอสิทธิ์รันไทม์ที่เหมาะสมหรือใช้ API ที่จำเป็น
เช่น ระบบคาดหวังว่าแอปที่ใช้บริการที่ทำงานอยู่เบื้องหน้าประเภท FOREGROUND_SERVICE_TYPE_LOCATION จะขอ ACCESS_COARSE_LOCATION หรือ ACCESS_FINE_LOCATION
ซึ่งหมายความว่าแอปต้องปฏิบัติตามลำดับการดำเนินการที่เฉพาะเจาะจงมากเมื่อขอสิทธิ์จากผู้ใช้และเริ่มบริการที่ทำงานอยู่เบื้องหน้า คุณต้องขอสิทธิ์และได้รับสิทธิ์ก่อนที่แอปจะพยายามโทรหา startForeground() แอปที่ขอสิทธิ์ที่เหมาะสมหลังจากที่เริ่มบริการที่ทำงานอยู่เบื้องหน้าแล้วต้องเปลี่ยนลำดับการดำเนินการนี้และขอสิทธิ์ก่อนเริ่มบริการที่ทำงานอยู่เบื้องหน้า
ข้อกำหนดเฉพาะของการบังคับใช้แพลตฟอร์มจะปรากฏในส่วนที่มีป้ายกำกับว่า "ข้อกำหนดรันไทม์" ในส่วนกรณีการใช้งานที่ต้องการและการบังคับใช้สำหรับบริการที่ทำงานอยู่เบื้องหน้าแต่ละประเภทในหน้านี้
กรณีการใช้งานและการบังคับใช้ที่กำหนดไว้สำหรับบริการที่ทำงานอยู่เบื้องหน้าแต่ละประเภท
หากต้องการใช้บริการที่ทำงานอยู่เบื้องหน้าประเภทหนึ่งๆ คุณต้องประกาศสิทธิ์ที่เฉพาะเจาะจงในไฟล์ Manifest, ต้องปฏิบัติตามข้อกำหนดรันไทม์ที่เฉพาะเจาะจง และแอปต้องเป็นไปตามชุด Use Case ที่ต้องการสำหรับประเภทนั้น ส่วนต่อไปนี้อธิบายสิทธิ์ที่คุณต้องประกาศ ข้อกําหนดเบื้องต้นรันไทม์ และกรณีการใช้งานที่ต้องการสําหรับแต่ละประเภท
กล้อง
- ประเภทบริการที่ทำงานอยู่เบื้องหน้าที่จะประกาศในไฟล์ Manifest ในส่วน
android:foregroundServiceType camera- สิทธิ์ในการประกาศในไฟล์ Manifest
FOREGROUND_SERVICE_CAMERA- ค่าคงที่ที่จะส่งไปยัง
startForeground() FOREGROUND_SERVICE_TYPE_CAMERA- ข้อกําหนดเบื้องต้นของรันไทม์
ขอและได้รับสิทธิ์รันไทม์
CAMERAหมายเหตุ: สิทธิ์รันไทม์
CAMERAอยู่ภายใต้ข้อจำกัดขณะใช้งาน ด้วยเหตุนี้ คุณจึงสร้างcameraบริการที่ทำงานอยู่เบื้องหน้าไม่ได้ขณะที่แอปอยู่ในเบื้องหลัง ยกเว้นบางกรณี ดูข้อมูลเพิ่มเติมได้ที่ข้อจำกัดในการเริ่มบริการที่ทำงานอยู่เบื้องหน้าซึ่งต้องใช้สิทธิ์ขณะใช้งาน- คำอธิบาย
การเข้าถึงกล้องจากเบื้องหลังอย่างต่อเนื่อง เช่น แอปวิดีโอแชทที่อนุญาตให้ทำงานหลายอย่างพร้อมกันได้
อุปกรณ์ที่เชื่อมต่อ
- ประเภทบริการที่ทำงานอยู่เบื้องหน้าที่จะประกาศในไฟล์ Manifest ในส่วน
android:foregroundServiceTypeconnectedDevice- สิทธิ์ในการประกาศในไฟล์ Manifest
FOREGROUND_SERVICE_CONNECTED_DEVICE- ค่าคงที่ที่จะส่งไปยัง
startForeground() FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE- ข้อกําหนดเบื้องต้นของรันไทม์
เงื่อนไขต่อไปนี้อย่างน้อย 1 ข้อจะต้องเป็นจริง
ประกาศสิทธิ์ต่อไปนี้อย่างน้อย 1 รายการในไฟล์ Manifest
ขอและได้รับสิทธิ์รันไทม์ต่อไปนี้อย่างน้อย 1 สิทธิ์
- คำอธิบาย
การโต้ตอบกับอุปกรณ์ภายนอกที่ต้องใช้การเชื่อมต่อบลูทูธ, NFC, IR, USB หรือเครือข่าย
- ทางเลือก
หากแอปของคุณต้องโอนข้อมูลไปยังอุปกรณ์ภายนอกอย่างต่อเนื่อง ให้ลองใช้เครื่องมือจัดการอุปกรณ์ที่ใช้ร่วมกันแทน ใช้ companion device presence API เพื่อช่วยให้คุณแอปทำงานต่อไปได้ขณะที่อุปกรณ์ที่ใช้ร่วมกันอยู่ในระยะสัญญาณ
หากแอปของคุณต้องสแกนหาอุปกรณ์บลูทูธ ให้ลองใช้ Bluetooth Scan API แทน
การซิงค์ข้อมูล
- ประเภทบริการที่ทำงานอยู่เบื้องหน้าที่จะประกาศในไฟล์ Manifest ในส่วน
android:foregroundServiceTypedataSync- สิทธิ์ในการประกาศในไฟล์ Manifest
FOREGROUND_SERVICE_DATA_SYNC- ค่าคงที่ที่จะส่งไปยัง
startForeground() FOREGROUND_SERVICE_TYPE_DATA_SYNC- ข้อกําหนดเบื้องต้นของรันไทม์
- ไม่มี
- คำอธิบาย
การดำเนินการโอนข้อมูล เช่น การดำเนินการต่อไปนี้
- การอัปโหลดหรือดาวน์โหลดข้อมูล
- การดำเนินการสำรองและกู้คืนข้อมูล
- การดำเนินการนำเข้าหรือส่งออก
- ดึงข้อมูล
- การประมวลผลไฟล์ในเครื่อง
- โอนข้อมูลระหว่างอุปกรณ์กับระบบคลาวด์ผ่านเครือข่าย
- ทางเลือก
ดูข้อมูลโดยละเอียดได้ที่ทางเลือกแทนบริการที่ทำงานอยู่เบื้องหน้าสำหรับการซิงค์ข้อมูล
สุขภาพ
- ประเภทบริการที่ทำงานอยู่เบื้องหน้าที่จะประกาศในไฟล์ Manifest ในส่วน
android:foregroundServiceTypehealth- สิทธิ์ในการประกาศในไฟล์ Manifest
FOREGROUND_SERVICE_HEALTH- ค่าคงที่ที่จะส่งไปยัง
startForeground() FOREGROUND_SERVICE_TYPE_HEALTH- สิ่งที่ต้องดำเนินการก่อนสำหรับรันไทม์
เงื่อนไขต่อไปนี้อย่างน้อย 1 ข้อจะต้องเป็นจริง
ประกาศสิทธิ์
HIGH_SAMPLING_RATE_SENSORSในไฟล์ Manifestขอและได้รับสิทธิ์รันไทม์ต่อไปนี้อย่างน้อย 1 สิทธิ์
BODY_SENSORSใน API ระดับ 35 หรือต่ำกว่าREAD_HEART_RATEREAD_SKIN_TEMPERATUREREAD_OXYGEN_SATURATIONACTIVITY_RECOGNITION
หมายเหตุ: สิทธิ์รันไทม์ READ ของ
BODY_SENSORSและเซ็นเซอร์จะขึ้นอยู่กับข้อจำกัดขณะใช้งาน ด้วยเหตุนี้ คุณจึงสร้างhealthบริการที่ทำงานอยู่เบื้องหน้าซึ่งใช้เซ็นเซอร์ร่างกายขณะที่แอปทำงานอยู่เบื้องหลังไม่ได้ เว้นแต่จะได้รับสิทธิ์BODY_SENSORS_BACKGROUND(API ระดับ 33 ถึง 35) หรือREAD_HEALTH_DATA_IN_BACKGROUND(API ระดับ 36 ขึ้นไป) ดูข้อมูลเพิ่มเติมได้ที่ข้อจำกัดในการเริ่มบริการที่ทำงานอยู่เบื้องหน้าซึ่งต้องใช้สิทธิ์ขณะใช้งาน- คำอธิบาย
กรณีการใช้งานที่ทำงานต่อเนื่องเพื่อรองรับแอปในหมวดหมู่ฟิตเนส เช่น อุปกรณ์ติดตามการออกกำลังกาย
ตำแหน่ง
- ประเภทบริการที่ทำงานอยู่เบื้องหน้าที่จะประกาศในไฟล์ Manifest ในส่วน
android:foregroundServiceTypelocation- สิทธิ์ในการประกาศในไฟล์ Manifest
FOREGROUND_SERVICE_LOCATION- ค่าคงที่ที่จะส่งไปยัง
startForeground() FOREGROUND_SERVICE_TYPE_LOCATION- ข้อกําหนดเบื้องต้นของรันไทม์
ผู้ใช้ต้องเปิดใช้บริการตำแหน่งและแอปต้องได้รับสิทธิ์รันไทม์อย่างน้อย 1 รายการต่อไปนี้
หมายเหตุ: หากต้องการตรวจสอบว่าผู้ใช้เปิดใช้บริการหาตำแหน่ง รวมถึงให้สิทธิ์เข้าถึงรันไทม์แล้ว ให้ใช้
PermissionChecker#checkSelfPermission()หมายเหตุ: สิทธิ์รันไทม์ของตำแหน่งอยู่ภายใต้ข้อจำกัดขณะใช้งาน ด้วยเหตุนี้ คุณจึงสร้าง
locationบริการที่ทำงานอยู่เบื้องหน้าไม่ได้ขณะที่แอปอยู่ในเบื้องหลัง เว้นแต่จะได้รับสิทธิ์รันไทม์ACCESS_BACKGROUND_LOCATIONดูข้อมูลเพิ่มเติมได้ที่ข้อจำกัดในการเริ่มบริการที่ทำงานอยู่เบื้องหน้าซึ่งต้องใช้สิทธิ์ขณะใช้งาน- คำอธิบาย
กรณีการใช้งานที่ทำงานต่อเนื่องซึ่งต้องใช้สิทธิ์เข้าถึงตำแหน่ง เช่น การนำทางและการแชร์ตำแหน่ง
- ทางเลือก
หากต้องการให้แอปทริกเกอร์เมื่อผู้ใช้ไปถึงสถานที่ที่เฉพาะเจาะจง ให้ลองใช้ Geofence API แทน
สื่อ
- ประเภทบริการที่ทำงานอยู่เบื้องหน้าที่จะประกาศในไฟล์ Manifest ในส่วน
android:foregroundServiceTypemediaPlayback- สิทธิ์ในการประกาศในไฟล์ Manifest
FOREGROUND_SERVICE_MEDIA_PLAYBACK- ค่าคงที่ที่จะส่งไปยัง
startForeground() FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK- ข้อกําหนดเบื้องต้นของรันไทม์
- ไม่มี
- คำอธิบาย
- เล่นเสียงหรือวิดีโออย่างต่อเนื่องจากเบื้องหลัง รองรับฟังก์ชันการบันทึกวิดีโอดิจิทัล (DVR) ใน Android TV
- ทางเลือก
- หากกำลังแสดงวิดีโอแบบภาพซ้อนภาพ ให้ใช้โหมดภาพซ้อนภาพ
การฉายภาพสื่อ
- ประเภทบริการที่ทำงานอยู่เบื้องหน้าที่จะประกาศในไฟล์ Manifest ในส่วน
android:foregroundServiceTypemediaProjection- สิทธิ์ในการประกาศในไฟล์ Manifest
FOREGROUND_SERVICE_MEDIA_PROJECTION- ค่าคงที่ที่จะส่งไปยัง
startForeground() FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION- ข้อกําหนดเบื้องต้นของรันไทม์
เรียกใช้เมธอด
createScreenCaptureIntent()ก่อนเริ่มบริการที่ทำงานอยู่เบื้องหน้า ซึ่งจะแสดงการแจ้งเตือนสิทธิ์ให้ผู้ใช้ทราบ ผู้ใช้ต้องให้สิทธิ์ก่อนที่คุณจึงจะสร้างบริการได้หลังจากสร้างบริการที่ทำงานอยู่เบื้องหน้าแล้ว คุณจะเรียกใช้
MediaProjectionManager.getMediaProjection()ได้- คำอธิบาย
ฉายเนื้อหาไปยังจอแสดงผลที่ไม่ใช่อุปกรณ์หลักหรืออุปกรณ์ภายนอกโดยใช้
MediaProjectionAPI เนื้อหานี้ไม่จำเป็นต้องเป็นเนื้อหาสื่อโดยเฉพาะ- ทางเลือก
หากต้องการสตรีมสื่อไปยังอุปกรณ์อื่น ให้ใช้ Google Cast SDK
ไมโครโฟน
- ประเภทบริการที่ทำงานอยู่เบื้องหน้าที่จะประกาศในไฟล์ Manifest ในส่วน
android:foregroundServiceTypemicrophone- สิทธิ์ในการประกาศในไฟล์ Manifest
FOREGROUND_SERVICE_MICROPHONE- ค่าคงที่ที่จะส่งไปยัง
startForeground() FOREGROUND_SERVICE_TYPE_MICROPHONE- ข้อกําหนดเบื้องต้นของรันไทม์
ขอและได้รับสิทธิ์รันไทม์
RECORD_AUDIOหมายเหตุ: สิทธิ์รันไทม์
RECORD_AUDIOอยู่ภายใต้ข้อจำกัดขณะใช้งาน ด้วยเหตุนี้ คุณจึงสร้างmicrophoneบริการที่ทำงานอยู่เบื้องหน้าไม่ได้ขณะที่แอปอยู่ในเบื้องหลัง ยกเว้นบางกรณี ดูข้อมูลเพิ่มเติมได้ที่ข้อจำกัดในการเริ่มบริการที่ทำงานอยู่เบื้องหน้าซึ่งต้องใช้สิทธิ์ขณะใช้งาน- คำอธิบาย
ไมโครโฟนจะบันทึกเสียงจากเบื้องหลังอย่างต่อเนื่อง เช่น โปรแกรมอัดเสียงหรือแอปการสื่อสาร
การโทร
- ประเภทบริการที่ทำงานอยู่เบื้องหน้าที่จะประกาศในไฟล์ Manifest ในส่วน
android:foregroundServiceTypephoneCall- สิทธิ์ในการประกาศในไฟล์ Manifest
FOREGROUND_SERVICE_PHONE_CALL- ค่าคงที่ที่จะส่งไปยัง
startForeground() FOREGROUND_SERVICE_TYPE_PHONE_CALL- ข้อกําหนดเบื้องต้นของรันไทม์
เงื่อนไขต่อไปนี้อย่างน้อย 1 ข้อจะต้องเป็นจริง
- แอปได้ประกาศสิทธิ์
MANAGE_OWN_CALLSในไฟล์ Manifest
- แอปได้ประกาศสิทธิ์
- แอปเป็นแอปโทรศัพท์เริ่มต้นผ่านบทบาท
ROLE_DIALER
- แอปเป็นแอปโทรศัพท์เริ่มต้นผ่านบทบาท
- คำอธิบาย
ดำเนินการต่อกับการโทรที่กำลังดำเนินอยู่โดยใช้ API ของ
ConnectionService- ทางเลือก
หากต้องการโทรทางโทรศัพท์ วิดีโอ หรือ VoIP ให้ลองใช้คลัง
android.telecomลองใช้
CallScreeningServiceเพื่อสกรีนสายเรียกเข้า
การรับส่งข้อความระยะไกล
- ประเภทบริการที่ทำงานอยู่เบื้องหน้าที่จะประกาศในไฟล์ Manifest ในส่วน
android:foregroundServiceTyperemoteMessaging- สิทธิ์ในการประกาศในไฟล์ Manifest
FOREGROUND_SERVICE_REMOTE_MESSAGING- ค่าคงที่ที่จะส่งไปยัง
startForeground() FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING- ข้อกําหนดเบื้องต้นของรันไทม์
- ไม่มี
- คำอธิบาย
- โอน SMS จากอุปกรณ์เครื่องหนึ่งไปยังอีกเครื่อง ช่วยเหลืองานการรับส่งข้อความของผู้ใช้ให้มีความต่อเนื่องเมื่อเปลี่ยนอุปกรณ์
บริการสั้นๆ
- ประเภทบริการที่ทำงานอยู่เบื้องหน้าที่จะประกาศในไฟล์ Manifest ในส่วน
android:foregroundServiceTypeshortService- สิทธิ์ในการประกาศในไฟล์ Manifest
- ไม่มี
- ค่าคงที่ที่จะส่งไปยัง
startForeground() FOREGROUND_SERVICE_TYPE_SHORT_SERVICE- ข้อกําหนดเบื้องต้นของรันไทม์
- ไม่มี
- คำอธิบาย
ทำงานที่สำคัญซึ่งต้องดำเนินการให้เสร็จโดยไม่มีการหยุดชะงักหรือเลื่อนออกไปได้อย่างรวดเร็ว
ประเภทนี้มีเอกลักษณ์เฉพาะตัวดังนี้
- ทำงานได้เพียงระยะเวลาสั้นๆ (ประมาณ 3 นาที)
- ไม่รองรับบริการที่ทำงานอยู่เบื้องหน้าแบบติดหนึบ
- เริ่มบริการอื่นๆ ที่ทำงานอยู่เบื้องหน้าไม่ได้
- ไม่ต้องมีสิทธิ์เฉพาะประเภท แต่ยังคงต้องใช้สิทธิ์
FOREGROUND_SERVICE shortServiceจะเปลี่ยนเป็นบริการประเภทอื่นได้ก็ต่อเมื่อแอปมีสิทธิ์เริ่มบริการที่ทำงานอยู่เบื้องหน้าใหม่- บริการที่ทำงานอยู่เบื้องหน้าสามารถเปลี่ยนประเภทเป็น
shortServiceได้ทุกเมื่อ ซึ่งจะเป็นจุดเริ่มต้นของระยะเวลาหมดเวลา
การหมดเวลาสําหรับ shortService จะเริ่มนับตั้งแต่ที่มีการเรียกใช้
Service.startForeground()แอปควรเรียกใช้Service.stopSelf()หรือService.stopForeground()ก่อนที่จะเกิดเวลาหมด ไม่เช่นนั้น ระบบจะเรียกService.onTimeout()ใหม่ ซึ่งแอปจะมีเวลาสั้นๆ ในการเรียกstopSelf()หรือstopForeground()เพื่อหยุดให้บริการหลังจากเรียก
Service.onTimeout()ไม่นาน แอปจะเข้าสู่สถานะแคชและระบบจะไม่ถือว่าแอปอยู่ในเบื้องหน้าอีกต่อไป เว้นแต่ผู้ใช้จะโต้ตอบกับแอปอยู่ ไม่นานหลังจากที่แอปแคชและบริการยังไม่หยุดทำงาน แอปจะได้รับ ANR ข้อความ ANRP พูดถึงFOREGROUND_SERVICE_TYPE_SHORT_SERVICEด้วยเหตุนี้ การใช้Service.onTimeout()การเรียกกลับจึงถือเป็นแนวทางปฏิบัติแนะนำฟีเจอร์ติดต่อกลับ
Service.onTimeout()ไม่มีให้บริการใน Android 13 และต่ำกว่า หากบริการเดียวกันทำงานในอุปกรณ์ดังกล่าว บริการจะไม่หมดเวลาและจะไม่เกิด ANR ตรวจสอบว่าบริการหยุดทำงานทันทีที่ประมวลผลงานเสร็จ แม้ว่าจะยังไม่ได้รับService.onTimeout()callback ก็ตามโปรดทราบว่าหากไม่ปฏิบัติตามการหมดเวลาของ
shortServiceแอปจะแสดง ANR แม้ว่าจะมีบริการที่ทำงานอยู่เบื้องหน้าอื่นๆ ที่ถูกต้องหรือกระบวนการอื่นๆ ของวงจรชีวิตของแอปที่ทำงานอยู่ก็ตามหากผู้ใช้มองเห็นแอปหรือแอปเป็นไปตามข้อยกเว้นข้อใดข้อหนึ่งซึ่งอนุญาตให้เริ่มบริการที่ทำงานอยู่เบื้องหน้าจากเบื้องหลังได้ การเรียกใช้
Service.StartForeground()อีกครั้งด้วยพารามิเตอร์FOREGROUND_SERVICE_TYPE_SHORT_SERVICEจะขยายเวลาหมดเวลาอีก 3 นาที หากผู้ใช้ไม่เห็นแอปและไม่เป็นไปตามข้อยกเว้นข้อใดข้อหนึ่ง การพยายามเริ่มบริการที่ทำงานอยู่เบื้องหน้าอีกรายการหนึ่งไม่ว่าประเภทใดก็ตามจะทำให้เกิดForegroundServiceStartNotAllowedExceptionหากผู้ใช้ปิดใช้การเพิ่มประสิทธิภาพแบตเตอรี่สำหรับแอปของคุณ แอปจะยังคงได้รับผลกระทบจากการหมดเวลาของ FGS บริการระยะสั้น
หากคุณเริ่มบริการที่ทำงานอยู่เบื้องหน้าซึ่งมีประเภท
shortServiceและประเภทบริการที่ทำงานอยู่เบื้องหน้าอื่น ระบบจะไม่สนใจการประกาศประเภทshortServiceอย่างไรก็ตาม บริการดังกล่าวยังคงต้องเป็นไปตามข้อกําหนดเบื้องต้นของประเภทอื่นๆ ที่ประกาศไว้ ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบเกี่ยวกับบริการที่ทำงานอยู่เบื้องหน้า
การใช้งานพิเศษ
- ประเภทบริการที่ทำงานอยู่เบื้องหน้าที่จะประกาศในไฟล์ Manifest ภายใต้
android:foregroundServiceTypespecialUse- สิทธิ์ในการประกาศในไฟล์ Manifest
FOREGROUND_SERVICE_SPECIAL_USE- ค่าคงที่ที่จะส่งผ่านไปยัง
startForeground() FOREGROUND_SERVICE_TYPE_SPECIAL_USE- ข้อกำหนดเบื้องต้นของรันไทม์
- ไม่มี
- คำอธิบาย
ครอบคลุมกรณีการใช้งานบริการที่ทำงานอยู่เบื้องหน้าที่ถูกต้องซึ่งไม่ครอบคลุมในกรณีการใช้งานอื่น ประเภทบริการที่ทำงานอยู่เบื้องหน้า
นอกจากการประกาศ
FOREGROUND_SERVICE_TYPE_SPECIAL_USEประเภทบริการที่ทำงานอยู่เบื้องหน้า นักพัฒนาแอปควรประกาศกรณีการใช้งานใน ไฟล์ Manifest ซึ่งวิธีการคือการระบุองค์ประกอบ<property>ภายในองค์ประกอบ องค์ประกอบ<service>ค่าเหล่านี้และกรณีการใช้งานที่เกี่ยวข้อง ตรวจสอบเมื่อคุณส่งแอปใน Google Play Console การใช้งาน กรณีที่คุณใส่นั้นอยู่ในรูปแบบอิสระ และควรตรวจสอบว่าได้ใส่ เพื่อช่วยให้ผู้ตรวจสอบทราบเหตุผลที่คุณต้องใช้specialUseประเภท<service android:name="fooService" android:foregroundServiceType="specialUse"> <property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE" android:value="explanation_for_special_use"/> </service>
ได้รับการยกเว้นจากระบบ
- ประเภทบริการที่ทำงานอยู่เบื้องหน้าที่จะประกาศในไฟล์ Manifest ในส่วน
android:foregroundServiceTypesystemExempted- สิทธิ์ในการประกาศในไฟล์ Manifest
FOREGROUND_SERVICE_SYSTEM_EXEMPTED- ค่าคงที่ที่จะส่งไปยัง
startForeground() FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED- ข้อกําหนดเบื้องต้นของรันไทม์
- ไม่มี
- คำอธิบาย
สงวนไว้สำหรับแอปพลิเคชันของระบบและการผสานรวมระบบที่เฉพาะเจาะจง เพื่อใช้บริการที่ทำงานอยู่เบื้องหน้าต่อไป
หากต้องการใช้ประเภทนี้ แอปต้องเป็นไปตามเกณฑ์ข้อใดข้อหนึ่งต่อไปนี้เป็นอย่างน้อย
- อุปกรณ์อยู่ในสถานะโหมดสาธิต
- แอปเป็นเจ้าของอุปกรณ์
- แอปเป็นเจ้าของเครื่องมือวิเคราะห์
- แอปความปลอดภัยที่มีบทบาท
ROLE_EMERGENCY - แอปผู้ดูแลระบบอุปกรณ์
- แอปที่มีสิทธิ์
SCHEDULE_EXACT_ALARMหรือUSE_EXACT_ALARMและใช้บริการที่ทำงานอยู่เบื้องหน้าเพื่อส่งเสียงปลุกในเบื้องหลังต่อไป รวมถึงการปลุกด้วยระบบสัมผัสเท่านั้น แอป VPN (กำหนดค่าโดยใช้การตั้งค่า > เครือข่ายและอินเทอร์เน็ต > VPN)
มิเช่นนั้น การประกาศประเภทนี้จะทำให้ระบบแสดงข้อผิดพลาด
ForegroundServiceTypeNotAllowedException
การบังคับใช้นโยบาย Google Play สำหรับการใช้ประเภทบริการที่ทำงานอยู่เบื้องหน้า
หากแอปกำหนดเป้าหมายเป็น Android 14 ขึ้นไป คุณจะต้องประกาศประเภทบริการที่ทำงานอยู่เบื้องหน้าของแอปในหน้าเนื้อหาแอปของ Play Console (นโยบาย > เนื้อหาแอป) ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีประกาศประเภทบริการที่ทำงานอยู่เบื้องหน้าใน Play Console ได้ที่การทำความเข้าใจบริการที่ทำงานอยู่เบื้องหน้าและข้อกำหนดของ Intent แบบเต็มหน้าจอ