Background Service — ay isang Android component na idinisenyo para magsagawa ng mahabang operasyon sa background nang walang user interface. Hindi tulad ng Activity, ang Service ay patuloy na gumagana kahit na ang application ay na-minimize o ang user ay lumipat sa ibang application. Ayon sa Android Developers, 2026, may tatlong uri ng serbisyo: Started Service, Bound Service at Foreground Service, bawat isa ay may sariling lifecycle at saklaw ng aplikasyon.
Pangunahin
Background Service (o simpleng Service) — ay isa sa apat na pangunahing component ng Android application kasama ng Activity, BroadcastReceiver at ContentProvider. Hindi tulad ng Activity, ang Service ay walang visual na interface at idinisenyo para magsagawa ng mga operasyon na dapat magpatuloy hindi alintana kung ang application ay nasa foreground o hindi.
Ang Service ay gumagana sa pangunahing thread (main thread) ng application, kaya naman ang anumang blocking operation sa loob nito ay nangangailangan ng paglikha ng hiwalay na thread. Kung hindi ito gagawin, tatawag ang system ng ANR (Application Not Responding). Para sa mga simpleng background operation, nagbibigay ang Android ng IntentService na awtomatikong lumilikha ng worker thread. Sa mga modernong proyekto, inirerekomenda ang paggamit ng Kotlin-coroutine na may CoroutineScope sa loob ng Service para sa asynchronous na pagproseso nang hindi hinaharangan ang pangunahing thread.
Pangunahing layunin ng Service — pag-play ng musika, pag-download ng file, pagtatrabaho sa mga network request, pag-sync ng data at iba pang mga gawain na dapat magpatuloy pagkatapos umalis ng user sa application. Gayunpaman, sa paglabas ng Android 8, ang mga developer ay kailangang pumili nang may kamalayan sa pagitan ng mga uri ng serbisyo, na isinasaalang-alang ang mga paghihigpit ng background work.
Service ay may sariling lifecycle na naiiba sa Activity. Ito ay may kasamang apat na pangunahing pamamaraan: onCreate, onStartCommand, onBind at onDestroy. Ang pag-unawa sa cycle na ito ay kinakailangan para sa tamang pagpapatupad ng mga background task nang walang memory leaks.
Ang pamamaraang onCreate ay tinatawag kapag ginagawa ang serbisyo, isang beses sa panahon ng buhay nito. Dito sinisimulan ang mga resources: timer, koneksyon sa database, socket. Ang pamamaraang onStartCommand ay tinatawag tuwing tatawagin ang startService, na nagpapahintulot sa pagpapadala ng mga utos sa serbisyong tumatakbo na. Ang return value ay tumutukoy sa pag-uugali ng system sa pag-restart.
class DownloadService : Service() {
override fun onCreate() {
super.onCreate()
initializeDownloader()
}
override fun onStartCommand(
intent: Intent?,
flags: Int,
startId: Int
): Int {
downloadFile(intent?.getStringExtra("url"))
return START_STICKY
}
override fun onBind(intent: Intent): IBinder? = null
}
onBind ay tinatawag kapag nagbubuklod ng serbisyo sa pamamagitan ng bindService at nagbabalik ng IBinder object para sa pakikipag-ugnayan sa client. Ang pamamaraang ito ay ginagamit lamang para sa Bound Service. onDestroy — ang huling tawag bago ang pagwasak ng serbisyo. Dito pinalalaya ang lahat ng resources, pinipigilan ang mga thread at kinakansela ang mga gawain.
Android ay nag-aalok ng tatlong uri ng Service, bawat isa ay idinisenyo para sa sarili nitong senaryo. Ang pagpili ng maling uri ay maaaring humantong sa hindi matatag na paggana ng application o pagkaubos ng baterya.
Started Service ay pinapagana sa pamamagitan ng pagtawag ng startService at gumagana hanggang sa tawagin ang stopSelf o stopService. Ito ay angkop para sa mga gawain na dapat agad gawin: pagpapadala ng analytics, pagproseso ng imahe, pag-download ng isang file. Pagkatapos ng trabaho, ang serbisyo ay humihinto nang mag-isa.
Bound Service ay nagbibigay ng client-server interface, na nagpapahintulot sa Activity, Fragment o iba pang component na makipag-ugnayan sa serbisyo. Ang serbisyo ay nabubuhay hanggang mayroong kahit isang nakatali na client. Kapag ang lahat ng client ay nag-unbind, ang serbisyo ay nawawasak. Ang Bound Service ay maginhawa para sa mga gawaing nangangailangan ng two-way na komunikasyon: music player, nabigasyon.
Foreground Service — ay isang Started Service na may permanenteng notipikasyon sa status bar. Itinuturing ng system na aktibo ang naturang serbisyo at hindi ito pinapatay kahit na kulang ang memorya. Ang Foreground Service ay sapilitan para sa pag-play ng musika, pag-record ng audio, pagsubaybay sa lokasyon at iba pang gawaing mahalaga para sa user.
| Parameter | Started | Bound | Foreground |
|---|---|---|---|
| Pagpapatakbo | startService | bindService | startForeground |
| Buhay | hanggang stopSelf | habang may client | hanggang stopForeground |
| Notipikasyon | hindi | hindi | sapilitan |
| Pinapatay | oo | oo | hindi |
| Halimbawa | pag-download | player | musika |
Paglikha ng serbisyo ay nagsisimula sa pagdeklara ng klase na nagmamana mula sa Service at pagrehistro nito sa AndroidManifest.xml. Kung walang pagrehistro sa manifest, hindi magagawang simulan ng system ang serbisyo, at anumang pagtawag ng startService ay magdudulot ng exception.
// Pagrehistro sa AndroidManifest.xml
@SuppressLint("ForegroundServiceType")
class SyncService : Service() {
override fun onStartCommand(
intent: Intent?,
flags: Int,
startId: Int
): Int {
startForeground(
NOTIFICATION_ID,
createNotification()
)
performSync(intent)
return START_NOT_STICKY
}
}
Para simulan ang serbisyo mula sa Activity o Fragment, ginagamit ang Intent na may malinaw na pagbanggit ng klase ng serbisyo. Mula sa Android 8, para sa Foreground Service ay kinakailangan ang pahintulot na FOREGROUND_SERVICE sa manifest.
// Pagpapatakbo ng Started Service
val intent = Intent(this, SyncService::class.java)
intent.putExtra("action", "sync")
startService(intent)
// Pagpapatakbo ng Foreground Service (Android 8+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(intent)
} else {
startService(intent)
}
Mula sa Android 8 (API 26) nagpatupad ang Google ng mahigpit na paghihigpit sa background services. Ang pagpapatakbo ng Service sa background (kapag ang application ay wala sa foreground) ay pinapayagan lamang sa mga pambihirang kaso: kapag nakatanggap ng push notification, pagkatapos mag-boot ang device o sa pamamagitan ng JobScheduler.
Para sa mahabang gawain na hindi nangangailangan ng agarang pagpapatupad, inirerekomenda ang paggamit ng WorkManager o JobScheduler. Kung ang application ay talagang nangangailangan ng tumatakbong serbisyo, ang tanging paraan ay Foreground Service na may notipikasyon na nakikita ng user. Ang pagpapatakbo ng serbisyo sa background nang walang notipikasyon ay hindi papansinin ng system.
JobIntentService — ay isang espesyalisadong klase na lumitaw sa support library para sa trabaho sa Android 5+. Pinagsasama nito ang pag-uugali ng IntentService (awtomatikong worker thread, sequential processing) sa pag-iiskedyul sa pamamagitan ng JobScheduler. Sa Android 8+ ginagamit ng JobIntentService ang JobScheduler sa ilalim ng hood, at sa mas lumang bersyon ay ordinaryong Service. Ito ay nagpapahintulot ng pare-parehong paghawak ng background tasks nang walang karagdagang pagsusuri ng bersyon ng Android.
class UploadJobService : JobIntentService() {
companion object {
private const val JOB_ID = 1000
fun enqueueWork(context: Context, work: Intent) {
enqueueWork(
context,
UploadJobService::class.java,
JOB_ID,
work
)
}
}
override fun onHandleWork(intent: Intent) {
val fileUri = intent.getStringExtra("file_uri")
// Isinasagawa sa background thread
uploadFile(fileUri)
}
}
Isa sa mga madalas na problema sa pagtatrabaho sa Background Service ay ang memory leaks. Dahil ang Service ay maaaring mabuhay nang mas mahaba kaysa sa Activity, ang mga reference sa Activity sa loob ng Service (sa pamamagitan ng listener, callback o broadcast) ay humahantong sa kawalan ng kakayahan ng garbage collector para sa mga UI component. Inirerekomenda ang paggamit ng WeakReference, ViewModel o LiveData para sa komunikasyon ng Service sa UI. Sa onDestroy dapat kanselahin ang lahat ng subscription, ihinto ang mga thread at isara ang mga cursor.
Ang pagpili sa pagitan ng Background Service at WorkManager ay depende sa senaryo. Ang Service ay angkop para sa mga gawain na dapat agad at patuloy na gawin: pag-play ng musika, pag-record ng audio, pagsubaybay ng GPS. Ang WorkManager ay mas mahusay para sa mga ipinagpaliban at garantisadong gawain: pag-sync, pagpapadala ng analytics, pag-upload ng logs. Ang WorkManager ay makakaligtas sa pag-restart ng device, habang ang Service ay hindi. Ang Service ay maaaring Foreground na may notipikasyon, habang ang WorkManager ay tahimik na gumagana sa background. Sa praktika, pinagsasama ng mga developer ang parehong approach: Foreground Service para sa kritikal na gawain ng user at WorkManager para sa background maintenance.
Ipinakilala ng Android 12 ang bandila na android:foregroundServiceType na nangangailangan ng pagtukoy ng uri ng serbisyo: dataSync, camera, connectedDevice, location, mediaPlayback at iba pa. Ang maling pagtukoy ng uri ay humahantong sa exception sa pagsisimula. Ang praktikang ito ay ginagawang mas transparent ang Background Service para sa user at system.
Ang tamang pagrehistro ng Service sa manifest ay kinabibilangan ng mga attribute na exported (accessibility para sa external na application), foregroundServiceType (uri ng background service sa Android 12+) at permission. Para sa Bound Service kailangan din ideklara ang android:permission="android.permission.BIND_JOB_SERVICE" para sa JobIntentService. Kung walang pagrehistro sa manifest, anumang pagtawag ng startService o bindService ay magtatapos sa exception, kaya ang pagsusuri ng manifest ay unang hakbang sa pag-diagnose ng problema sa Service.
Mga madalas itanong
Service ay tumatakbo sa pangunahing thread (UI Thread) ng application. Anumang blocking operation sa loob ng onStartCommand o onHandleIntent ay dapat ilipat sa isang hiwalay na thread o coroutine, kung hindi ay tatawag ang system ng ANR pagkatapos ng 5 segundo.
IntentService — ay isang tagapagmana ng Service na awtomatikong gumagawa ng worker thread at nagpoproseso ng mga utos nang sunud-sunod. Pagkatapos ng huling gawain, ang IntentService ay humihinto nang mag-isa. Mula sa Android 8, ang IntentService ay itinuturing na hindi na ginagamit pabor sa JobIntentService o WorkManager.
Ang pagpapatakbo ng Started Service mula sa background sa Android 12 ay ipinagbabawal. Exception — Foreground Service na may idineklarang foregroundServiceType sa manifest at wastong notipikasyon. Pinapayagan din ang maikling pagsisimula pagkatapos makatanggap ng FCM message na may mataas na priyoridad.
May tatlong paraan: BroadcastReceiver na may lokal na broadcast, mekanismo ng Messenger sa pamamagitan ng Handler, at LiveData/Flow sa MVVM architecture na may shared ViewModel. Para sa Bound Service ginagamit ang IBinder na may direktang pagtawag ng mga pamamaraan.
Kung ang Service ay pinatakbo gamit ang bandilang START_STICKY, ire-restart ito ng system pagkatapos ng pagkasira ng proseso dahil sa kakulangan ng memorya. Ang bandilang START_NOT_STICKY ay nangangahulugang hindi ire-restart ng system ang serbisyo. Ang START_REDELIVER_INTENT ay katulad ng START_STICKY, ngunit nagpapadala ng huling Intent.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din