บริการที่ทำงานอยู่เบื้องหน้า

บริการที่ทำงานอยู่เบื้องหน้าจะดำเนินการที่ผู้ใช้สังเกตเห็นได้

บริการที่ทำงานอยู่เบื้องหน้าจะแสดงแถบสถานะ การแจ้งเตือน เพื่อให้ผู้ใช้ทราบว่า แอปกำลังทำงานในเบื้องหน้าและกำลังใช้ทรัพยากรระบบ

ตัวอย่างแอปที่ใช้บริการที่ทำงานอยู่เบื้องหน้ามีดังต่อไปนี้

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

ใช้บริการที่ทำงานอยู่เบื้องหน้าเมื่อแอปของคุณต้องทำงานเท่านั้น ผู้ใช้สังเกตเห็นได้ แม้ว่าผู้ใช้ไม่ได้โต้ตอบกับ แอปนั้น หากการดำเนินการมีความสำคัญต่ำมากจนคุณต้องการใช้ การแจ้งเตือนลำดับความสำคัญขั้นต่ำ ให้สร้างพื้นหลัง งานแทน

เอกสารนี้อธิบายสิทธิ์ที่จำเป็นสำหรับการใช้บริการที่ทำงานอยู่เบื้องหน้า และวิธีเริ่มต้นบริการที่ทำงานอยู่เบื้องหน้า และนำบริการนั้นออกจากพื้นหลัง และ อธิบายวิธีเชื่อมโยง Use Case บางอย่างกับประเภทบริการที่ทำงานอยู่เบื้องหน้า และ การจํากัดการเข้าถึงที่จะมีผลเมื่อคุณเริ่มบริการที่ทำงานอยู่เบื้องหน้า จากแอปที่ทำงานอยู่เบื้องหลัง

ผู้ใช้สามารถปิดการแจ้งเตือนโดยค่าเริ่มต้น

เริ่มตั้งแต่ Android 13 (API ระดับ 33) เป็นต้นไป ผู้ใช้จะปิดการแจ้งเตือนได้ เชื่อมโยงกับบริการที่ทำงานอยู่เบื้องหน้าโดยค่าเริ่มต้น โดยผู้ใช้ต้องปัดนิ้ว ท่าทางสัมผัสในการแจ้งเตือน เดิมทีการแจ้งเตือน ไม่ได้ปิดเว้นแต่บริการที่ทำงานอยู่เบื้องหน้าจะหยุดทำงานหรือนำออก จากเบื้องหน้า

หากคุณต้องการให้ผู้ใช้ปิดการแจ้งเตือนไม่ได้ ให้ส่งผ่าน true เข้าสู่ setOngoing() เมื่อคุณสร้างการแจ้งเตือนโดยใช้ Notification.Builder

บริการที่แสดงการแจ้งเตือนทันที

หากบริการที่ทำงานอยู่เบื้องหน้ามีลักษณะต่อไปนี้อย่างน้อย 1 อย่าง ระบบจะแสดงการแจ้งเตือนที่เกี่ยวข้องทันทีหลังจากบริการเริ่มต้น แม้ในอุปกรณ์ที่ใช้ Android 12 ขึ้นไป

ใน 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 ขึ้นไป) วิธีการนี้ใช้รายการต่อไปนี้ ได้แก่

ประเภทเหล่านี้อาจเป็นส่วนหนึ่งของประเภทที่ประกาศในไฟล์ 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() เมธอดนี้ใช้บูลีนซึ่งระบุว่าจะนำแถบสถานะออกหรือไม่ ได้ด้วย โปรดทราบว่าบริการจะยังคงทำงานต่อไป

หากคุณหยุดบริการขณะที่ทำงานอยู่ในเบื้องหน้า การแจ้งเตือนของบริการ จะถูกลบ

จัดการการหยุดแอปที่เรียกใช้บริการที่ทำงานอยู่เบื้องหน้าซึ่งเริ่มต้นโดยผู้ใช้

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

เริ่มตั้งแต่ Android 13 (API ระดับ 33) เป็นต้นไป ผู้ใช้จะทำเวิร์กโฟลว์ให้เสร็จได้จาก ลิ้นชักการแจ้งเตือน เพื่อหยุดแอปที่ให้บริการที่ทำงานอยู่เบื้องหน้า ไม่ว่าแอปนั้นจะเป็นแอปใดก็ตาม เวอร์ชัน SDK เป้าหมาย ในราคานี้ ที่เรียกว่า ตัวจัดการงานจะแสดงรายการแอปที่ กำลังใช้บริการที่ทำงานอยู่เบื้องหน้า

รายการนี้จะมีป้ายกำกับว่าแอปที่ใช้งานอยู่ ข้างๆ แต่ละแอปจะเป็นปุ่มหยุด รูปที่ 1 แสดง เวิร์กโฟลว์ของตัวจัดการงานในอุปกรณ์ที่เรียกใช้ Android 13

เมื่อผู้ใช้กดปุ่มหยุดข้างแอปของคุณใน ตัวจัดการงานจะมีการทำงานต่อไปนี้

  • ระบบจะนำแอปของคุณออกจากหน่วยความจำ ดังนั้น การหยุดแอปทั้งแอป ไม่ใช่แค่บริการที่ทำงานอยู่เบื้องหน้า
  • ระบบจะนำรายการกิจกรรมย้อนหลังของแอปออก
  • การเล่นสื่อจะหยุดลง
  • ระบบจะนำการแจ้งเตือนที่เชื่อมโยงกับบริการที่ทำงานอยู่เบื้องหน้าออก
  • แอปของคุณยังคงอยู่ในประวัติ
  • งานที่กำหนดเวลาไว้จะดำเนินตามเวลาที่กำหนด
  • นาฬิกาปลุกจะดังตามเวลาหรือกรอบเวลาที่ตั้งไว้

ในการทดสอบว่าแอปทำงานตามที่คาดไว้หรือไม่ในขณะที่และหลังจากที่ผู้ใช้หยุด ให้เรียกใช้คำสั่ง ADB ต่อไปนี้ในหน้าต่างเทอร์มินัล

adb shell cmd activity stop-app PACKAGE_NAME

การยกเว้น

ระบบจะให้การยกเว้นหลายระดับสำหรับแอปบางประเภท ซึ่งอธิบายไว้ในส่วนต่อไปนี้

การยกเว้นเป็นการดำเนินการตามแอป ไม่ใช่ตามกระบวนการ หากระบบยกเว้น 1 กระบวนการใน กระบวนการอื่นๆ ทั้งหมดในแอปนั้นจะได้รับการยกเว้นด้วย

การยกเว้นไม่ให้ปรากฏในตัวจัดการงานเลย

แอปต่อไปนี้เรียกใช้บริการที่ทำงานอยู่เบื้องหน้าได้ และจะไม่ปรากฏในส่วน ตัวจัดการงานเลย:

  • แอประดับระบบ
  • แอปความปลอดภัย ซึ่งก็คือแอปที่มี บทบาท ROLE_EMERGENCY
  • อุปกรณ์ที่อยู่ใน โหมดสาธิต

การยกเว้นไม่ให้ผู้ใช้หยุดได้

เมื่อประเภทแอปต่อไปนี้เรียกใช้บริการที่ทำงานอยู่เบื้องหน้า แอปจะปรากฏในส่วน ตัวจัดการงาน แต่ไม่มีปุ่มหยุดถัดจาก ชื่อแอปเพื่อให้ผู้ใช้แตะ

ใช้ API ที่สร้างตามวัตถุประสงค์แทนบริการที่ทำงานอยู่เบื้องหน้า

มี API ของแพลตฟอร์มหรือ Jetpack ที่นำไปใช้ในการทำงานได้ในหลายกรณี ไม่ก็คุณอาจใช้บริการที่ทำงานอยู่เบื้องหน้าได้ หากมี API ที่สร้างขึ้นโดยเฉพาะ คุณจึงมักจะใช้ API นี้แทนที่จะใช้เบื้องหน้า service. API ที่สร้างขึ้นสำหรับวัตถุประสงค์ต่างๆ มักให้กรณีการใช้งานเพิ่มเติมที่เฉพาะเจาะจง ที่คุณอาจต้องสร้างด้วยตัวเอง ตัวอย่างเช่น Bubbles API จะจัดการตรรกะ UI ที่ซับซ้อนสำหรับ แอปรับส่งข้อความที่ต้องใช้ฟีเจอร์ลูกโป่งแชท

เอกสารประกอบสำหรับรายการประเภทบริการที่ทำงานอยู่เบื้องหน้า ทางเลือกที่ดีในการใช้แทนบริการที่ทำงานอยู่เบื้องหน้า

ข้อจำกัดเกี่ยวกับการเริ่มบริการที่ทำงานอยู่เบื้องหน้าจากเบื้องหลัง

แอปที่กำหนดเป้าหมายเป็น Android 12 ขึ้นไปจะเริ่มในเบื้องหน้าไม่ได้ ขณะแอปทำงานในพื้นหลัง ยกเว้นกรณีพิเศษบางอย่าง กรณี หากมีแอปพยายามจะเริ่มต้น บริการที่ทำงานอยู่เบื้องหน้าในขณะที่แอปทำงานในเบื้องหลังและที่ทำงานอยู่เบื้องหน้า บริการไม่ตรงตามกรณีพิเศษกรณีใดกรณีหนึ่ง ระบบจะแสดงข้อผิดพลาด ForegroundServiceStartNotAllowedException

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

การยกเว้นจากข้อจำกัดในการเริ่มต้นทำงานในเบื้องหลัง

ในสถานการณ์ต่อไปนี้ แอปจะเริ่มบริการที่ทำงานอยู่เบื้องหน้าได้แม้ในขณะที่ ที่แอปของคุณทำงานอยู่เบื้องหลัง

ข้อจำกัดเกี่ยวกับการเริ่มบริการที่ทำงานอยู่เบื้องหน้าซึ่งต้องมีสิทธิ์ขณะใช้งาน

มีสถานการณ์พิเศษบางอย่างที่ควรทราบใน 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