Foreground Service: định nghĩa, các loại và cơ chế hoạt động

Tác giả: IT Sectr Đã đăng: 2026-03-28 Thời gian đọc: 11 phút

Foreground Service là một dịch vụ Android thực hiện các thao tác dài hạn hiển thị cho người dùng với thông báo bắt buộc trong thanh trạng thái. Không giống như Background Service, mà hệ thống có thể dừng khi thiếu tài nguyên, Foreground Service nhận được ưu tiên cao và tiếp tục hoạt động ngay cả trong điều kiện bộ nhớ hạn chế. Theo tài liệu Android Developers, 2025, Foreground Service vẫn là cách đáng tin cậy duy nhất để thực hiện các tác vụ dài hạn trên các thiết bị chạy Android 12 trở lên.

Các điểm chính

  • Foreground Service — dịch vụ có thông báo bắt buộc hiển thị cho người dùng trong thanh trạng thái
  • Notification — yếu tố bắt buộc, không có nó hệ thống sẽ không cho phép khởi động dịch vụ
  • Ưu tiên — Foreground Service không bị dừng khi thiếu bộ nhớ, khác với Background Service
  • Android 12+ — các hạn chế đã được áp dụng cho việc khởi động foreground service từ nền
  • Foreground Service Type — khai báo bắt buộc loại dịch vụ cho API mục tiêu 34+

Foreground Service là gì

Foreground Service là một thành phần Android được thiết kế để thực hiện các thao tác mà người dùng biết và có thể thấy. Nó hiển thị một thông báo thường trực trong bảng thông báo không thể vuốt đi — nó vẫn hoạt động miễn là dịch vụ đang chạy. Đây là sự khác biệt chính so với dịch vụ nền, hoạt động mà người dùng không nhận thấy.

Hệ thống Android coi Foreground Service là một tiến trình quan trọng. Khi RAM thấp, nền tảng sẽ kết thúc Background Services trước, sau đó là các Activity được lưu trong bộ nhớ đệm, và chỉ trong những trường hợp ngoại lệ — Foreground Service. OOM Killer gán cho dịch vụ đó cấp ADJ 2, điều này thực tế loại bỏ khả năng kết thúc cưỡng bức của nó.

Để khởi động Foreground Service, nhà phát triển phải gọi phương thức startForeground() trong vài giây sau khi tạo dịch vụ, nếu không hệ thống sẽ tạo ra ngoại lệ ForegroundServiceDidNotStartInTimeException. Đây là một yêu cầu nghiêm ngặt của nền tảng được đưa ra để ngăn chặn các tác vụ nền không được khai báo.

Lịch sử

Cơ chế Foreground Service được giới thiệu trong Android 1.0 với SDK đầu tiên, nhưng thông báo bắt buộc xuất hiện trong Android 9 (API 28). Trước đó, một dịch vụ có thể chạy ở tiền cảnh mà không có chỉ báo hiển thị cho người dùng. Bắt đầu từ Android 9, Google đã thắt chặt các yêu cầu: bất kỳ ứng dụng nào gọi startForeground phải cung cấp thông báo trong vòng 5 giây sau khi dịch vụ khởi động.

Trong Android 12 (API 31), các hạn chế đã được thêm vào đối với việc khởi động Foreground Service từ ngữ cảnh nền — bây giờ quyền FOREGROUND_SERVICE_SPECIAL_USE là bắt buộc cho nhiều tình huống. Android 14 (API 34) đã giới thiệu khai báo bắt buộc foregroundServiceType trong tệp kê khai, làm cho kiến trúc dịch vụ trở nên minh bạch và có thể dự đoán hơn.

Foreground Service hoạt động như thế nào

Cơ chế hoạt động của Foreground Service dựa trên ba giai đoạn chính: tạo dịch vụ, gắn thông báo và thực hiện tác vụ. Dịch vụ kế thừa từ lớp Service và ghi đèn phương thức onStartCommand(), trong đó startForeground() được gọi với một định danh và một đối tượng Notification.

Sau khi gọi startForeground(), hệ thống di chuyển tiến trình dịch vụ vào nhóm tiền cảnh với ưu tiên sống sót cao hơn. Điều này có nghĩa là Android sẽ cố gắng giữ tiến trình chạy bất kể tải RAM. Foreground Service không thể bị dừng bởi hệ thống trong điều kiện bình thường — chỉ khi người dùng vuốt bỏ thông báo hoặc gọi rõ ràng stopSelf().

