บริการที่ทำงานอยู่เบื้องหน้าจะดำเนินการที่ผู้ใช้สังเกตเห็นได้
บริการที่ทำงานอยู่เบื้องหน้าจะแสดงแถบสถานะ การแจ้งเตือน เพื่อให้ผู้ใช้ทราบว่า แอปกำลังทำงานในเบื้องหน้าและกำลังใช้ทรัพยากรระบบ
ตัวอย่างแอปที่ใช้บริการที่ทำงานอยู่เบื้องหน้ามีดังต่อไปนี้
- แอปโปรแกรมเล่นเพลงที่เปิดเพลงในบริการที่ทำงานอยู่เบื้องหน้า การแจ้งเตือน อาจแสดงเพลงที่กำลังเล่นอยู่
- แอปฟิตเนสที่บันทึกการวิ่งของผู้ใช้ในบริการที่ทำงานอยู่เบื้องหน้า หลังจาก ได้รับสิทธิ์จากผู้ใช้ การแจ้งเตือนอาจแสดงระยะทาง ที่ผู้ใช้เดินทางในระหว่างเซสชันการออกกำลังกายปัจจุบัน
ใช้บริการที่ทำงานอยู่เบื้องหน้าเมื่อแอปของคุณต้องทำงานเท่านั้น ผู้ใช้สังเกตเห็นได้ แม้ว่าผู้ใช้ไม่ได้โต้ตอบกับ แอปนั้น หากการดำเนินการมีความสำคัญต่ำมากจนคุณต้องการใช้ การแจ้งเตือนลำดับความสำคัญขั้นต่ำ ให้สร้างพื้นหลัง งานแทน
เอกสารนี้อธิบายสิทธิ์ที่จำเป็นสำหรับการใช้บริการที่ทำงานอยู่เบื้องหน้า และวิธีเริ่มต้นบริการที่ทำงานอยู่เบื้องหน้า และนำบริการนั้นออกจากพื้นหลัง และ อธิบายวิธีเชื่อมโยง Use Case บางอย่างกับประเภทบริการที่ทำงานอยู่เบื้องหน้า และ การจํากัดการเข้าถึงที่จะมีผลเมื่อคุณเริ่มบริการที่ทำงานอยู่เบื้องหน้า จากแอปที่ทำงานอยู่เบื้องหลัง
ผู้ใช้สามารถปิดการแจ้งเตือนโดยค่าเริ่มต้น
เริ่มตั้งแต่ Android 13 (API ระดับ 33) เป็นต้นไป ผู้ใช้จะปิดการแจ้งเตือนได้ เชื่อมโยงกับบริการที่ทำงานอยู่เบื้องหน้าโดยค่าเริ่มต้น โดยผู้ใช้ต้องปัดนิ้ว ท่าทางสัมผัสในการแจ้งเตือน เดิมทีการแจ้งเตือน ไม่ได้ปิดเว้นแต่บริการที่ทำงานอยู่เบื้องหน้าจะหยุดทำงานหรือนำออก จากเบื้องหน้า
หากคุณต้องการให้ผู้ใช้ปิดการแจ้งเตือนไม่ได้ ให้ส่งผ่าน
true
เข้าสู่ setOngoing()
เมื่อคุณสร้างการแจ้งเตือนโดยใช้ Notification.Builder
บริการที่แสดงการแจ้งเตือนทันที
หากบริการที่ทำงานอยู่เบื้องหน้ามีลักษณะต่อไปนี้อย่างน้อย 1 อย่าง ระบบจะแสดงการแจ้งเตือนที่เกี่ยวข้องทันทีหลังจากบริการเริ่มต้น แม้ในอุปกรณ์ที่ใช้ Android 12 ขึ้นไป
- บริการเชื่อมโยงกับการแจ้งเตือนที่มี action ปุ่ม
- บริการมี
foregroundServiceType
จากmediaPlayback
,mediaProjection
หรือphoneCall
- บริการมีกรณีการใช้งานที่เกี่ยวข้องกับการโทร การนำทาง หรือสื่อ การเล่นตามที่ระบุไว้ในหมวดหมู่ของการแจ้งเตือน
- บริการได้เลือกไม่ใช้การเปลี่ยนแปลงการทำงานโดยส่ง
ภาษา
FOREGROUND_SERVICE_IMMEDIATE
setForegroundServiceBehavior()
เมื่อตั้งค่าการแจ้งเตือน
ใน Android 13 (API ระดับ 33) ขึ้นไป หากผู้ใช้ปฏิเสธ สิทธิ์การแจ้งเตือน ผู้ใช้ยังคงเห็นประกาศที่เกี่ยวข้องกับบริการที่ทำงานอยู่เบื้องหน้าใน ตัวจัดการงาน แต่ไม่เห็นในลิ้นชักการแจ้งเตือน
ประกาศบริการที่ทำงานอยู่เบื้องหน้าในไฟล์ Manifest
ประกาศบริการที่ทำงานอยู่เบื้องหน้าของแต่ละแอปในไฟล์ Manifest ของแอป
ด้วย <service>
สำหรับแต่ละบริการ ให้ใช้
แอตทริบิวต์ android:foregroundServiceType
เพื่อประกาศประเภทงานที่บริการทำ
ตัวอย่างเช่น หากแอปสร้างบริการที่ทำงานอยู่เบื้องหน้าซึ่งเปิดเพลง คุณจะ อาจประกาศบริการดังนี้
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>
<application ...>
<service
android:name=".MyMediaPlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="false">
</service>
</application>
</manifest>
หากบริการของคุณหลายประเภทมีผลกับบริการของคุณ ให้แยกประเภทด้วย |
ตัวอย่างเช่น บริการที่ใช้กล้องและไมโครโฟน
จะประกาศในลักษณะนี้
android:foregroundServiceType="camera|microphone"
ขอสิทธิ์บริการที่ทำงานอยู่เบื้องหน้า
แอปที่กำหนดเป้าหมายเป็น Android 9 (API ระดับ 28) ขึ้นไปและใช้บริการที่ทำงานอยู่เบื้องหน้า
จำเป็นต้องขอ
FOREGROUND_SERVICE
ในไฟล์ Manifest ของแอป ดังที่แสดงในข้อมูลโค้ดต่อไปนี้ นี่เป็นปกติ
ดังนั้นระบบ
ให้สิทธิ์แอปพลิเคชันกับแอปที่ส่งคำขอโดยอัตโนมัติ
นอกจากนี้ หากแอปกำหนดเป้าหมายเป็น API ระดับ 34 ขึ้นไป แอปจะต้องขอ
ประเภทสิทธิ์ที่เหมาะสมสำหรับประเภทงานที่บริการที่ทำงานอยู่เบื้องหน้าจะได้รับ
ลงมือทำ บริการที่ทำงานอยู่เบื้องหน้าแต่ละประเภท
มีประเภทสิทธิ์ที่เกี่ยวข้อง เช่น หากแอปเปิดแอป
บริการที่ทำงานอยู่เบื้องหน้าที่ใช้กล้อง คุณต้องร้องขอทั้ง
FOREGROUND_SERVICE
และ FOREGROUND_SERVICE_CAMERA
สิทธิ์ สิทธิ์เหล่านี้เป็นสิทธิ์ปกติทั้งหมด ดังนั้นระบบจึงให้สิทธิ์
โดยอัตโนมัติหากมีการระบุไว้ในไฟล์ Manifest
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CAMERA"/>
<application ...>
...
</application>
</manifest>
ข้อกำหนดเบื้องต้นสำหรับบริการที่ทำงานอยู่เบื้องหน้า
เริ่มตั้งแต่ Android 14 (API ระดับ 34) เมื่อคุณเปิดตัวบริการที่ทำงานอยู่เบื้องหน้า
ระบบจะตรวจสอบข้อกำหนดเบื้องต้นที่เจาะจงตามประเภทของบริการ ตัวอย่างเช่น
หากคุณพยายามเปิดใช้บริการที่ทำงานอยู่เบื้องหน้าประเภท location
ระบบจะตรวจสอบ
เพื่อตรวจสอบว่าแอปมี ACCESS_COARSE_LOCATION
หรือ
สิทธิ์ ACCESS_FINE_LOCATION
ถ้าไม่เปิดขึ้น ระบบจะแสดงข้อผิดพลาด
SecurityException
ด้วยเหตุนี้ คุณต้องยืนยันว่าตรงตามข้อกำหนดเบื้องต้นที่จำเป็น ก่อนเริ่มต้นบริการที่ทำงานอยู่เบื้องหน้า บริการที่ทำงานอยู่เบื้องหน้า เอกสารประเภท แสดงรายการข้อกำหนดเบื้องต้นที่จำเป็นสำหรับบริการที่ทำงานอยู่เบื้องหน้าแต่ละประเภท
เริ่มบริการที่ทำงานอยู่เบื้องหน้า
ก่อนขอให้ระบบเรียกใช้บริการเป็นบริการที่ทำงานอยู่เบื้องหน้า ให้เริ่มต้น ตัวบริการเอง:
Kotlin
val intent = Intent(...) // Build the intent for the service context.startForegroundService(intent)
Java
Context context = getApplicationContext(); Intent intent = new Intent(...); // Build the intent for the service context.startForegroundService(intent);
ภายในบริการ ซึ่งโดยปกติแล้วจะอยู่ใน onStartCommand()
คุณสามารถส่งคำขอ
ที่บริการทำงานอยู่ในเบื้องหน้า โดยโทร
ServiceCompat.startForeground()
(พร้อมใช้งานใน androidx-core 1.12 ขึ้นไป) วิธีการนี้ใช้รายการต่อไปนี้
ได้แก่
- บริการ
- จำนวนเต็มบวกที่ระบุการแจ้งเตือนในแถบสถานะโดยไม่ซ้ำกัน
- ออบเจ็กต์
Notification
เอง - ประเภทบริการที่ทำงานอยู่เบื้องหน้า ระบุงานที่บริการทำ
ประเภทเหล่านี้อาจเป็นส่วนหนึ่งของประเภทที่ประกาศในไฟล์ Manifest
โดยขึ้นอยู่กับ Use Case เฉพาะ จากนั้นหากคุณต้องการเพิ่มประเภทบริการ
คุณสามารถโทรหา startForeground()
อีกครั้ง
ตัวอย่างเช่น สมมติว่าแอปฟิตเนสเรียกใช้บริการติดตามการวิ่ง
ต้องใช้ข้อมูล location
แต่อาจไม่จำเป็นต้องเล่นสื่อ คุณ
จะต้องประกาศทั้ง location
และ mediaPlayback
ในไฟล์ Manifest หากมี
ผู้ใช้เริ่มวิ่งและต้องการติดตามตำแหน่ง แอปของคุณควรเรียกใช้
startForeground()
และผ่านเฉพาะสิทธิ์ ACCESS_FINE_LOCATION
จากนั้นให้ทำดังนี้
หากผู้ใช้ต้องการเริ่มเล่นเสียง ให้โทรหา startForeground()
อีกครั้งและ
ส่งผ่านการรวมบิตไวส์ของประเภทบริการที่ทำงานอยู่เบื้องหน้าทั้งหมด (ในกรณีนี้คือ
ACCESS_FINE_LOCATION|FOREGROUND_SERVICE_MEDIA_PLAYBACK
)
นี่คือตัวอย่างที่เปิดใช้บริการที่ทำงานอยู่เบื้องหน้าของกล้อง
Kotlin
class MyCameraService: Service() { private fun startForeground() { // Before starting the service as foreground check that the app has the // appropriate runtime permissions. In this case, verify that the user has // granted the CAMERA permission. val cameraPermission = PermissionChecker.checkSelfPermission(this, Manifest.permission.CAMERA) if (cameraPermission != PermissionChecker.PERMISSION_GRANTED) { // Without camera permissions the service cannot run in the foreground // Consider informing user or updating your app UI if visible. stopSelf() return } try { val notification = NotificationCompat.Builder(this, "CHANNEL_ID") // Create the notification to display while the service is running .build() ServiceCompat.startForeground( /* service = */ this, /* id = */ 100, // Cannot be 0 /* notification = */ notification, /* foregroundServiceType = */ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA } else { 0 }, ) } catch (e: Exception) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && e is ForegroundServiceStartNotAllowedException) { // App not in a valid state to start foreground service // (e.g. started from bg) } // ... } } }
Java
public class MyCameraService extends Service { private void startForeground() { // Before starting the service as foreground check that the app has the // appropriate runtime permissions. In this case, verify that the user // has granted the CAMERA permission. int cameraPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA); if (cameraPermission == PackageManager.PERMISSION_DENIED) { // Without camera permissions the service cannot run in the // foreground. Consider informing user or updating your app UI if // visible. stopSelf(); return; } try { Notification notification = new NotificationCompat.Builder(this, "CHANNEL_ID") // Create the notification to display while the service // is running .build(); int type = 0; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { type = ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA; } ServiceCompat.startForeground( /* service = */ this, /* id = */ 100, // Cannot be 0 /* notification = */ notification, /* foregroundServiceType = */ type ); } catch (Exception e) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && e instanceof ForegroundServiceStartNotAllowedException ) { // App not in a valid state to start foreground service // (e.g started from bg) } // ... } } //... }
นำบริการออกจากเบื้องหน้า
หากต้องการนำบริการออกจากเบื้องหน้า ให้โทร
stopForeground()
เมธอดนี้ใช้บูลีนซึ่งระบุว่าจะนำแถบสถานะออกหรือไม่
ได้ด้วย โปรดทราบว่าบริการจะยังคงทำงานต่อไป
หากคุณหยุดบริการขณะที่ทำงานอยู่ในเบื้องหน้า การแจ้งเตือนของบริการ จะถูกลบ
จัดการการหยุดแอปที่เรียกใช้บริการที่ทำงานอยู่เบื้องหน้าซึ่งเริ่มต้นโดยผู้ใช้
เริ่มตั้งแต่ Android 13 (API ระดับ 33) เป็นต้นไป ผู้ใช้จะทำเวิร์กโฟลว์ให้เสร็จได้จาก ลิ้นชักการแจ้งเตือน เพื่อหยุดแอปที่ให้บริการที่ทำงานอยู่เบื้องหน้า ไม่ว่าแอปนั้นจะเป็นแอปใดก็ตาม เวอร์ชัน SDK เป้าหมาย ในราคานี้ ที่เรียกว่า ตัวจัดการงานจะแสดงรายการแอปที่ กำลังใช้บริการที่ทำงานอยู่เบื้องหน้า
รายการนี้จะมีป้ายกำกับว่าแอปที่ใช้งานอยู่ ข้างๆ แต่ละแอปจะเป็นปุ่มหยุด รูปที่ 1 แสดง เวิร์กโฟลว์ของตัวจัดการงานในอุปกรณ์ที่เรียกใช้ Android 13
เมื่อผู้ใช้กดปุ่มหยุดข้างแอปของคุณใน ตัวจัดการงานจะมีการทำงานต่อไปนี้
- ระบบจะนำแอปของคุณออกจากหน่วยความจำ ดังนั้น การหยุดแอปทั้งแอป ไม่ใช่แค่บริการที่ทำงานอยู่เบื้องหน้า
- ระบบจะนำรายการกิจกรรมย้อนหลังของแอปออก
- การเล่นสื่อจะหยุดลง
- ระบบจะนำการแจ้งเตือนที่เชื่อมโยงกับบริการที่ทำงานอยู่เบื้องหน้าออก
- แอปของคุณยังคงอยู่ในประวัติ
- งานที่กำหนดเวลาไว้จะดำเนินตามเวลาที่กำหนด
- นาฬิกาปลุกจะดังตามเวลาหรือกรอบเวลาที่ตั้งไว้
ในการทดสอบว่าแอปทำงานตามที่คาดไว้หรือไม่ในขณะที่และหลังจากที่ผู้ใช้หยุด ให้เรียกใช้คำสั่ง ADB ต่อไปนี้ในหน้าต่างเทอร์มินัล
adb shell cmd activity stop-app PACKAGE_NAME
การยกเว้น
ระบบจะให้การยกเว้นหลายระดับสำหรับแอปบางประเภท ซึ่งอธิบายไว้ในส่วนต่อไปนี้
การยกเว้นเป็นการดำเนินการตามแอป ไม่ใช่ตามกระบวนการ หากระบบยกเว้น 1 กระบวนการใน กระบวนการอื่นๆ ทั้งหมดในแอปนั้นจะได้รับการยกเว้นด้วย
การยกเว้นไม่ให้ปรากฏในตัวจัดการงานเลย
แอปต่อไปนี้เรียกใช้บริการที่ทำงานอยู่เบื้องหน้าได้ และจะไม่ปรากฏในส่วน ตัวจัดการงานเลย:
- แอประดับระบบ
- แอปความปลอดภัย ซึ่งก็คือแอปที่มี
บทบาท
ROLE_EMERGENCY
- อุปกรณ์ที่อยู่ใน โหมดสาธิต
การยกเว้นไม่ให้ผู้ใช้หยุดได้
เมื่อประเภทแอปต่อไปนี้เรียกใช้บริการที่ทำงานอยู่เบื้องหน้า แอปจะปรากฏในส่วน ตัวจัดการงาน แต่ไม่มีปุ่มหยุดถัดจาก ชื่อแอปเพื่อให้ผู้ใช้แตะ
- แอปของเจ้าของอุปกรณ์
- เจ้าของโปรไฟล์ แอป
- แอปแบบถาวร
- แอปที่มี
บทบาท
ROLE_DIALER
ใช้ API ที่สร้างตามวัตถุประสงค์แทนบริการที่ทำงานอยู่เบื้องหน้า
มี API ของแพลตฟอร์มหรือ Jetpack ที่นำไปใช้ในการทำงานได้ในหลายกรณี ไม่ก็คุณอาจใช้บริการที่ทำงานอยู่เบื้องหน้าได้ หากมี API ที่สร้างขึ้นโดยเฉพาะ คุณจึงมักจะใช้ API นี้แทนที่จะใช้เบื้องหน้า service. API ที่สร้างขึ้นสำหรับวัตถุประสงค์ต่างๆ มักให้กรณีการใช้งานเพิ่มเติมที่เฉพาะเจาะจง ที่คุณอาจต้องสร้างด้วยตัวเอง ตัวอย่างเช่น Bubbles API จะจัดการตรรกะ UI ที่ซับซ้อนสำหรับ แอปรับส่งข้อความที่ต้องใช้ฟีเจอร์ลูกโป่งแชท
เอกสารประกอบสำหรับรายการประเภทบริการที่ทำงานอยู่เบื้องหน้า ทางเลือกที่ดีในการใช้แทนบริการที่ทำงานอยู่เบื้องหน้า
ข้อจำกัดเกี่ยวกับการเริ่มบริการที่ทำงานอยู่เบื้องหน้าจากเบื้องหลัง
แอปที่กำหนดเป้าหมายเป็น Android 12 ขึ้นไปจะเริ่มในเบื้องหน้าไม่ได้
ขณะแอปทำงานในพื้นหลัง ยกเว้นกรณีพิเศษบางอย่าง
กรณี หากมีแอปพยายามจะเริ่มต้น
บริการที่ทำงานอยู่เบื้องหน้าในขณะที่แอปทำงานในเบื้องหลังและที่ทำงานอยู่เบื้องหน้า
บริการไม่ตรงตามกรณีพิเศษกรณีใดกรณีหนึ่ง ระบบจะแสดงข้อผิดพลาด
ForegroundServiceStartNotAllowedException
นอกจากนี้ หากแอปต้องการเปิดบริการที่ทำงานอยู่เบื้องหน้าที่ต้องใช้ สิทธิ์ขณะใช้งาน (เช่น เซ็นเซอร์ร่างกาย กล้อง ไมโครโฟน หรือ สถานที่ สิทธิ์) จะไม่สามารถสร้างบริการขณะที่แอปอยู่ในเบื้องหลัง แม้ว่าแอปจะตกอยู่ในข้อยกเว้นข้อใดข้อหนึ่งจากการเริ่มทำงานในเบื้องหลัง ข้อจำกัด สาเหตุของข้อจำกัดนี้มีการอธิบายอยู่ในส่วนข้อจำกัดเกี่ยวกับ กำลังเริ่มบริการที่ทำงานอยู่เบื้องหน้าที่ต้องใช้ขณะใช้งาน สิทธิ์
การยกเว้นจากข้อจำกัดในการเริ่มต้นทำงานในเบื้องหลัง
ในสถานการณ์ต่อไปนี้ แอปจะเริ่มบริการที่ทำงานอยู่เบื้องหน้าได้แม้ในขณะที่ ที่แอปของคุณทำงานอยู่เบื้องหลัง
- แอปของคุณเปลี่ยนจากสถานะที่ผู้ใช้มองเห็นได้ เช่น activity
- แอปของคุณสามารถเริ่มกิจกรรมจาก พื้นหลัง ยกเว้นในกรณี ที่แอปมีกิจกรรมในแบ็กสแต็กของงานที่มีอยู่
แอปของคุณจะได้รับข้อความที่มีลำดับความสำคัญสูงโดยใช้ Firebase Cloud การรับส่งข้อความ
ผู้ใช้ดําเนินการในองค์ประกอบ UI ที่เกี่ยวข้องกับแอปของคุณ ตัวอย่างเช่น พวกเขาอาจโต้ตอบกับลูกโป่ง การแจ้งเตือน วิดเจ็ต หรือกิจกรรม
แอปของคุณเรียกใช้การปลุกในเวลาที่แน่นอนเพื่อ ดำเนินการตามที่ผู้ใช้ขอ
แอปของคุณเป็นอินพุตปัจจุบันของอุปกรณ์
แอปของคุณได้รับเหตุการณ์ที่เกี่ยวข้องกับ การกำหนดเขตพื้นที่เสมือน หรือกิจกรรม การจดจำเสียง
หลังจากอุปกรณ์รีบูตและได้รับ
ACTION_BOOT_COMPLETED
ACTION_LOCKED_BOOT_COMPLETED
, หรือACTION_MY_PACKAGE_REPLACED
การดำเนินการผ่าน Intent ในBroadcast Receiverแอปของคุณจะได้รับ
ACTION_TIMEZONE_CHANGED
ACTION_TIME_CHANGED
, หรือACTION_LOCALE_CHANGED
Intent ที่กระทำใน Broadcast Receiverแอปของคุณจะได้รับ
ACTION_TRANSACTION_DETECTED
เหตุการณ์จากNfcService
แอปที่มีบทบาทหรือสิทธิ์บางอย่างของระบบ เช่น device เจ้าของ และ โปรไฟล์ เจ้าของ
แอปของคุณใช้โปรแกรมจัดการอุปกรณ์ที่ใช้ร่วมกัน และประกาศ
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
หรือสิทธิ์REQUEST_COMPANION_RUN_IN_BACKGROUND
สิทธิ์ หากเป็นไปได้ ให้ใช้REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
แอปของคุณมี
SYSTEM_ALERT_WINDOW
สิทธิ์ผู้ใช้ปิดการเพิ่มประสิทธิภาพแบตเตอรี่สำหรับแอปของคุณ
ข้อจำกัดเกี่ยวกับการเริ่มบริการที่ทำงานอยู่เบื้องหน้าซึ่งต้องมีสิทธิ์ขณะใช้งาน
มีสถานการณ์พิเศษบางอย่างที่ควรทราบใน Android 14 (API ระดับ 34) ขึ้นไป ในกรณีที่คุณเริ่มต้นบริการที่ทำงานอยู่เบื้องหน้าที่ต้องใช้สิทธิ์ขณะใช้งาน
หากแอปกำหนดเป้าหมายเป็น Android 14 ขึ้นไป ระบบปฏิบัติการ
ตรวจสอบเมื่อคุณสร้างบริการที่ทำงานอยู่เบื้องหน้าเพื่อให้แน่ใจว่าแอปมีการตั้งค่า
สิทธิ์ที่เหมาะสมสำหรับบริการประเภทนั้นๆ เช่น เมื่อคุณสร้าง
บริการที่ทำงานอยู่เบื้องหน้าประเภท
ไมโครโฟน การทำงาน
ระบบจะยืนยันว่าแอปของคุณมี
RECORD_AUDIO
สิทธิ์ หากคุณไม่มีสิทธิ์นั้น ระบบจะแสดงข้อผิดพลาด
SecurityException
สำหรับสิทธิ์ขณะใช้งาน อาจเกิดปัญหาได้ หากแอปของคุณมี
สิทธิ์ขณะใช้งาน จะมีเพียงสิทธิ์นั้นในขณะที่อยู่ใน
เบื้องหน้า ซึ่งหมายความว่าหากแอปของคุณอยู่ในเบื้องหลังและพยายามสร้าง
บริการที่ทำงานอยู่เบื้องหน้าประเภทกล้อง ตำแหน่ง หรือไมโครโฟนที่ระบบมองเห็น
ที่แอปของคุณไม่มีสิทธิ์ที่จำเป็นในขณะนี้
SecurityException
ในทำนองเดียวกัน หากแอปของคุณอยู่ในเบื้องหลังและสร้าง
บริการด้านสุขภาพที่ต้องมีสิทธิ์ BODY_SENSORS_BACKGROUND
, แอป
แต่ไม่มีสิทธิ์นั้น และระบบก็มีข้อยกเว้น
(แต่จะไม่มีผลหากเป็นบริการด้านสุขภาพที่ต้องมีสิทธิ์ที่แตกต่างกัน
เช่น ACTIVITY_RECOGNITION
) การโทร
PermissionChecker.checkSelfPermission()
ไม่ได้ป้องกันปัญหานี้ หากแอปมีสิทธิ์ขณะใช้งาน และ
อุปกรณ์จะเรียก checkSelfPermission()
เพื่อตรวจสอบว่ามีสิทธิ์ดังกล่าวหรือไม่, เมธอด
แสดงผล PERMISSION_GRANTED
แม้ว่าแอปจะอยู่ในเบื้องหลังก็ตาม เมื่อ
แสดง PERMISSION_GRANTED
ซึ่งเป็นข้อความว่า "แอปของคุณมีสิทธิ์นี้
ขณะใช้งานแอป"
ด้วยเหตุนี้ หากบริการที่ทำงานอยู่เบื้องหน้าต้องการสิทธิ์ขณะใช้งาน คุณจะ
ต้องโทรหา Context.startForegroundService()
หรือ Context.bindService()
แอปของคุณมีกิจกรรมที่มองเห็นได้ เว้นแต่บริการจะอยู่ในหนึ่งใน
การยกเว้นที่กำหนด
การยกเว้นจากข้อจำกัดเกี่ยวกับสิทธิ์ขณะใช้งาน
ในบางสถานการณ์ แม้ว่าบริการที่ทำงานอยู่เบื้องหน้าจะเริ่มทำงานในขณะที่แอป วิ่ง ในเบื้องหลัง โมเดลจะยังเข้าถึงตำแหน่งได้ ข้อมูลกล้องและไมโครโฟนขณะที่แอปทำงานอยู่เบื้องหน้า ("ขณะใช้งาน")
ในสถานการณ์เดียวกันนี้ หากบริการแจ้ง
บริการที่ทำงานอยู่เบื้องหน้าประเภท location
และเริ่มต้นโดยแอปที่
มี
ACCESS_BACKGROUND_LOCATION
ทำให้บริการนี้สามารถเข้าถึงข้อมูลตำแหน่ง ตลอดเวลาแม้ในขณะที่
แอปจะทำงานในพื้นหลัง
รายการต่อไปนี้มีเนื้อหาดังต่อไปนี้
- คอมโพเนนต์ของระบบจะเริ่มต้นบริการ
- บริการเริ่มต้นด้วยการโต้ตอบกับแอป วิดเจ็ต
- บริการเริ่มต้นด้วยการโต้ตอบกับการแจ้งเตือน
- บริการจะเริ่มต้นในฐานะ
PendingIntent
ที่ส่งจาก แอปที่แตกต่างและมองเห็นได้ - บริการจะเริ่มต้นโดยแอปที่เป็นนโยบายด้านอุปกรณ์ ตัวควบคุมที่ทำงานในโหมดเจ้าของอุปกรณ์
- บริการจะเริ่มต้นโดยแอปซึ่งมี
VoiceInteractionService
- บริการจะเริ่มต้นโดยแอปที่มีส่วน
เป็นสิทธิ์เฉพาะบุคคลของ
START_ACTIVITIES_FROM_BACKGROUND
ระบุว่าบริการใดบ้างที่ได้รับผลกระทบในแอป
เมื่อทดสอบแอป ให้เริ่มต้นบริการที่ทำงานอยู่เบื้องหน้า หากบริการที่เริ่มต้นมี จำกัดการเข้าถึงตำแหน่ง ไมโครโฟน และกล้อง ข้อความต่อไปนี้ ปรากฏใน Logcat:
Foreground service started from background can not have \ location/camera/microphone access: service SERVICE_NAME