WakeLock: ano ito, mga uri at pamamahala ng lock sa pagtulog

May-akda: IT Sectr Nai-publish: 2026-03-28 Oras ng pagbabasa: 9 min

Ang WakeLock ay isang mekanismo ng Android na pumipigil sa device na pumasok sa sleep mode, sa pamamagitan ng pagpapanatiling aktibo ng processor o screen. Ang mga gawain sa background tulad ng pag-download ng file, pag-play ng audio o pag-record ng data ay nangangailangan ng WakeLock para sa garantisadong pagpapatupad nang walang pagkaantala. Ayon sa specifikasyon ng Android Developers, 2025, ang maling paggamit ng WakeLock ay humahantong sa mabilis na pagkaubos ng baterya at maaaring maging dahilan ng pag-block ng app sa Google Play.

Mga Pangunahing Punto

  • WakeLock — lock sa pagtulog, pinapanatiling aktibo ang device
  • Mga Uri — PARTIAL_WAKE_LOCK, FULL_WAKE_LOCK, SCREEN_DIM_WAKE_LOCK at iba pa
  • Pahintulot — WAKE_LOCK kinakailangan sa manifest, ngunit hindi hinihingi sa runtime
  • Mga Panganib — ang hindi nailabas na WakeLock ay nakakaubos ng baterya at nakakasira ng karanasan ng user
  • Mga Alternatibo — WorkManager, Foreground Service, JobScheduler nagbabawas ng pangangailangan para sa WakeLock

Ano ang WakeLock

WakeLock ay isang sistemang lock na nagbabawal sa Android na ilipat ang device sa mode ng mababang konsumo ng kuryente. Karaniwang pinapatay ng Android pagkatapos ng ilang segundo ng kawalan ng aktibidad ng user ang screen at inililipat ang processor sa estado ng malalim na pagtulog (deep sleep), kung saan ang mga background thread ay ipinapahinto. Pinipigilan ng WakeLock ang paglipat na ito sa pamamagitan ng pagpapanatiling aktibo ng CPU.

Ang mekanismo ng WakeLock ay pinamamahalaan sa pamamagitan ng sistemang serbisyo na PowerManager, na naa-access sa pamamagitan ng method na getSystemService(Context.POWER_SERVICE). Gumagawa ang developer ng WakeLock object na nagsasaad ng uri ng lock at dapat itong garantisadong ilabas pagkatapos ng gawain, kung hindi ay mabilis na mauubos ang baterya ng device. Hindi awtomatikong pinapalabas ng system ang WakeLock — ito ay responsibilidad ng app.

Sa bawat pangunahing bersyon ng Android, pinapahigpit ng Google ang kontrol sa WakeLock. Simula sa Android 9 (API 28), ang isang app sa background ay hindi makakakuha ng WakeLock nang walang wastong dahilan, at sinusubaybayan ng system ang mga app na nag-aabuso ng mga lock at maaaring pilitin ang mga ito na ilabas. Sa Android 12+ ay ipinakilala ang mga karagdagang limitasyon sa pag-access sa PowerManager para sa mga background na app.

Kailan kinakailangan ang WakeLock

WakeLock ay kinakailangan sa mga senaryo kung saan ang gawain ay hindi maaaring maputol ng paglipat ng device sa pagtulog: pag-download ng malaking file sa hindi matatag na koneksyon, pag-record ng video, pagsasagawa ng mahabang kalkulasyon nang walang partisipasyon ng user. Kung walang lock sa pagtulog, ang processor ay pumapasok sa malalim na pagtulog, lahat ng thread ay nagyeyelo, at ang gawain ay nananatiling hindi natapos.

Gayunpaman, mahigpit na inirerekomenda ng Google na mabawasan ang paggamit ng WakeLock. Sa karamihan ng mga kaso, ang parehong gawain ay maaaring malutas gamit ang Foreground Service na may notifikasyon, WorkManager o JobScheduler. Ang mga mekanismong ito ay isinasaalang-alang ang estado ng baterya at network, na nagpapahaba ng oras ng pagpapatakbo ng baterya ng device.

Paano gumagana ang WakeLock

WakeLock ay gumagana sa pamamagitan ng sistemang serbisyo na PowerManager na namamahala sa estado ng kuryente ng device. Kapag ang app ay humihingi ng lock sa pamamagitan ng powerManager.newWakeLock(), itinataas ng system ang antas ng aktibidad ng CPU, na pumipigil sa paglipat sa malalim na pagtulog. Pagkatapos tawagan ang wakeLock.release(), bumalik ang system sa normal na mode ng pagtitipid ng kuryente.

Mahalagang maunawaan na hindi pinipigilan ng WakeLock ang lahat ng mode ng pagtitipid ng kuryente. Doze Mode (sleep mode ng Android 6+) ay maaaring balewalain ang WakeLock sa ilang mga phase — ang app na may hawak na WakeLock ay hindi makakakuha ng access sa network sa mga window ng serbisyo ng Doze. Ito ay nangangahulugan na kahit ang aktibong WakeLock ay hindi ginagarantiya ang pagpapatupad ng mga operasyon sa network sa ikalawang phase ng Doze.

Ang bawat WakeLock ay nakaugnay sa PowerManager.WakeLock sa panig ng framework. Ang system ay nagpapanatili ng bilang ng mga aktibong lock sa antas ng proseso: kung ang isang proseso ay may hawak na maraming WakeLock, sila ay pinagsama-sama at ang pagpapalabas ay nangyayari lamang pagkatapos tawagan ang release() para sa bawat lock. Ang Android ay sumusuporta rin sa wake lock timeouts — awtomatikong pagpapalabas pagkatapos ng itinakdang interval. Gayunpaman, ang pag-asa sa timeout ay hindi inirerekomenda: ang gawain ay maaaring matapos nang mas maaga at ang dagdag na oras ng paghawak ay magbabawas ng buhay ng baterya.

WakeLock at mga system event

Kapag ang device ay lumipat sa sleep mode (power button), pilit na pinapalabas ng Android ang lahat ng SCREEN_DIM_WAKE_LOCK at SCREEN_BRIGHT_WAKE_LOCK, ngunit pinapanatili ang PARTIAL_WAKE_LOCK. Ito ay nangangahulugan na ang screen lock ay hindi mapipigilan ang device na patayin ang display — tanging ang PARTIAL_WAKE_LOCK ang maaaring magpatuloy sa paggana pagkatapos pindutin ang power button.

Mga uri ng WakeLock sa Android

Sa Android mayroong ilang uri ng WakeLock, bawat isa ay namamahala ng mga tiyak na komponent ng device. Ang pagpili ng uri ay nagtatakda kung aling mga hardware component ang nananatiling aktibo pagkatapos ng lock. Ang maling pagpili ng uri ay humahantong sa labis na konsumo ng kuryente dahil sa pag-activate ng mga hindi kinakailangang module.

UriCPUScreenKeyboardKailan gagamitin
PARTIAL_WAKE_LOCKBukasSaraSaraPag-download ng file, kalkulasyon
SCREEN_DIM_WAKE_LOCKBukasMadilimSaraVideo player, presentasyon
SCREEN_BRIGHT_WAKE_LOCKBukasMaliwanagSaraMga laro (luma na)
FULL_WAKE_LOCKBukasMaliwanagMaliwanagLuma na (deprecated)

PARTIAL_WAKE_LOCK — pangunahing uri

PARTIAL_WAKE_LOCK ay ang pinaka-ginagamit at inirerekomendang uri. Pinapanatili nito ang CPU na aktibo, ngunit pinapayagan ang screen at ilaw ng keyboard na patayin. Ito ay ang pinakamainam na pagpili para sa mga background na gawain: pag-download ng data, pag-process ng imahe, sinkronisasyon. Ang screen ay papatayin pagkatapos ng system timeout, na nakakatipid ng baterya habang gumagawa ng hindi nakikitang trabaho para sa user.

Luma nang mga uri (deprecated)

SCREEN_DIM_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK at FULL_WAKE_LOCK ay minarkahan bilang luma na simula sa Android 7 (API 24). Pinapanatili nilang bukas ang screen, na humahantong sa malaking konsumo ng baterya. Inirerekomenda ng Google na gamitin sa halip ang FLAG_KEEP_SCREEN_ON sa pamamagitan ng Activity.getWindow().addFlags() — ang flag na ito ay gumagana lamang sa aktibong Activity at hindi nangangailangan ng pahintulot na WAKE_LOCK, at awtomatikong pinamamahalaan ng system ang oras ng paghawak ng screen.

WakeLock at konsumo ng kuryente

WakeLock ay isa sa mga pangunahing „manginginom" ng baterya sa Android. Bawat segundo ng paghawak ng lock sa pagtulog ay kumukonsumo ng dagdag na enerhiya dahil ang processor ay hindi maaaring lumipat sa energy-efficient na C-state. Ang pananaliksik ng Google Power Dashboard ay nagpapakita na ang mga app na may hindi wastong nailabas na WakeLock ay maaaring magpataas ng konsumo ng kuryente ng device ng 30–50% sa standby mode.

Sinusubaybayan ng system ang mga app na nag-aabuso ng WakeLock sa pamamagitan ng komponent na Battery Historian. Maaaring suriin ng developer ang profile ng konsumo ng kuryente at matukoy ang „leak" ng lock — mga sitwasyon kung saan ang WakeLock ay ginawa ngunit hindi nailabas. Ang Google Play Console ay nagpapakita ng estadistika ng WakeLock para sa mga nai-publish na app, at ang mahabang oras ng paghawak ay maaaring maging sanhi ng masasamang review.

Doze Mode at App Standby ay higit na naglilimita sa paggana ng WakeLock. Sa unang phase ng Doze (Light Doze), pinapayagan ng system ang WakeLock sa maikling service window. Sa ikalawang phase (Deep Doze), ang WakeLock ay pinagsama sa iba pang lock at pinapatupad sa isang karaniwang window. Kung ang app ay may hawak na WakeLock nang higit sa 10 minuto nang walang interaksyon ng user, maaaring pilit itong ilabas ng system at ilagay ang app sa itim na listahan ng optimisasyon ng baterya.

  • Battery Historian — kasangkapan para sa pagsusuri ng konsumo ng kuryente at leak ng WakeLock
  • Doze Mode — naglilimita sa WakeLock sa service window, pinagsasama ang mga lock
  • Google Play Console — nagpapakita ng estadistika ng WakeLock para sa nai-publish na app
  • Itim na listahan — ang app ay maaaring markahan ng system bilang nakakaubos ng kuryente

Mga pinakamahusay na kasanayan sa paggamit

Ang wastong paggamit ng WakeLock ay balanse sa pagitan ng pangangailangang tapusin ang gawain at pag-aalaga sa baterya ng device. Inirerekomenda ng Google na sundin ang ilang prinsipyo: palaging ilabas ang WakeLock sa finally o sa pamamagitan ng acquire(timeout), gamitin ang pinakamababang kinakailangang uri ng lock at iwasan ang matagal na paghawak nang walang matinding pangangailangan.

Panuntunan ng pagpapalabas

WakeLock ay dapat ilabas sa parehong block ng code kung saan ito ginawa. Para sa garantisadong pagpapalabas sa mga exception, ginagamit ang konstruksiyon na try-finally o use block ng Kotlin. Sa Android 10+, ang system ay nagpapakita ng babala sa logcat kung ang WakeLock ay hawak nang higit sa 60 segundo: "WakeLock held for more than 60 seconds" — ito ay senyales ng posibleng leak.

Timeout sa pagkuha

Ang method na acquire(long timeout) ay awtomatikong nagpapalabas ng WakeLock pagkatapos ng itinakdang oras sa millisecond. Ito ay pananggalang kung sakaling ang code ng pagpapalabas ay hindi ma-execute dahil sa exception o bug. Inirerekomenda na palaging magtakda ng timeout na katumbas ng maximum na inaasahang oras ng pagpapatupad ng gawain dagdag 10–20% reserba.

Pagsusuri kung may lock

Bago tawagan ang release(), dapat suriin kung ang WakeLock ay kasalukuyang hawak. Ang paulit-ulit na pagtawag ng release() nang walang naunang acquire() ay nagdudulot ng RuntimeException: WakeLock under-locked. Inirerekomenda na mag-imbak ng flag ng estado (isHeld) at bago magpalabas suriin ang wakeLock.isHeld().

Paggamit ng WakeLock sa Kotlin

Tingnan natin ang wastong paggawa at pagpapalabas ng WakeLock sa Kotlin. Ang halimbawa ay nagpapakita ng asynchronous na pag-download ng data na may paghawak ng PARTIAL_WAKE_LOCK, garantisadong pagpapalabas sa try-finally block at pagtakda ng timeout para sa proteksyon laban sa leak. Ang serbisyo ay gumagamit ng CoroutineScope na may IO dispatcher para sa pagpapatupad ng background na gawain.

kotlin
class DownloadService : Service() {

    private lateinit var wakeLock: PowerManager.WakeLock
    private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())

    override fun onCreate() {
        super.onCreate()
        val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
        wakeLock = powerManager.newWakeLock(
            PowerManager.PARTIAL_WAKE_LOCK,
            "download:wakelock"
        )
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        wakeLock.acquire(60000)
        scope.launch {
            try {
                downloadFile()
            } finally {
                if (wakeLock.isHeld()) {
                    wakeLock.release()
                }
            }
        }
        return START_NOT_STICKY
    }

    private suspend fun downloadFile() {
        // Simulasyon ng pag-download ng file
        delay(30000)
    }

    override fun onDestroy() {
        super.onDestroy()
        scope.cancel()
        if (wakeLock.isHeld()) {
            wakeLock.release()
        }
    }

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

Deklarasyon ng pahintulot sa manifest

Para sa paggamit ng WakeLock, kailangan magdagdag ng pahintulot sa AndroidManifest.xml. Ang pahintulot na WAKE_LOCK ay normal (normal) — hindi ito nangangailangan ng runtime request mula sa user at awtomatikong ibinibigay sa pag-install ng app. Gayunpaman, ang Google Play ay maaaring tumanggi sa publikasyon kung ang app ay walang malinaw na senaryo ng paggamit ng WakeLock.

xml
<uses-permission
    android:name="android.permission.WAKE_LOCK" />

<uses-permission
    android:name="android.permission.DEVICE_POWER" />

Mga alternatibo sa WakeLock

WakeLock ay isang mababang antas na mekanismo at inirerekomenda ng Google na palitan ito ng mas modernong API kung posible. Ang pangunahing alternatibo ay Foreground Service na may notifikasyon, na awtomatikong humahawak ng CPU lock habang tumatakbo ang serbisyo. Ang system mismo ang namamahala ng WakeLock para sa Foreground Service, pinalalaya ang developer mula sa pangangailangan ng explicit na pagkuha at pagpapalabas.

WorkManager ay ang pangalawang pinakamahalagang kasangkapan para sa background na gawain. Ginagarantiya nito ang pagpapatupad ng trabaho kahit na ang device ay pumasok sa Doze at pagkatapos ng restart. Ang WorkManager ay sumusuporta sa paghawak ng lock (hold lock) sa loob nito — hindi kailangan ng developer na explicit na magtrabaho sa PowerManager. Ang gawain ay pinapatupad sa service window ng Doze na may awtomatikong pamamahala ng lock sa pagtulog.

Para sa regular na gawain na nangangailangan ng tiyak na oras, ginagamit ang AlarmManager na may setAndAllowWhileIdle(), na maaaring gumising ng device mula sa Doze. Gayunpaman, ang AlarmManager ay angkop lamang para sa maikling operasyon — hindi ito dinisenyo para sa matagal na paghawak ng WakeLock. Kung ang gawain ay tumatagal nang higit sa 10 segundo, dapat pagsamahin ang AlarmManager sa BroadcastReceiver na nagpapatakbo ng Foreground Service.

  • Foreground Service — awtomatikong pamamahala ng WakeLock na may notifikasyon
  • WorkManager — garantisadong pagpapatupad na isinasaalang-alang ang Doze at restart
  • JobScheduler — pag-iiskedyul na isinasaalang-alang ang network, pag-charge at idle
  • AlarmManager — paggising ng device para sa maikling gawain ayon sa iskedyul

Mga Madalas Itanong

Ano ang WakeLock sa Android?

WakeLock ay isang sistemang lock na pumipigil sa Android device na pumasok sa sleep mode. Pinapanatili nito ang processor o screen na aktibo, pinapayagan ang background na gawain (pag-download, kalkulasyon) na tumakbo nang walang pagkaantala. Pinamamahalaan sa pamamagitan ng sistemang serbisyo na PowerManager.

Anong mga uri ng WakeLock ang mayroon?

Mga pangunahing uri: PARTIAL_WAKE_LOCK (CPU aktibo, screen patay) — inirerekomenda; SCREEN_DIM_WAKE_LOCK (CPU + madilim na screen); SCREEN_BRIGHT_WAKE_LOCK (CPU + maliwanag na screen). Ang SCREEN_DIM, SCREEN_BRIGHT at FULL_WAKE_LOCK ay minarkahan bilang luma at pinalitan ng FLAG_KEEP_SCREEN_ON.

Kailangan ba ng pahintulot para sa WakeLock?

Oo, sa manifest dapat ideklara ang android.permission.WAKE_LOCK. Ito ay normal na pahintulot (normal permission) na awtomatikong ibinibigay sa pag-install — hindi kailangan humingi nito sa runtime. Kung wala ang pahintulot na ito, ang pagtawag ng newWakeLock() ay magbabalik ng null o magtatapon ng SecurityException.

Ano ang mangyayari kung hindi ilalabas ang WakeLock?

Kung hindi tatawagin ang release(), ang device ay hindi makakapasok sa sleep mode. Ang baterya ay mauubos nang mas mabilis (hanggang 50% dagdag na konsumo). Itatala ng system ang leak sa logcat, at ang Battery Historian ay magpapakita ng abnormal na oras ng paghawak ng WakeLock, na hahantong sa masasamang review ng user.

Ano ang pampalit sa WakeLock sa modernong app?

Para sa mahabang gawain, gamitin ang Foreground Service na may notifikasyon — ang system mismo ang namamahala ng WakeLock. Para sa naantalang at garantisadong gawain, gamitin ang WorkManager, na sumusuporta sa WakeLock sa loob nito. Para sa maikling naka-iskedyul na gawain — AlarmManager.

Buod

  • WakeLock — lock sa pagtulog, pinapanatiling aktibo ang CPU o screen ng Android device
  • PARTIAL_WAKE_LOCK — pangunahing uri para sa background na gawain; screen patay, CPU nananatiling aktibo
  • Pahintulot — WAKE_LOCK sa manifest (normal permission, hindi kailangan ang runtime)
  • Leak — hindi nailabas na WakeLock ay nakakaubos ng baterya ng 30–50%; ilabas sa finally o sa pamamagitan ng timeout
  • Luma na — SCREEN_DIM, SCREEN_BRIGHT at FULL_WAKE_LOCK pinalitan ng FLAG_KEEP_SCREEN_ON
  • Foreground Service — alternatibo na may awtomatikong pamamahala ng WakeLock at notifikasyon
  • WorkManager — pinakamahusay na pagpili para sa naantalang background na gawain na may garantisadong pagpapatupad

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