onResume — ay isang pamamaraan ng Android lifecycle na tinatawag kapag ang Activity o Fragment ay lumabas sa foreground at nakatanggap ng input focus. Sa ganitong estado, ang screen ay handa na para sa pakikipag-ugnayan sa gumagamit: lahat ng touch event, pagpindot ng key, at kilos ay idinidirekta sa component na ito. Ang onResume ay ang working state ng Activity kung saan ginugugol ng application ang karamihan ng oras. Dito binubuksan ang camera, sinisimulan ang pag-playback ng video, sinisimulan ang pagkilala sa pagsasalita at nagrerehistro ng mga sensor listener na nangangailangan ng eksklusibong access. Magbasa pa tungkol sa kumpletong lifecycle ng Activity sa artikulong Activity Lifecycle.
Mga Pangunahing Punto
onResume — ikatlong pamamaraan ng lifecycle ng Activity, tinatawag pagkatapos ng onStart, na nagpapahiwatig ng kahandaan ng screen para sa buong interaksyon sa gumagamit. Sa sandaling ito ang Activity ay nasa tuktok ng stack ng mga gawain (back stack), idinidirekta ng system ang lahat ng input event dito, at ang application ay maaaring magsimula ng anumang operasyon na nangangailangan ng aktibong partisipasyon ng gumagamit: mga video call, laro, pag-record ng audio, pagguhit sa Canvas.
Ang onResume ay bahagi ng foreground lifetime — ang panahon sa pagitan ng onResume at onPause. Ito ang pinaka-aktibong panahon ng trabaho ng Activity, kung saan ang application ay kumokonsumo ng maximum na resources: ang processor para sa pagproseso ng mga pagpindot, GPU para sa pag-render ng mga animation, camera at mikropono para sa video capture. Ang pag-unawa sa antas na ito ng lifecycle ay kritikal para sa pag-optimize ng konsumo ng enerhiya — ang mga resources na binuksan sa onResume ay dapat na agad na isara sa onPause.
Ayon sa datos ng Google I/O 2025, ang average na oras na ginugugol ng Activity sa onResume state bawat session ay 2–5 minuto para sa mga balita app at 15–30 minuto para sa mga laro at messenger. Ang natitirang oras ang Activity ay nasa onPause, onStop, o onDestroy states. Ibig sabihin, ang pag-optimize ng onResume code ay nagbibigay ng pinakamalaking pakinabang sa performance at buhay ng baterya.
Sa Activity, ang onResume method ay tinatawag tuwing ang screen ay nakatatanggap ng input focus — sa unang paglunsad, sa pagbabalik mula sa ibang Activity, sa pagsasara ng dialog window, sa pag-unlock ng device. Ito ay isang mainit na pamamaraan na maaaring tawagin nang maraming beses sa isang session, at ang implementasyon nito ay dapat na gaan hangga't maaari.
class CameraActivity : AppCompatActivity() {
private var cameraProvider: ProcessCameraProvider? = null
private var preview: Preview? = null
override fun onResume() {
super.onResume()
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
cameraProvider = cameraProviderFuture.get()
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
preview = Preview.Builder().build().also {
it.setSurfaceProvider(binding?.viewFinder?.surfaceProvider)
}
try {
cameraProvider?.unbindAll()
cameraProvider?.bindToLifecycle(
this, cameraSelector, preview
)
} catch (e: Exception) {
Log.e("Camera", "Nabigo na i-bind ang camera", e)
}
}, ContextCompact.getMainExecutor(this))
}
override fun onPause() {
super.onPause()
cameraProvider?.unbindAll()
preview = null
}
}
Ang halimbawa gamit ang CameraX ay nagpapakita ng klasikong paggamit ng onResume/onPause: ang camera ay isang eksklusibong resource na maaari lamang gamitin ng isang application sa isang pagkakataon. Ang pagtali ng camera sa lifecycle sa pamamagitan ng bindToLifecycle ay awtomatikong nagsasara ng camera sa onPause, ngunit ang tahasang tawag na unbindAll ay ginagarantiyahan ang agarang pagpapalaya. Ito ay lalong mahalaga sa paglipat sa pagitan ng mga Activity: ang camera ay dapat palayain bago subukan ng ibang Activity na buksan ito.
Ang onResume sa Fragment ay tinatawag pagkatapos na ang Activity na naglalaman nito ay nakatanggap ng onResume. Gayunpaman, dahil sa mga katangian ng FragmentManager at ViewPager, ang sandali ng pagtawag ng onResume para sa Fragment ay maaaring maantala kumpara sa Activity. Halimbawa, ang Fragment sa ViewPager na may offscreenPageLimit = 1 ay tumatanggap ng onResume lamang kapag ito ay naging kasalukuyang pahina, hindi sa pagsisimula ng Activity.
class VideoPlayerFragment : Fragment() {
private var exoPlayer: ExoPlayer? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
exoPlayer = ExoPlayer.Builder(requireContext()).build()
binding?.playerView?.player = exoPlayer
}
override fun onResume() {
super.onResume()
exoPlayer?.play()
if (userVisibleHint) {
startBiometricAuth()
}
}
override fun onPause() {
exoPlayer?.pause()
stopBiometricAuth()
super.onPause()
}
}
Ang pagsusuri ng userVisibleHint sa Fragment.onResume ay mahalaga para sa ViewPager: ang Fragment ay maaaring makatanggap ng onResume ngunit nakatago ng katabing pahina (halimbawa, sa animated na transition). Sa ganitong mga kaso, ang pagsisimula ng video o biometry sa onResume nang walang pagsusuri ng visibility ay magdudulot ng hindi inaasahang pag-uugali. Simula sa Fragment 1.5.0, inirerekomenda ang paggamit ng FragmentTransaction.setMaxLifecycle() para sa tumpak na kontrol ng lifecycle ng mga fragment sa ViewPager2.
Ang mga developer ay madalas na nalilito sa onStart at onResume, inilalagay ang code sa maling pamamaraan. Pangunahing patakaran: onStart — para sa mga resources na gumagana sa visibility; onResume — para sa mga resources na nangangailangan ng input focus. Tingnan natin ang mga partikular na sitwasyon at ang tamang pagpili ng pamamaraan.
| Operasyon | Pamamaraan | Dahilan |
|---|---|---|
| Subscription sa geolokasyon | onStart / onStop | GPS ay maaaring gumana sa bahagyang visibility |
| Pagbukas ng camera | onResume / onPause | Camera — eksklusibong resource |
| BroadcastReceiver | onStart / onStop | Ang system event ay hindi nangangailangan ng focus |
| Pag-playback ng video | onResume / onPause | Ang video ay dapat makita ng gumagamit |
| Bluetooth scanning | onStart / onStop | Ang scanning ay maaaring magpatuloy sa background |
| Dictaphone (MediaRecorder) | onResume / onPause | Ang pag-record ay nangangailangan ng aktibong UI |
| Mga sensor listener | onResume / onPause | Mga sensor para sa mga laro at kilos |
| Pag-update ng datos | onStart | Sariwang datos kailangan kapag lumitaw |
Praktikal na patakaran: kung ang operasyon ay dapat maputol kapag lumitaw ang dialog window — gamitin ang onResume/onPause. Kung ang operasyon ay maaaring magpatuloy sa bahagyang pagtakip ng screen — gamitin ang onStart/onStop. Halimbawa, ang video player ay dapat mag-pause ng video kapag binuksan ang dialog (onPause), habang ang geolokasyon ay maaaring magpatuloy sa pag-update (nananatili sa onStart).
Ang eksklusibong resources ay mga component ng device na maaari lamang gamitin ng isang application sa isang partikular na oras. Camera, mikropono, video output (MediaProjection), NFC adapter sa read mode, USB device sa accessory mode — lahat ng resources na ito ay dapat buksan sa onResume at palayain sa onPause.
Ang MediaRecorder ay ginagamit para sa pag-record ng audio at video. Ang paghingi ng pahintulot at paghahanda ng MediaRecorder ay ginagawa sa onCreate, at ang pagsisimula ng pag-record ay sa onResume. Kung ang gumagamit ay lumipat sa ibang application, ang onPause ay nagpapahinto ng pag-record, at ang onResume ay nagpapatuloy nito. Ito ay karaniwang pag-uugali para sa mga dictaphone at video recording application.
private var mediaRecorder: MediaRecorder? = null
private var isRecording = false
override fun onResume() {
super.onResume()
if (isRecording) {
mediaRecorder?.resume()
}
}
override fun onPause() {
if (isRecording) {
mediaRecorder?.pause()
}
super.onPause()
}
Ang biometric authentication (BiometricPrompt) ay dapat tawagin lamang kapag ang Activity ay nasa onResume. Kung tatawagin ito sa onCreate o onStart, ang dialog ng biometry ay maaaring lumitaw bago matapos ng Activity ang initialization, na magdudulot ng hindi tamang pagproseso ng resulta. Ang pagtawag sa onResume ay ginagarantiyahan na ang biometry window ay ipapakita sa tamang konteksto.
Tingnan natin ang tatlong napatunayang pattern ng pagtatrabaho sa onResume na inilalapat sa mga komersyal na proyekto: pag-reset ng timer ng kawalan ng aktibidad, pag-update ng nakikitang datos, at integrasyon sa Jetpack Navigation.
Sa mga application na may kumpidensyal na datos (banking, medical card) ang onResume ay ginagamit para i-reset ang timer ng awtomatikong pag-logout. Kung ang gumagamit ay aktibong nakikipag-ugnayan sa application, ang onResume ay tinatawag sa bawat paglipat sa pagitan ng mga screen at ang timer ay nire-reset. Kung ang gumagamit ay nag-minimize ng application, ang onPause ay humihinto sa timer, at ang onResume sa pagbabalik ay maaaring i-reset ito o humingi ng re-authentication.
Ang listahan na dapat magpakita ng kasalukuyang datos sa bawat pagbabalik sa screen ay ina-update sa onResume. Halimbawa, kung ang gumagamit ay gumawa ng bagong tala sa ibang Activity at bumalik, ang onResume ay nagre-reload ng listahan mula sa lokal na database o mula sa ViewModel cache. Ito ay tinitiyak ang consistency ng datos nang walang manu-manong pagtawag ng notifyDataSetChanged.
override fun onResume() {
super.onResume()
// Ang ActivityResultLauncher ay nagbalik ng resulta — ina-update ang listahan
viewModel.refreshList()
// Pag-reset ng timer ng kawalan ng aktibidad
inactivityTimer.reset()
}
Sa Jetpack Navigation ang onResume ng fragment ay tinatawag sa bawat pagbabalik dito sa pamamagitan ng back navigation. Ang property na ito ay ginagamit para i-reset ang estado ng UI: itago ang keyboard, linisin ang mga patlang ng paghahanap, i-update ang pamagat ng toolbar. Ang OnBackPressedCallback kasama ng onResume ay nagbibigay ng buong kontrol sa nabigasyon nang walang pagdodoble ng code.
Mga Madalas Itanong
onStart — nakikita ang screen. onResume — aktibo ang screen at handa para sa interaksyon. Isipin: nanonood ka ng TV (onStart), ngunit kinukuha mo ang remote sa kamay (onResume). Ang TV ay laging nakikita, ngunit ang interaksyon ay nagsisimula lamang sa remote. Kung may magtakip ng TV ng kurtina — ang screen ay hindi na nakikita (onStop). Kung kukunin ang remote mula sa iyo — ang interaksyon ay hihinto (onPause), ngunit ang TV ay nakikita pa rin.
Ang onResume ay tinatawag tuwing ang Activity ay nakatatanggap ng input focus. Pinakamababang bilang — isang beses (sa paglunsad). Pinakamataas ay depende sa mga sitwasyon ng paggamit: paglipat sa pagitan ng mga screen, pagbubukas ng mga dialog, mabilis na pag-lock at pag-unlock ng device — bawat sitwasyon ay tumatawag ng onResume sa pagbabalik sa screen.
Ang camera — eksklusibong resource na magagamit lamang para sa isang application sa isang pagkakataon. Kung bubuksan mo ang camera sa onCreate o onStart, mananatili itong naka-lock para sa ibang mga application kahit na ang iyong application ay hindi aktibo. Ginagarantiyahan ng onResume na ang camera ay bukas lamang kapag ang Activity ay nasa foreground, at agad itong isinasara ng onPause. Ito ay pamantayan ng pag-develop ng Android, na itinatag sa dokumentasyon ng CameraX at Camera2 API.
Oo, ang onResume ay maaaring hindi mangyari kung ang Activity ay matakpan ng ibang Activity kaagad pagkatapos lumitaw. Halimbawa, ang Activity A ay naglulunsad ng Activity B sa onCreate o onStart method. Sa kasong ito A ay tumatanggap ng onStart → onPause → onStop, lalaktawan ang onResume. Hindi tinatawag ng system ang onResume dahil hindi kailanman nakatanggap ng input focus ang Activity A.
Sa onResume hindi dapat magsagawa ng mahabang synchronous na operasyon: pag-load ng malaking datos mula sa network, kumplikadong SQL query, pagproseso ng imahe. Ang onResume method ay tumatakbo sa UI thread at anumang pag-block ng mas mahaba sa 100–200 ms ay nagdudulot ng pagkaantala sa pagtugon ng interface. Lahat ng mabibigat na operasyon ay dapat asynchronous — sa pamamagitan ng coroutine, RxJava, o WorkManager. Hindi rin inirerekomenda ang pagtawag ng finish() sa onResume nang walang pagsusuri — maaari itong humantong sa walang katapusang loop ng pag-recreate.
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