Background Service — ano ito, mga uri at paano gumagana sa Android

May-akda: IT Sectr Nai-publish: 2026-03-27 Oras ng pagbabasa: 8 min

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 — ay isang Android component para sa background operations na walang UI, gumagana nang hiwalay sa aktibidad.
  • Started Service ay pinapagana sa pamamagitan ng startService at gumagana hanggang sa malinaw na paghinto sa pamamagitan ng stopSelf.
  • Bound Service ay nagbubuklod sa component sa pamamagitan ng bindService at nabubuhay hanggang may mga konektadong client.
  • Foreground Service ay nagpapakita ng permanenteng notipikasyon at hindi pinapatay ng system kapag mababa ang baterya.
  • Mula sa bersyon Android 8 ang mga background service ay may mahigpit na paghihigpit sa pagtakbo sa background.

Ano ang Background Service sa Android?

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.

Paano gumagana ang lifecycle ng Service?

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.

onCreate at onStartCommand

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.

kotlin
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 at onDestroy

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.

Mga uri ng background service

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

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

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

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.

ParameterStartedBoundForeground
PagpapatakbostartServicebindServicestartForeground
Buhayhanggang stopSelfhabang may clienthanggang stopForeground
Notipikasyonhindihindisapilitan
Pinapatayoooohindi
Halimbawapag-downloadplayermusika

Paglikha at pagpapatakbo ng Service

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.

kotlin
// 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.

kotlin
// 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)
}

Mga paghihigpit sa Android 8+

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 para sa backward compatibility

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.

kotlin
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)
    }
}

Pamamahala ng memorya at leaks sa Service

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.

Service vs WorkManager: kailan pipiliin ang alin

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.

Halimbawa ng pagrehistro ng Service sa AndroidManifest

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

Sa anong thread tumatakbo ang Service bilang default?

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.

Ano ang pagkakaiba ng IntentService sa ordinaryong Service?

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.

Maaari bang magpatakbo ng Service kapag ang application ay nasa background sa Android 12?

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.

Paano magpadala ng data mula sa Service papunta sa Activity?

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.

Ano ang mangyayari kung ang application ay i-restart habang ang Service ay tumatakbo?

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

  • Background Service — ay isang Android component para sa background operations na walang interface, gumagana sa pangunahing thread.
  • Tatlong uri — Started, Bound at Foreground — sumasaklaw sa iba't ibang senaryo: mula sa isang beses na gawain hanggang sa patuloy na trabaho na may notipikasyon.
  • Lifecycle ay kinabibilangan ng onCreate, onStartCommand, onBind at onDestroy — mahalaga na maglabas ng resources sa onDestroy.
  • Foreground Service — ang tanging uri na matatag na gumagana sa Android 8+ nang walang panganib na patayin ng system.
  • WorkManager at JobScheduler ay mas mainam para sa mga ipinagpaliban at garantisadong background tasks.
  • Huwag gamitin ang Service para sa mga gawain na nangangailangan ng eksaktong oras ng pagpapatupad — para doon ay may AlarmManager.
  • Palaging irehistro ang Service sa AndroidManifest.xml at tukuyin ang android:foregroundServiceType sa Android 12+.

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.

Pag-usapan ang proyekto

Basahin din