Vòng đời của Foreground Service được quản lý thông qua các phương thức onCreate(), onStartCommand()onDestroy(). Trong onStartCommand(), nhà phát triển xác định chiến lược khởi động lại sau khi tiến trình bị kết thúc — hằng số START_STICKY buộc hệ thống tạo lại dịch vụ sau khi phục hồi tài nguyên, trong khi START_NOT_STICKY ngăn chặn việc khởi động lại tự động.

Vòng đời và trạng thái

Khi Foreground Service khởi động, các bước được thực hiện tuần tự: gọi startService(), tạo đối tượng Service trong onCreate(), xử lý Intent trong onStartCommand() và gọi startForeground() với đối tượng Notification. Nếu dịch vụ đã chạy và Intent mới đến, chỉ onStartCommand() được gọi lại — onCreate() chỉ được thực hiện một lần trong suốt vòng đời của dịch vụ.

Việc dừng Foreground Service xảy ra thông qua stopForeground() với cờ REMOVE_NOTIFICATION, ẩn thông báo khỏi thanh trạng thái. Ngay sau khi xóa thông báo, hệ thống có thể ngừng coi dịch vụ là tiền cảnh và giảm ưu tiên của nó xuống Background Service, làm cho tiến trình dễ bị kết thúc.

Tương tác với PowerManager

PowerManager đóng một vai trò quan trọng trong hoạt động của Foreground Service, vì các chế độ tiết kiệm pin của Android (Doze, App Standby) có thể hạn chế khả năng thực hiện các tác vụ của nó. Ngay cả khi ở trạng thái tiền cảnh, dịch vụ vẫn tuân theo các chính sách pin — các yêu cầu mạng có thể bị trì hoãn và bộ định thời đồng bộ với cửa sổ Doze. Đối với các thao tác dài hạn chịu được độ trễ, nên sử dụng Foreground Service kết hợp với WorkManager.

Các loại Foreground Service chính

Bắt đầu từ Android 14 (API 34), Google đã giới thiệu khai báo bắt buộc loại Foreground Service trong tệp kê khai. Mỗi loại xác định một tình huống sử dụng được phép — hệ thống kiểm tra sự tuân thủ giữa loại đã khai báo và hành vi thực tế của dịch vụ. Tổng cộng có 9 loại, nhưng các loại được sử dụng phổ biến nhất là những loại sau.

dataSync

Loại dataSync được thiết kế để đồng bộ dữ liệu giữa thiết bị và máy chủ, truyền tệp và sao lưu. Các ví dụ bao gồm tải ảnh lên bộ nhớ đám mây, đồng bộ cơ sở dữ liệu với Firebase hoặc tải nhật ký lên máy chủ từ xa. Loại này yêu cầu chỉ rõ lý do trong tệp kê khai thông qua thuộc tính android:foregroundServiceType="dataSync".

mediaPlayback

Loại mediaPlayback được sử dụng để phát âm thanh và video trong nền — trình phát nhạc, ứng dụng podcast, trình phát video. Đây là loại duy nhất có thể chạy vô thời hạn mà không cần sự can thiệp của người dùng. Kênh thông báo phải có ưu tiên cao và hiển thị các nút điều khiển phát lại — play, tạm dừng, tiếp theo, quay lại thông qua MediaStyle.

location

Loại location dành cho các dịch vụ định vị địa lý — ứng dụng dẫn đường, theo dõi hoạt động, hàng rào địa lý. Đối với Android 14+, cần khai báo quyền FOREGROUND_SERVICE_LOCATION và chỉ định loại trong tệp kê khai. Ứng dụng phải có quyền vị trí hoạt động tại thời điểm chạy, nếu không hệ thống sẽ từ chối khởi động dịch vụ.

LoạiQuyềnVí dụ sử dụng
dataSyncFOREGROUND_SERVICE_DATA_SYNCĐồng bộ tệp với đám mây
mediaPlaybackFOREGROUND_SERVICE_MEDIA_PLAYBACKTrình phát nhạc trong nền
locationFOREGROUND_SERVICE_LOCATIONGPS dẫn đường khi lái xe
cameraFOREGROUND_SERVICE_CAMERAỨng dụng giám sát video
connectedDeviceFOREGROUND_SERVICE_CONNECTED_DEVICELàm việc với thiết bị BLE

Foreground Service vs Background Service

Sự khác biệt chính giữa Foreground và Background Service là sự hiện diện của thông báo hiển thị và ưu tiên sống sót. Background Service có thể bị dừng bởi hệ thống bất cứ lúc nào khi thiếu bộ nhớ, trong khi Foreground Service tiếp tục chạy nhờ vào cấp adj của tiến trình được nâng cao trong cơ chế Low Memory Killer của Android.

Background Service không yêu cầu thông báo và có thể chạy mà người dùng không biết. Tuy nhiên, bắt đầu từ Android 8 (API 26), Google đã hạn chế đáng kể các dịch vụ nền: startService() từ ngữ cảnh nền không còn hoạt động và Context.startForegroundService() trở thành bắt buộc để khởi động bất kỳ dịch vụ nào có kế hoạch chuyển sang tiền cảnh. Hệ thống cũng đã giới thiệu Giới hạn thực thi nền — một bộ định thời (hiện là 10 phút) sau đó Background Service bị dừng cưỡng bức.

Foreground Service, ngược lại, không có giới hạn thời gian. Dịch vụ có thể chạy trong nhiều giờ hoặc nhiều ngày — cho đến khi người dùng dừng nó một cách rõ ràng hoặc khởi động lại thiết bị. Điều này làm cho Foreground Service trở thành lựa chọn tối ưu cho các ứng dụng cần làm việc nền liên tục: trình phát nhạc, trình theo dõi hoạt động, ứng dụng gọi VoIP.

Bảng so sánh

Tham sốForeground ServiceBackground Service
Thông báoBắt buộcKhông yêu cầu
Thời gian sốngKhông giới hạnLên đến 10 phút (API 26+)
Ưu tiên hệ thốngCao (ADJ 2)Thấp (ADJ 8+)
Khởi động API 26+startForegroundService()Bị cấm từ nền

Yêu cầu trong Android 12+

Bắt đầu từ Android 12 (API 31), Google đã áp dụng các hạn chế đáng kể đối với việc khởi động Foreground Service. Thay đổi chính là lệnh cấm gọi startForegroundService() từ ngữ cảnh nền đối với hầu hết các loại dịch vụ. Các ngoại lệ chỉ áp dụng khi người dùng đã đồng ý rõ ràng (ví dụ, thông qua quyền FOREGROUND_SERVICE_SPECIAL_USE) hoặc khi dịch vụ được khởi động để đáp lại ý định phát sóng BOOT_COMPLETED.

Tệp kê khai của ứng dụng nhắm mục tiêu API 34+ phải chứa một khối foregroundServiceType cho mỗi dịch vụ đã khai báo. Ví dụ, đối với dịch vụ đồng bộ dữ liệu, hãy chỉ định android:foregroundServiceType="dataSync". Nếu không chỉ định loại, hệ thống coi dịch vụ là không hợp lệ và ném ngoại lệ MissingForegroundServiceTypeException khi cố gắng khởi động. Google Play cũng kiểm tra sự tuân thủ loại và có thể từ chối xuất bản nếu không khớp.

Quyền cho Android 14+

Trong Android 14 (API 34), mỗi loại Foreground Service có một quyền tương ứng. Nhà phát triển phải khai báo chúng trong tệp kê khai và yêu cầu chúng tại thời điểm chạy trước khi khởi động dịch vụ. Đối với dataSync, cần FOREGROUND_SERVICE_DATA_SYNC; đối với mediaPlayback, cần FOREGROUND_SERVICE_MEDIA_PLAYBACK. Người dùng có thể thu hồi quyền trong cài đặt, điều này sẽ dừng dịch vụ đang hoạt động.

Google cũng đã giới thiệu cơ chế Foreground Service Notification Timeout trong Android 14: nếu dịch vụ không gọi startForeground() trong vòng 10 giây sau khi tạo, hệ thống sẽ tạo ra một ngoại lệ. Sự thắt chặt này nhằm mục đích chống lại các ứng dụng trì hoãn hoặc bỏ qua cuộc gọi thông báo, thực chất hoạt động như Background Service dưới vỏ bọc là foreground.

Các trường hợp sử dụng Foreground Service

Foreground Service được sử dụng trong nhiều tác vụ yêu cầu thực thi đảm bảo trong nền. Các tình huống phổ biến nhất bao gồm phát lại phương tiện, theo dõi vị trí địa lý, đồng bộ dữ liệu và làm việc với các thiết bị ngoại vi. Hãy xem xét từng trường hợp chi tiết.

Trình phát đa phương tiện và phát trực tuyến âm thanh

Một ví dụ kinh điển là trình phát nhạc tiếp tục phát sau khi thu nhỏ ứng dụng. Dịch vụ khởi động với thông báo MediaStyle, các nút điều khiển và sử dụng loại mediaPlayback. Người dùng xem thông tin bài hát trong thanh trạng thái và có thể điều khiển phát lại mà không cần mở ứng dụng.

Theo dõi GPS và dẫn đường

Ứng dụng dẫn đường sử dụng Foreground Service loại location để theo dõi tọa độ liên tục. Dịch vụ hiển thị thông báo với tốc độ hiện tại, thời gian di chuyển và nút dừng theo dõi. Nếu không có Foreground Service, hệ thống sẽ ngừng nhận tọa độ trong nền sau một vài phút, khiến việc dẫn đường không thể thực hiện được.

Cuộc gọi VoIP

Các ứng dụng gọi thoại và video — trình khách VoIP — sử dụng Foreground Service để duy trì kết nối hoạt động. Dịch vụ loại phoneCall (từ Android 14) đảm bảo rằng cuộc gọi sẽ không bị ngắt khi thu nhỏ ứng dụng. Thông báo hiển thị thời lượng cuộc gọi và các điều khiển micrô và loa.

  • Trình phát đa phương tiện — phát trực tuyến âm thanh, podcast, trình phát video có nền
  • Dẫn đường — theo dõi GPS, hàng rào địa lý, trình dẫn đường lái xe
  • Cuộc gọi VoIP — Skype, Zoom, Telegram — duy trì cuộc gọi hoạt động
  • Trình theo dõi thể dục — đếm bước, theo dõi nhịp tim, bài tập
  • Đồng bộ hóa — tải ảnh lên, sao lưu dữ liệu, cập nhật nội dung ngoại tuyến

Tạo Foreground Service trong Kotlin

Hãy xem việc tạo Foreground Service trong Kotlin để đồng bộ dữ liệu. Dịch vụ sẽ được khởi động từ Activity, hiển thị thông báo với tiến trình và kết thúc đúng cách sau khi hoàn thành. Ví dụ minh họa tất cả các yếu tố bắt buộc: khai báo trong tệp kê khai, kênh thông báo, gọi startForeground() và xử lý foregroundServiceType.

kotlin
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,
            "Đồng bộ hóa",
            NotificationManager.IMPORTANCE_LOW
        ).apply {
            description = "Kênh đồng bộ dữ liệu"
        }
        val manager = getSystemService(NotificationManager::class.java)
        manager.createNotificationChannel(channel)
    }

    private fun buildNotification(): Notification {
        return NotificationCompat.Builder(this, CHANNEL_ID)
            .setContentTitle("Đồng bộ hóa")
            .setContentText("Tải dữ liệu lên máy chủ")
            .setSmallIcon(R.drawable.ic_sync)
            .setOngoing(true)
            .build()
    }

    private fun performSync() {
        GlobalScope.launch(Dispatchers.IO) {
            // Mô phỏng đồng bộ
            delay(5000)
            stopForeground(Service.STOP_FOREGROUND_REMOVE)
            stopSelf()
        }
    }

    override fun onBind(intent: Intent): IBinder? = null
}

Khai báo dịch vụ trong tệp kê khai

Để dịch vụ hoạt động chính xác trên Android 12+, bạn phải khai báo Foreground Service trong AndroidManifest.xml với loại và các quyền cần thiết. Thuộc tính foregroundServiceType là bắt buộc đối với API mục tiêu 34+ và các quyền FOREGROUND_SERVICE_DATA_SYNCPOST_NOTIFICATIONS phải được yêu cầu tại thời điểm chạy.

xml
<!-- 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>

Hạn chế và giải pháp thay thế

Mặc dù có độ tin cậy cao, Foreground Service có những hạn chế. Hạn chế chính là khả năng hiển thị cho người dùng. Ứng dụng không thể thực hiện các tác vụ dài trong nền mà không có thông báo, điều này không phải lúc nào cũng chấp nhận được từ quan điểm UX. Ngoài ra, hệ thống có thể buộc dừng ngay cả Foreground Service khi vượt quá giới hạn thời gian cho một số loại — ví dụ, dataSync bị giới hạn ở vài giờ hoạt động.

Một giải pháp thay thế cho Foreground Service là WorkManager, một thư viện Android Jetpack cho các tác vụ nền bị trì hoãn. WorkManager đảm bảo thực hiện tác vụ ngay cả sau khi khởi động lại thiết bị và hỗ trợ chuỗi tác vụ, các thao tác định kỳ và các ràng buộc về mạng và pin. Đối với hầu hết các thao tác nền, Google khuyến nghị sử dụng WorkManager thay vì dịch vụ trực tiếp.

JobScheduler là một API Android được tích hợp sẵn để lên lịch các tác vụ. Nó phù hợp cho các thao tác có thể bị trì hoãn: đồng bộ qua Wi-Fi, tải dữ liệu khi kết nối bộ sạc. JobScheduler nhóm các tác vụ thành cửa sổ để tiết kiệm pin, không giống như Foreground Service chạy liên tục bất kể trạng thái tiết kiệm năng lượng.

Đối với các tác vụ ngắn (lên đến 10–15 giây), bạn có thể sử dụng CoroutineWorker từ WorkManager với thực thi bị trì hoãn. Nếu một tác vụ phải được thực hiện nghiêm ngặt vào một thời gian cụ thể, hãy sử dụng AlarmManager cùng với BroadcastReceiver. Do đó, Foreground Service là một giải pháp cho các thao tác liên tục dài hạn, không phải là công cụ phổ quát cho tất cả các tình huống nền.

  • WorkManager — cho các tác vụ bị trì hoãn và được đảm bảo với hỗ trợ khởi động lại
  • JobScheduler — để lên lịch các tác vụ cân nhắc trạng thái mạng và pin
  • AlarmManager — để thực hiện các tác vụ vào thời gian chính xác
  • CoroutineWorker — cho các thao tác nền ngắn với hỗ trợ coroutine

Câu hỏi thường gặp

Foreground Service trong Android là gì?

Foreground Service là một dịch vụ Android với thông báo thường trực trong thanh trạng thái thực hiện các tác vụ dài hạn hiển thị cho người dùng. Nó có ưu tiên sống sót cao và không bị hệ thống dừng khi thiếu bộ nhớ, khác với Background Service.

Foreground Service khác Background Service như thế nào?

Foreground Service hiển thị thông báo bắt buộc, không có giới hạn thời gian và được bảo vệ khỏi việc kết thúc bởi hệ thống. Background Service không hiển thị với người dùng, chạy tối đa 10 phút (API 26+) và có thể bị dừng bởi Low Memory Killer bất cứ lúc nào.

Có những loại Foreground Service nào trong Android 14?

Android 14 định nghĩa 9 loại: dataSync, mediaPlayback, location, camera, connectedDevice, phoneCall, microphone, healthremoteMessaging. Mỗi loại yêu cầu một quyền tương ứng và khai báo trong tệp kê khai thông qua thuộc tính foregroundServiceType.

Điều gì xảy ra nếu startForeground không được gọi đúng giờ?

Nếu dịch vụ không gọi startForeground() trong vòng 10 giây sau khi tạo (Android 14), hệ thống sẽ tạo ra ngoại lệ ForegroundServiceDidNotStartInTimeException và buộc dừng dịch vụ. Ứng dụng cũng sẽ nhận được ANR (Application Not Responding) nếu thao tác đang chạy trên luồng chính.

Có thể ẩn thông báo Foreground Service không?

Không, việc ẩn thông báo Foreground Service bằng lệnh là không thể. Bắt đầu từ Android 9 (API 28), thông báo là bắt buộc và không thể bị người dùng vuốt đi. Cách duy nhất để xóa nó là dừng dịch vụ bằng cách gọi stopForeground(REMOVE_NOTIFICATION)stopSelf().

Tổng kết

  • Foreground Service — dịch vụ Android có thông báo bắt buộc hiển thị trong thanh trạng thái
  • Ưu tiên — Foreground Service thực tế không bị hệ thống kết thúc (ADJ 2), trái ngược với Background Service (ADJ 8+)
  • Loại — Android 14 yêu cầu khai báo loại (dataSync, mediaPlayback, location, v.v.) và quyền tương ứng
  • Hạn chế — khởi động từ nền bị cấm trong Android 12+; FOREGROUND_SERVICE_SPECIAL_USE cần thiết cho một số tình huống
  • Giải pháp thay thế — WorkManager cho tác vụ bị trì hoãn, JobScheduler cho lập lịch, AlarmManager cho thời gian chính xác
  • — các yếu tố bắt buộc: NotificationChannel, startForeground(), foregroundServiceType trong tệp kê khai
  • Google Play — xuất bản ứng dụng yêu cầu sự tuân thủ giữa loại đã khai báo và việc sử dụng dịch vụ thực tế

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm