Background Execution เป็นกลไกที่อนุญาตให้โค้ดของแอปพลิเคชันมือถือทำงานเมื่อแอปไม่ได้อยู่ในเบื้องหน้า หากไม่มีกลไกนี้ ระบบจะหยุดการทำงานของแอปเมื่อย่อขนาด ตามข้อมูลจาก Apple, 2026 iOS จำกัดเวลาเบื้องหลังไว้ที่ 30 วินาที ในขณะที่ Android มีสถานการณ์ที่ยืดหยุ่นกว่าผ่าน WorkManager และ Foreground Service
ประเด็นสำคัญ
Background Execution คือความสามารถของแอปในการเรียกใช้โค้ดต่อหลังจากที่ผู้ใช้ย่อขนาดหรือเปลี่ยนไปยังแอปอื่น หากไม่มีกลไกพิเศษ ระบบปฏิบัติการมือถือจะทำให้แอปเข้าสู่สถานะ Suspended (หยุดชั่วคราว) ภายในไม่กี่วินาทีหลังจากเข้าสู่เบื้องหลัง โดยปล่อย CPU และหน่วยความจำสำหรับแอปที่ทำงานอยู่
แอปมือถือผ่านหลายสถานะของวงจรชีวิต: Foreground (ทำงาน), Background (เบื้องหลัง), Suspended (หยุดชั่วคราว) และ Terminated (สิ้นสุด) Background เป็นสถานะเดียวที่แอปสามารถเรียกใช้โค้ดได้โดยไม่มีอินเทอร์เฟซที่มองเห็น iOS และ Android กำหนดระยะเวลาและการดำเนินการที่พร้อมใช้งานในสถานะนี้แตกต่างกัน
การทำงานเบื้องหลังจำเป็นสำหรับการซิงโครไนซ์ข้อมูล การดาวน์โหลดเนื้อหา การประมวลผลการแจ้งเตือน Push การระบุตำแหน่งทางภูมิศาสตร์เบื้องหลัง และการเล่นเสียง การซิงโครไนซ์ เป็นสถานการณ์ที่พบบ่อยที่สุด: แอปส่งข้อมูลไปยังเซิร์ฟเวอร์หรือดาวน์โหลดอัปเดตโดยไม่ต้องให้ผู้ใช้มีส่วนร่วม
ข้อจำกัด ของการทำงานเบื้องหลังเกิดจากสามปัจจัย: การใช้พลังงาน ประสิทธิภาพของอุปกรณ์ และความเป็นส่วนตัวของผู้ใช้ CPU และโมดูลวิทยุ (Wi-Fi, ข้อมูลมือถือ) ใช้พลังงานมากที่สุด — ทุกกระบวนการเบื้องหลังลดอายุการใช้งานแบตเตอรี่
การศึกษาของ Google แสดงให้เห็นว่าแอปที่ทำงานเบื้องหลังทุก 5 นาทีจะลดอายุการใช้งานแบตเตอรี่ของอุปกรณ์ลง 20–30% ต่อวัน แม้แต่การทำงานเบื้องหลังที่ปรับให้เหมาะสมด้วยความถี่ชั่วโมงละครั้งก็มีผลกระทบที่สังเกตได้หากมีแอปดังกล่าวมากกว่าสองแอป
แต่ละแอปเบื้องหลังใช้ RAM เมื่อ RAM ไม่เพียงพอ ระบบจะถ่ายแอปออกจากหน่วยความจำ ทำให้ต้องเริ่มต้นใหม่เมื่อผู้ใช้กลับมา iOS ใช้อัลกอริทึม Jetsam — กลไกการบังคับยุติกระบวนการเบื้องหลังเมื่อเกินขีดจำกัดหน่วยความจำ Android ใช้ LMK (Low Memory Killer) ด้วยหลักการที่คล้ายกัน
ตั้งแต่ Android 10 และ iOS 13 ระบบกำหนดให้แอปต้องประกาศวัตถุประสงค์ของการทำงานเบื้องหลัง Android ได้แนะนำข้อจำกัดในการเริ่ม Broadcast Receiver ในเบื้องหลัง iOS กำหนดให้ระบุ Background Mode ใน Capabilities ของโปรเจกต์ ผู้ใช้สามารถปิดการทำงานเบื้องหลังสำหรับแอปใดก็ได้ในการตั้งค่า
| ระบบปฏิบัติการ | เวอร์ชัน | ข้อจำกัด | ผลกระทบ |
|---|---|---|---|
| Android | 8.0 | IMPLICIT_BROADCAST ถูกห้าม | 67% ของ Broadcast เบื้องหลังเสีย |
| Android | 9.0 | Doze ดีขึ้น | การเรียกเครือข่ายถูกจำกัด |
| Android | 12+ | Foreground Service ถูกจำกัด | ห้ามเริ่มจากเบื้องหลัง |
| iOS | 7+ | Background App Refresh | หน้าต่างอัปเดตเป็นระยะ |
| iOS | 13+ | BGTaskScheduler | การจัดกำหนดการแทนการดำเนินการ |
Android มีหลายกลไกสำหรับการทำงานเบื้องหลัง แต่ละกลไกแก้ปัญหาในหมวดหมู่ที่แตกต่างกัน WorkManager เป็น API ที่แนะนำสำหรับงานที่เลื่อนออกไปและงานเป็นระยะ Foreground Service สำหรับการดำเนินการทันทีพร้อมการแจ้งเตือนที่มองเห็น JobScheduler เป็นทางเลือกระดับต่ำของ WorkManager
WorkManager เป็นส่วนหนึ่งของ Android Jetpack ที่ให้การทำงานเบื้องหลังพร้อมรับประกันความสำเร็จแม้หลังรีสตาร์ทอุปกรณ์ API เลือกเวลาดำเนินการที่เหมาะสมที่สุดโดยพิจารณาจากสถานะเครือข่าย ระดับแบตเตอรี่ และโหมด Doze WorkManager เข้ากันได้กับ API 14+ และแทนที่ AlarmManager และ JobScheduler ที่เลิกใช้
เมื่อแอปต้องการทำงานที่ผู้ใช้มองเห็น (เล่นเพลง, บันทึกตำแหน่งทางภูมิศาสตร์) จะใช้ Foreground Service บริการจะแสดงการแจ้งเตือนถาวรในแถบสถานะและมีลำดับความสำคัญสูงกว่า — ระบบจะไม่ยุติจนกว่างานจะเสร็จ ตั้งแต่ Android 13 ต้องได้รับอนุญาต POST_NOTIFICATIONS
ตั้งแต่ Android 6.0 อุปกรณ์จะเข้าสู่โหมด Doze เมื่อไม่ได้ใช้งาน ในโหมดนี้ การดำเนินการเครือข่าย การซิงโครไนซ์ และ JobScheduler จะถูกเลื่อนออกไป WorkManager จะปรับตัวเข้ากับ Doze โดยอัตโนมัติ — งานจะดำเนินการในช่วง Maintenance Window ถัดไปเมื่ออุปกรณ์ตื่นจากการนอนเพื่อการบำรุงรักษา
iOS ใช้แนวทางที่เข้มงวดมากขึ้นสำหรับการทำงานเบื้องหลัง Background App Refresh เป็นกลไกหลักสำหรับการอัปเดตข้อมูลเป็นระยะ BGTaskScheduler เป็น API สำหรับจัดกำหนดการงานตามสถานะของระบบ สำหรับการดำเนินการระยะยาว มี Background Modes: audio, location, voip, fetch และ processing
Background App Refresh อนุญาตให้แอปตื่นทุก 15–30 นาทีเพื่อซิงโครไนซ์ข้อมูล เวลาตื่นขึ้นอยู่กับพฤติกรรมของผู้ใช้ — ระบบวิเคราะห์ความถี่ที่ผู้ใช้เปิดแอป ผู้ใช้สามารถปิดคุณสมบัตินี้สำหรับแอปแต่ละรายการในการตั้งค่า — ทั่วไป — Background App Refresh
ตั้งแต่ iOS 13 BGTaskScheduler ได้แทนที่ performFetch และ beginBackgroundTask ที่เลิกใช้ แอปจะลงทะเบียนงานด้วยตัวระบุและช่วงเวลาขั้นต่ำ และระบบจะกำหนดเวลาดำเนินการที่เหมาะสมที่สุด งานแบ่งออกเป็นสองประเภท: BGProcessingTask (ระยะยาว, 10+ นาที) และ BGAppRefreshTask (สั้น, สูงสุด 30 วินาที)
iOS จัดสรร เวลาที่จำกัด สำหรับการทำงานเบื้องหลัง — สูงสุด 30 วินาทีสำหรับ BGAppRefreshTask และสูงสุด 10 นาทีสำหรับ BGProcessingTask เมื่อเกินขีดจำกัด ระบบจะบังคับยุติงาน นักพัฒนาต้องเรียกตัวจัดการหมดอายุ (expiration handler) เพื่อบันทึกผลลัพธ์ระหว่างกลาง
มาดูการใช้งานจริงของการทำงานเบื้องหลังบน Android โดยใช้ WorkManager ตัวอย่างการซิงโครไนซ์ข้อมูลทุก 8 ชั่วโมงโดยคำนึงถึงสถานะเครือข่าย WorkManager รับประกันการทำงานแม้หลังจากรีสตาร์ทอุปกรณ์
class SyncWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
return try {
syncDataToServer()
Log.d("Sync", "ข้อมูลถูกซิงโครไนซ์แล้ว")
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
}
// เรียกใช้งานเป็นระยะทุก 8 ชั่วโมง
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresCharging(false)
.build()
val syncRequest = PeriodicWorkRequestBuilder<SyncWorker>(
8, TimeUnit.HOURS
).setConstraints(constraints).build()
WorkManager.getInstance(context).enqueue(syncRequest)
สำหรับการดำเนินการระยะยาวที่ผู้ใช้มองเห็น ใช้ Foreground Service ตัวอย่างการดาวน์โหลดไฟล์พร้อมแสดงความคืบหน้าในการแจ้งเตือน บริการเรียก startForeground() พร้อมการแจ้งเตือนที่ไม่สามารถปัดออกได้ เมื่อดาวน์โหลดเสร็จ — stopForeground(STOP_FOREGROUND_REMOVE)
class DownloadService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, id: Int): Int {
startForeground(NOTIFICATION_ID, createNotification())
downloadFile()
stopForeground(STOP_FOREGROUND_REMOVE)
stopSelf()
return START_NOT_STICKY
}
private fun createNotification(): Notification {
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("ดาวน์โหลดไฟล์")
.setSmallIcon(android.R.drawable.ic_download)
.build()
}
}
บน iOS การทำงานเบื้องหลังถูกกำหนดค่าผ่าน BGTaskScheduler ตัวอย่างการลงทะเบียนและดำเนินการอัปเดตเนื้อหา แอปต้องลงทะเบียนตัวระบุงานใน Info.plist และเรียก submit เมื่องานควรถูกจัดกำหนดการ
import BackgroundTasks
func registerBackgroundTask() {
BGTaskScheduler.shared.register(
forTaskWithIdentifier: "com.app.refresh",
using: nil
) { task in
self.handleAppRefresh(task: task as! BGAppRefreshTask)
}
}
func scheduleAppRefresh() {
let request = BGAppRefreshTaskRequest(
identifier: "com.app.refresh"
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
try? BGTaskScheduler.shared.submit(request)
}
func handleAppRefresh(task: BGAppRefreshTask) {
scheduleAppRefresh()
task.expirationHandler = {
// บันทึกข้อมูลระหว่างกลาง
cacheCurrentState()
}
fetchLatestData {
task.setTaskCompleted(success: true)
}
}
สำหรับการดำเนินการระยะยาว (ล้างแคช, ประมวลผลข้อมูล) ใช้ BGProcessingTask ระบบให้เวลาสูงสุด 10 นาทีสำหรับการดำเนินการ จะทำงานเฉพาะเมื่ออุปกรณ์กำลังชาร์จและเชื่อมต่อ Wi-Fi ต้องใช้ตัวระบุแยกต่างหากใน Info.plist และการลงทะเบียนผ่าน register(forTaskWithIdentifier:)
func scheduleProcessing() {
let request = BGProcessingTaskRequest(
identifier: "com.app.cleanup"
)
request.requiresExternalPower = true
request.requiresNetworkConnectivity = true
request.earliestBeginDate = Date(timeIntervalSinceNow: 24 * 60 * 60)
try? BGTaskScheduler.shared.submit(request)
}
Android และ iOS แตกต่างกันโดยพื้นฐานในปรัชญาการทำงานเบื้องหลัง Android มีเครื่องมือที่ยืดหยุ่นพร้อมการควบคุมมากขึ้นแต่ต้องการให้นักพัฒนาเลือก API ที่ถูกต้อง iOS จำกัดความสามารถแต่รับประกันประสิทธิภาพที่เสถียรและอายุการใช้งานแบตเตอรี่สำหรับผู้ใช้
| เกณฑ์ | Android | iOS |
|---|---|---|
| API ที่แนะนำ | WorkManager | BGTaskScheduler |
| เวลาสูงสุดของงาน | ไม่จำกัด (Foreground Service) | 30 วินาที / 10 นาที (processing) |
| งานเป็นระยะ | ใช่ ผ่าน PeriodicWorkRequest | ใช่ ผ่าน BGAppRefreshTask |
| รับประกันการดำเนินการ | ใช่ แม้หลังรีสตาร์ท | ไม่ — ระบบตัดสินใจเมื่อไร |
| การเข้าถึงเครือข่ายเบื้องหลัง | จำกัดโดยโหมด Doze | ผ่าน URLSession พร้อม background config |
| การระบุตำแหน่งเบื้องหลัง | Foreground Service + สิทธิ์ | Background Mode location + NSLocation |
| เสียงเบื้องหลัง | Foreground Service พร้อมการแจ้งเตือนสื่อ | Background Mode audio + AVAudioSession |
WorkManager เหมาะสำหรับงานที่ต้องเสร็จสมบูรณ์โดยไม่ขึ้นกับสถานะของแอป: การซิงโครไนซ์ข้อมูล การส่ง analytics การประมวลผลคิว API รับประกัน การดำเนินการแม้หลังจากปิดอุปกรณ์ — งานจะถูกจัดกำหนดการใหม่หลังจากบูต
BGTaskScheduler เหมาะสำหรับงานที่ระบบสามารถดำเนินการได้ทุกเวลาที่สะดวก: ดาวน์โหลดเนื้อหาใหม่ อัปเดตวิดเจ็ต ล้างแคช ไม่เหมาะ สำหรับการดำเนินการเร่งด่วน — ระบบจะเลื่อนงานหากอุปกรณ์อยู่ในโหมด Doze หรือแบตเตอรี่ต่ำ
คำถามที่พบบ่อย
Background Execution เป็นแนวคิดทั่วไปที่อธิบายโค้ดใดๆ ที่ทำงานเบื้องหลัง Background Modes เป็นกลไกเฉพาะของ iOS ที่อนุญาตให้แอปดำเนินการบางประเภทเบื้องหลัง: เสียง, การระบุตำแหน่ง, VoIP, fetch Android ใช้แนวทางที่คล้ายกันผ่านประเภทของ Foreground Service
บน iOS นี่คือขีดจำกัดมาตรฐานสำหรับ BGAppRefreshTask ระบบจะบังคับยุติงานเมื่อถึงขีดจำกัด บน Android สถานการณ์ที่คล้ายกันเกิดขึ้นเมื่อแอปไม่ใช้ WorkManager หรือ Foreground Service — Service ทั่วไปจะถูกยุติโดยระบบหลังจากเข้าสู่เบื้องหลัง
บน Android ใช้ WorkManager — รับประกันการดำเนินการแม้หลังรีสตาร์ท บน iOS ไม่สามารถรับประกันการดำเนินการได้ — ระบบตัดสินใจเมื่อจะเรียกใช้แอป วิธีเดียวที่จะรับประกันการดำเนินการคือใช้ Background Modes (audio, location) พร้อมตัวบ่งชี้ที่มองเห็นสำหรับผู้ใช้
บน iOS เรียก UIApplication.shared.backgroundRefreshStatus — สถานะ .available, .denied หรือ .restricted บน Android ใช้ PowerManager.isIgnoringBatteryOptimizations() เพื่อตรวจสอบการยกเว้นการเพิ่มประสิทธิภาพแบตเตอรี่ สำหรับ WorkManager ไม่จำเป็นต้องตรวจสอบ — API จัดการข้อจำกัดของระบบเอง
การแจ้งเตือน Push เป็นกลไกหลักสำหรับการกระตุ้นการทำงานโดยไม่ต้องใช้โค้ดเบื้องหลัง บน iOS มี PushKit สำหรับ VoIP และ Silent Push สำหรับการอัปเดตข้อมูล บน Android — High Priority FCM และ Notification Trampoline WebSockets ผ่าน Foreground Service เป็นทางเลือกสำหรับแอปแบบเรียลไทม์
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม