Foreground Service คือบริการ Android ที่ดำเนินการระยะยาวที่ผู้ใช้มองเห็นได้ โดยมีการแจ้งเตือนบังคับในแถบสถานะ แตกต่างจาก Background Service ซึ่งระบบสามารถหยุดได้เมื่อทรัพยากรไม่เพียงพอ Foreground Service จะได้รับลำดับความสำคัญสูงและทำงานต่อไปแม้ในสภาวะหน่วยความจำจำกัด ตามเอกสารของ Android Developers, 2025 Foreground Service ยังคงเป็นวิธีที่เชื่อถือได้เพียงวิธีเดียวในการทำงานระยะยาวบนอุปกรณ์ที่ใช้ Android 12 ขึ้นไป
ประเด็นสำคัญ
Foreground Service คือคอมโพเนนต์ของ Android ที่ออกแบบมาเพื่อดำเนินการที่ผู้ใช้รู้และเห็นได้ โดยจะแสดงการแจ้งเตือนถาวรในแผงการแจ้งเตือนที่ไม่สามารถปัดออกไปได้ — จะยังคงทำงานอยู่ตราบเท่าที่บริการทำงานอยู่ นี่คือความแตกต่างหลักจากบริการพื้นหลังซึ่งทำงานโดยผู้ใช้ไม่รู้ตัว
ระบบ Android ถือว่า Foreground Service เป็นกระบวนการที่สำคัญอย่างยิ่ง เมื่อ RAM ไม่เพียงพอ แพลตฟอร์มจะยุติ Background Services ก่อน จากนั้นจึงยุติ Activities ที่ถูกแคชไว้ และเฉพาะในกรณีพิเศษเท่านั้น — Foreground Service OOM Killer จะกำหนด ระดับ ADJ 2 ให้กับบริการดังกล่าว ซึ่งในทางปฏิบัติแล้วทำให้ไม่สามารถบังคับยุติได้
ในการเริ่ม Foreground Service นักพัฒนาจะต้องเรียกเมธอด startForeground() ภายในไม่กี่วินาทีหลังจากสร้างบริการ มิฉะนั้นระบบจะสร้างข้อยกเว้น ForegroundServiceDidNotStartInTimeException นี่คือข้อกำหนดที่เข้มงวดของแพลตฟอร์มที่นำมาใช้เพื่อป้องกันงานพื้นหลังที่ไม่ได้รับการประกาศ
กลไก Foreground Service ถูกนำมาใช้ใน Android 1.0 พร้อมกับ SDK แรก แต่การแจ้งเตือนบังคับปรากฏใน Android 9 (API 28) ก่อนหน้านั้น บริการสามารถทำงานในเบื้องหน้าโดยไม่มีตัวบ่งชี้ที่ผู้ใช้มองเห็นได้ ตั้งแต่ Android 9 เป็นต้นไป Google ได้ทำให้ข้อกำหนดเข้มงวดขึ้น: แอปพลิเคชันใดๆ ที่เรียก startForeground จะต้องให้การแจ้งเตือนภายใน 5 วินาที หลังจากเริ่มบริการ
ใน Android 12 (API 31) มีการเพิ่มข้อจำกัดในการเริ่ม Foreground Service จากบริบทพื้นหลัง — ตอนนี้สิทธิ์ FOREGROUND_SERVICE_SPECIAL_USE จำเป็นสำหรับหลายสถานการณ์ Android 14 (API 34) นำการประกาศบังคับของ foregroundServiceType ในแมนิเฟสต์ ทำให้สถาปัตยกรรมบริการโปร่งใสและคาดเดาได้มากขึ้น
กลไกการทำงานของ Foreground Service ขึ้นอยู่กับสามขั้นตอนหลัก: การสร้างบริการ การผูกการแจ้งเตือน และการดำเนินงาน บริการสืบทอดจากคลาส Service และแทนที่เมธอด onStartCommand() ซึ่งเรียก startForeground() พร้อมกับตัวระบุและออบเจ็กต์ Notification
หลังจากเรียก startForeground() ระบบจะย้ายกระบวนการบริการไปยังกลุ่มเบื้องหน้าด้วยลำดับความสำคัญการอยู่รอดที่สูงขึ้น ซึ่งหมายความว่า Android จะพยายามรักษากระบวนการให้ทำงานโดยไม่คำนึงถึงโหลดของ RAM Foreground Service ไม่สามารถหยุดโดยระบบได้ในสภาวะปกติ — เฉพาะเมื่อผู้ใช้ปัดการแจ้งเตือนทิ้ง หรือเรียก stopSelf() อย่างชัดเจน
วงจรชีวิตของ Foreground Service จัดการผ่านเมธอด onCreate(), onStartCommand() และ onDestroy() ใน onStartCommand() นักพัฒนาจะกำหนดกลยุทธ์การเริ่มใหม่หลังจากกระบวนการถูกฆ่า — ค่าคงที่ START_STICKY บังคับให้ระบบสร้างบริการใหม่หลังจากทรัพยากรถูกกู้คืน ในขณะที่ START_NOT_STICKY ป้องกันการเริ่มใหม่โดยอัตโนมัติ
เมื่อเริ่ม Foreground Service ขั้นตอนจะดำเนินการตามลำดับ: เรียก startService(), สร้างออบเจ็กต์ Service ใน onCreate(), ประมวลผล Intent ใน onStartCommand() และเรียก startForeground() พร้อมกับออบเจ็กต์ Notification หากบริการกำลังทำงานอยู่และ Intent ใหม่มาถึง จะเรียกเฉพาะ onStartCommand() อีกครั้ง — onCreate() จะดำเนินการเพียงครั้งเดียวตลอดอายุของบริการ
การหยุด Foreground Service เกิดขึ้นผ่าน stopForeground() ด้วยแฟล็ก REMOVE_NOTIFICATION ซึ่งซ่อนการแจ้งเตือนจากแถบสถานะ ทันทีหลังจากลบการแจ้งเตือน ระบบอาจหยุดถือว่าบริการเป็นเบื้องหน้าและลดลำดับความสำคัญลงเป็น Background Service ทำให้กระบวนการเสี่ยงต่อการถูกยุติ
PowerManager มีบทบาทสำคัญในการทำงานของ Foreground Service เนื่องจากโหมดประหยัดพลังงานของ Android (Doze, App Standby) อาจจำกัดความสามารถในการดำเนินงาน แม้อยู่ในสถานะเบื้องหน้า บริการก็ยังอยู่ภายใต้นโยบายแบตเตอรี่ — คำขอเครือข่ายอาจถูกเลื่อนออกไป และตัวจับเวลาอาจถูกซิงค์กับหน้าต่าง Doze สำหรับการดำเนินการระยะยาวที่ทนต่อความล่าช้า แนะนำให้ใช้ Foreground Service ร่วมกับ WorkManager
ตั้งแต่ Android 14 (API 34) เป็นต้นไป Google ได้นำการประกาศประเภท Foreground Service แบบบังคับในแมนิเฟสต์มาใช้ แต่ละประเภทกำหนดสถานการณ์การใช้งานที่ได้รับอนุญาต — ระบบจะตรวจสอบความสอดคล้องระหว่างประเภทที่ประกาศและพฤติกรรมจริงของบริการ มีทั้งหมด 9 ประเภท แต่ประเภทที่ใช้บ่อยที่สุดมีดังต่อไปนี้
ประเภท dataSync ออกแบบมาสำหรับการซิงค์ข้อมูลระหว่างอุปกรณ์และเซิร์ฟเวอร์ การถ่ายโอนไฟล์ และการสำรองข้อมูล ตัวอย่างรวมถึงการอัปโหลดรูปภาพไปยังที่เก็บข้อมูลคลาวด์ การซิงค์ฐานข้อมูลกับ Firebase หรือการอัปโหลดบันทึกไปยังเซิร์ฟเวอร์ระยะไกล ประเภทนี้จำเป็นต้องระบุเหตุผลในแมนิเฟสต์ผ่านแอตทริบิวต์ android:foregroundServiceType="dataSync"
ประเภท mediaPlayback ใช้สำหรับเล่นเสียงและวิดีโอในพื้นหลัง — เครื่องเล่นเพลง ไคลเอ็นต์พอดแคสต์ เครื่องเล่นวิดีโอ นี่เป็นประเภทเดียวที่สามารถทำงานได้อย่างไม่มีกำหนดโดยไม่ต้องมีการแทรกแซงจากผู้ใช้ ช่องทางการแจ้งเตือนต้องมีลำดับความสำคัญสูงและแสดงปุ่มควบคุมการเล่น — ปุ่มเล่น หยุดชั่วคราว ถัดไป ก่อนหน้า ผ่าน MediaStyle
ประเภท location มีไว้สำหรับบริการระบุตำแหน่งทางภูมิศาสตร์ — แอปนำทาง การติดตามกิจกรรม การกำหนดขอบเขตทางภูมิศาสตร์ สำหรับ Android 14+ จำเป็นต้องประกาศสิทธิ์ FOREGROUND_SERVICE_LOCATION และระบุประเภทในแมนิเฟสต์ แอปพลิเคชันต้องมีสิทธิ์ตำแหน่งที่ทำงานอยู่ขณะรันไทม์ มิฉะนั้นระบบจะปฏิเสธการเริ่มบริการ
| ประเภท | สิทธิ์ | ตัวอย่างการใช้งาน |
|---|---|---|
| dataSync | FOREGROUND_SERVICE_DATA_SYNC | ซิงค์ไฟล์กับคลาวด์ |
| mediaPlayback | FOREGROUND_SERVICE_MEDIA_PLAYBACK | เครื่องเล่นเพลงในพื้นหลัง |
| location | FOREGROUND_SERVICE_LOCATION | GPS นำทางขณะขับรถ |
| camera | FOREGROUND_SERVICE_CAMERA | แอปพลิเคชันเฝ้าระวังวิดีโอ |
| connectedDevice | FOREGROUND_SERVICE_CONNECTED_DEVICE | ทำงานกับอุปกรณ์ BLE |
ความแตกต่างหลักระหว่าง Foreground และ Background Service คือการมีการแจ้งเตือนที่มองเห็นได้และลำดับความสำคัญการอยู่รอด Background Service สามารถถูกหยุดโดยระบบได้ทุกเมื่อเมื่อหน่วยความจำไม่เพียงพอ ในขณะที่ Foreground Service ยังคงทำงานต่อไปเนื่องจาก ระดับ adj ของกระบวนการที่สูงขึ้นในกลไก Low Memory Killer ของ Android
Background Service ไม่ต้องการการแจ้งเตือนและสามารถทำงานโดยผู้ใช้ไม่รู้ตัว อย่างไรก็ตาม ตั้งแต่ Android 8 (API 26) เป็นต้นไป Google ได้จำกัดบริการพื้นหลังอย่างมาก: startService() จากบริบทพื้นหลังไม่ทำงานอีกต่อไป และ Context.startForegroundService() กลายเป็นข้อบังคับสำหรับการเริ่มบริการใดๆ ที่วางแผนจะเปลี่ยนไปใช้เบื้องหน้า ระบบยังนำ ข้อจำกัดการดำเนินการพื้นหลังมาใช้ — ตัวจับเวลา (ปัจจุบัน 10 นาที) หลังจากนั้น Background Service จะถูกหยุดโดยบังคับ
ในทางกลับกัน Foreground Service ไม่มีข้อจำกัดด้านเวลา บริการสามารถทำงานเป็นเวลาหลายชั่วโมงหรือหลายวัน — จนกว่าผู้ใช้จะหยุดอย่างชัดเจนหรือรีบูตอุปกรณ์ ทำให้ Foreground Service เป็นตัวเลือกที่เหมาะสมที่สุดสำหรับแอปพลิเคชันที่ต้องการทำงานพื้นหลังอย่างต่อเนื่อง: เครื่องเล่นเพลง ตัวติดตามกิจกรรม แอปพลิเคชันโทร VoIP
| พารามิเตอร์ | Foreground Service | Background Service |
|---|---|---|
| การแจ้งเตือน | บังคับ | ไม่จำเป็น |
| อายุการใช้งาน | ไม่มีข้อจำกัด | สูงสุด 10 นาที (API 26+) |
| ลำดับความสำคัญของระบบ | สูง (ADJ 2) | ต่ำ (ADJ 8+) |
| การเริ่ม API 26+ | startForegroundService() | ห้ามจากพื้นหลัง |
ตั้งแต่ Android 12 (API 31) เป็นต้นไป Google ได้นำข้อจำกัดที่สำคัญในการเริ่ม Foreground Service มาใช้ การเปลี่ยนแปลงหลักคือการห้ามเรียก startForegroundService() จากบริบทพื้นหลังสำหรับบริการส่วนใหญ่ ข้อยกเว้นจะใช้เฉพาะเมื่อผู้ใช้ให้ความยินยอมอย่างชัดแจ้ง (เช่น ผ่านสิทธิ์ FOREGROUND_SERVICE_SPECIAL_USE) หรือเมื่อบริการเริ่มต้นเพื่อตอบสนองต่ออินเทนต์แพร่ภาพ BOOT_COMPLETED
แมนิเฟสต์ของแอปพลิเคชันที่กำหนดเป้าหมาย API 34+ ต้องมีบล็อก foregroundServiceType สำหรับแต่ละบริการที่ประกาศ ตัวอย่างเช่น สำหรับบริการซิงค์ข้อมูล ให้ระบุ android:foregroundServiceType="dataSync" หากไม่ได้ระบุประเภท ระบบจะถือว่าบริการไม่ถูกต้องและส่งข้อยกเว้น MissingForegroundServiceTypeException เมื่อพยายามเริ่ม Google Play ยังตรวจสอบความสอดคล้องของประเภทและอาจปฏิเสธการเผยแพร่หากไม่ตรงกัน
ใน Android 14 (API 34) แต่ละประเภทของ Foreground Service มีสิทธิ์ที่สอดคล้องกัน นักพัฒนาจะต้องประกาศสิทธิ์เหล่านั้นในแมนิเฟสต์และขอสิทธิ์ขณะรันไทม์ก่อนเริ่มบริการ สำหรับ dataSync จำเป็นต้องใช้ FOREGROUND_SERVICE_DATA_SYNC; สำหรับ mediaPlayback จำเป็นต้องใช้ FOREGROUND_SERVICE_MEDIA_PLAYBACK ผู้ใช้สามารถเพิกถอนสิทธิ์ในการตั้งค่า ซึ่งจะหยุดบริการที่ทำงานอยู่
Google ยังได้นำกลไก Foreground Service Notification Timeout มาใช้ใน Android 14: หากบริการไม่เรียก startForeground() ภายใน 10 วินาทีหลังจากสร้าง ระบบจะสร้างข้อยกเว้น การเข้มงวดนี้มีเป้าหมายเพื่อต่อสู้กับแอปพลิเคชันที่ชะลอหรือข้ามการเรียกการแจ้งเตือน โดยทำงานเป็น Background Service ภายใต้หน้ากากของ foreground
Foreground Service ถูกใช้ในงานที่หลากหลายซึ่งต้องการการดำเนินการที่รับประกันในพื้นหลัง สถานการณ์ที่พบบ่อยที่สุดรวมถึงการเล่นสื่อ การติดตามตำแหน่งทางภูมิศาสตร์ การซิงค์ข้อมูล และการทำงานกับอุปกรณ์ต่อพ่วง มาดูแต่ละกรณีโดยละเอียด
ตัวอย่างคลาสสิกคือ เครื่องเล่นเพลงที่เล่นต่อหลังจากย่อแอปพลิเคชัน บริการเริ่มต้นด้วยการแจ้งเตือน MediaStyle ปุ่มควบคุม และใช้ประเภท mediaPlayback ผู้ใช้เห็นข้อมูลเพลงในแถบสถานะและสามารถควบคุมการเล่นได้โดยไม่ต้องเปิดแอปพลิเคชัน
แอปพลิเคชันนำทางใช้ Foreground Service ประเภท location สำหรับการติดตามพิกัดอย่างต่อเนื่อง บริการแสดงการแจ้งเตือนด้วยความเร็วปัจจุบัน เวลาเดินทาง และปุ่มหยุดการติดตาม หากไม่มี Foreground Service ระบบจะหยุดรับพิกัดในพื้นหลังหลังจากไม่กี่นาที ทำให้การนำทางเป็นไปไม่ได้
แอปพลิเคชันโทรด้วยเสียงและวิดีโอ — ไคลเอ็นต์ VoIP — ใช้ Foreground Service เพื่อรักษาการเชื่อมต่อที่ทำงานอยู่ บริการประเภท phoneCall (ตั้งแต่ Android 14) รับประกันว่าสายจะไม่หลุดเมื่อย่อแอปพลิเคชัน การแจ้งเตือนแสดงระยะเวลาสายและการควบคุมไมโครโฟนและลำโพง
มาดูการสร้าง Foreground Service ใน Kotlin สำหรับการซิงค์ข้อมูลกัน บริการจะเริ่มจาก Activity แสดงการแจ้งเตือนพร้อมความคืบหน้า และสิ้นสุดอย่างถูกต้องหลังจากเสร็จสิ้น ตัวอย่างแสดงองค์ประกอบบังคับทั้งหมด: การประกาศในแมนิเฟสต์ ช่องทางการแจ้งเตือน การเรียก startForeground() และการจัดการ foregroundServiceType
class SyncService : Service() {
companion object {
const val CHANNEL_ID = "sync_channel"
const val NOTIFICATION_ID = 1001
}
override fun onCreate() {
super.onCreate()
createNotificationChannel()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val notification = buildNotification()
startForeground(NOTIFICATION_ID, notification)
performSync()
return START_STICKY
}
private fun createNotificationChannel() {
val channel = NotificationChannel(
CHANNEL_ID,
"การซิงค์",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "ช่องทางการซิงค์ข้อมูล"
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
private fun buildNotification(): Notification {
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("การซิงค์")
.setContentText("การอัปโหลดข้อมูลไปยังเซิร์ฟเวอร์")
.setSmallIcon(R.drawable.ic_sync)
.setOngoing(true)
.build()
}
private fun performSync() {
GlobalScope.launch(Dispatchers.IO) {
// การจำลองการซิงค์
delay(5000)
stopForeground(Service.STOP_FOREGROUND_REMOVE)
stopSelf()
}
}
override fun onBind(intent: Intent): IBinder? = null
}
เพื่อให้บริการทำงานอย่างถูกต้องบน Android 12+ คุณต้องประกาศ Foreground Service ใน AndroidManifest.xml โดยระบุประเภทและสิทธิ์ที่จำเป็น แอตทริบิวต์ foregroundServiceType เป็นข้อบังคับสำหรับ API เป้าหมาย 34+ และสิทธิ์ FOREGROUND_SERVICE_DATA_SYNC และ POST_NOTIFICATIONS ต้องถูกขอขณะรันไทม์
<!-- AndroidManifest.xml -->
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission
android:name="android.permission.POST_NOTIFICATIONS" />
<application ...>
<service
android:name=".SyncService"
android:foregroundServiceType="dataSync"
android:exported="false" />
</application>
แม้จะมีความน่าเชื่อถือสูง Foreground Service ก็มีข้อจำกัด ข้อหลักคือการมองเห็นต่อผู้ใช้ แอปพลิเคชันไม่สามารถทำงานระยะยาวในพื้นหลังโดยไม่มีการแจ้งเตือน ซึ่งไม่สามารถยอมรับได้เสมอไปจากมุมมองของ UX นอกจากนี้ ระบบอาจบังคับหยุดแม้แต่ Foreground Service เมื่อเกินขีดจำกัดเวลาสำหรับบางประเภท — ตัวอย่างเช่น dataSync ถูกจำกัดไว้ที่หลายชั่วโมงของการทำงาน
ทางเลือกสำหรับ Foreground Service คือ WorkManager ซึ่งเป็นไลบรารี Android Jetpack สำหรับงานที่ถูกเลื่อนออกไปและงานพื้นหลัง WorkManager รับประกันการดำเนินงานแม้หลังจากรีบูตอุปกรณ์และรองรับเชนงาน การดำเนินการเป็นระยะ และข้อจำกัดเครือข่ายและแบตเตอรี่ สำหรับการดำเนินการพื้นหลังส่วนใหญ่ Google แนะนำ WorkManager แทนการใช้บริการโดยตรง
JobScheduler คือ API ในตัวของ Android สำหรับกำหนดเวลางาน เหมาะสำหรับการดำเนินการที่สามารถเลื่อนออกไปได้: การซิงค์ผ่าน Wi-Fi การดาวน์โหลดข้อมูลเมื่อเชื่อมต่อกับเครื่องชาร์จ JobScheduler จัดกลุ่มงานเป็นหน้าต่างเพื่อประหยัดแบตเตอรี่ แตกต่างจาก Foreground Service ที่ทำงานอย่างต่อเนื่องโดยไม่คำนึงถึงสถานะ การประหยัดพลังงาน
สำหรับงานสั้น (สูงสุด 10–15 วินาที) คุณสามารถใช้ CoroutineWorker จาก WorkManager โดยมีการดำเนินการที่ล่าช้า หากงานต้องดำเนินการอย่างเคร่งครัดในเวลาที่กำหนด ให้ใช้ AlarmManager ร่วมกับ BroadcastReceiver ดังนั้น Foreground Service จึงเป็นโซลูชันสำหรับการดำเนินการต่อเนื่องระยะยาว ไม่ใช่เครื่องมือสากลสำหรับทุกสถานการณ์พื้นหลัง
คำถามที่พบบ่อย
Foreground Service คือบริการ Android ที่มีการแจ้งเตือนถาวรในแถบสถานะซึ่งดำเนินงานระยะยาวที่ผู้ใช้มองเห็นได้ มีลำดับความสำคัญการอยู่รอดสูงและแตกต่างจาก Background Service ตรงที่ไม่ถูกหยุดโดยระบบเมื่อหน่วยความจำไม่เพียงพอ
Foreground Service แสดงการแจ้งเตือนบังคับ ไม่มีข้อจำกัดด้านเวลา และได้รับการปกป้องจากการยุติโดยระบบ Background Service ผู้ใช้มองไม่เห็น ทำงานสูงสุด 10 นาที (API 26+) และสามารถถูกหยุดโดย Low Memory Killer ได้ทุกเมื่อ
Android 14 กำหนด 9 ประเภท: dataSync, mediaPlayback, location, camera, connectedDevice, phoneCall, microphone, health และ remoteMessaging แต่ละประเภทต้องการสิทธิ์ที่สอดคล้องกันและการประกาศในแมนิเฟสต์ผ่านแอตทริบิวต์ foregroundServiceType
หากบริการไม่เรียก startForeground() ภายใน 10 วินาทีหลังจากสร้าง (Android 14) ระบบจะส่งข้อยกเว้น ForegroundServiceDidNotStartInTimeException และบังคับหยุดบริการ แอปพลิเคชันจะได้รับ ANR (Application Not Responding) ด้วยหากการดำเนินการทำงานบนเธรดหลัก
ไม่ การซ่อนการแจ้งเตือนของ Foreground Service ด้วยโปรแกรมเป็นไปไม่ได้ ตั้งแต่ Android 9 (API 28) เป็นต้นไป การแจ้งเตือนเป็นข้อบังคับและผู้ใช้ไม่สามารถปัดทิ้งได้ วิธีเดียวที่จะลบคือหยุดบริการโดยเรียก stopForeground(REMOVE_NOTIFICATION) และ stopSelf()
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