onRestart — paraan ng lifecycle ng Activity sa Android, na tinatawag ng system bago bumalik ang Activity mula sa Stopped na estado patungo sa Started na estado. Ang onRestart ay nagpapahiwatig na ang Activity, na dating nakatago ng ibang screen o na-minimize sa background, ay muling nagiging nakikita para sa user. Sa onRestart, ina-update ng developer ang lumang data, ni-reload ang mga listahan, at ibinabalik ang UI state na maaaring nagbago habang hindi nakikita ang Activity. Ayon sa Google Android Vitals (2025), ang mga app na gumagamit ng onRestart para sa pag-update ng data ay nagpapakita ng 25% na mas kaunting kaso ng maling pagpapakita ng impormasyon kapag bumalik sa screen. Dokumentasyon ng Android Developers ay naglalarawan ng onRestart bilang yugto ng paghahanda bago muling lumitaw ang Activity sa screen.
Mga Pangunahing Punto
onRestart — paraan ng callback na tinatawag ng Android bago ang onStart, kapag ang Activity ay bumalik mula sa hindi nakikitang Stopped na estado pabalik sa nakikitang estado. Ang paraang ito ay natatangi dahil ito ay tinatawag lamang sa paulit-ulit na pagpapakita ng Activity — sa unang paggawa ng instance, ang pagkakasunod-sunod ay nagsisimula sa onCreate, na nilalaktawan ang onRestart. Buong cycle: onCreate → onStart → onResume (unang paglunsad) o onRestart → onStart → onResume (paulit-ulit na pagpapakita).
Mula sa pananaw ng Android system, ang onRestart ay isang optimization na nagpapahintulot sa Activity na maghanda para sa pagbabalik: i-update ang data mula sa repository, i-synchronize ang UI state, suriin ang koneksyon sa network. Hindi tulad ng onResume, na tinatawag sa bawat oras na makakuha ng focus (kabilang ang pagbabalik mula sa dialog o system menu), ang onRestart ay aktibo lamang sa buong cycle ng pagtatago-pagbabalik. Ginagawa nitong perpektong lugar ang onRestart para sa „mabibigat“ na operasyon ng pag-update na hindi kailangan sa bahagyang pagkawala ng focus.
Ayon sa detalye ng Android Activity lifecycle, ang pagitan ng oras sa pagitan ng onStop at onRestart ay maaaring mula sa ilang segundo (mabilis na lumipat ang user) hanggang ilang oras (ang app ay nasa background at bumalik ang user). Sa panahong ito, ang data sa malayong pinagmulan (API, DB) ay maaaring nagbago, kaya ang onRestart ay ang natural na punto para suriin ang pagiging bago.
Ang onRestart ay tinatawag lamang kapag bumalik ang Activity mula sa Stopped na estado, kung saan pumasok ang Activity pagkatapos ng pagtawag ng onStop. Nasa ibaba ang lahat ng sitwasyon na humahantong sa onRestart.
Mga sitwasyon ng pagtawag ng onRestart:
Kailan HINDI tinatawag ang onRestart: sa pag-ikot ng screen (ang Activity ay nasisira at ginagawang muli sa pamamagitan ng onCreate), sa pagbabalik mula sa dialog window (ang Activity ay hindi pumupunta sa onStop, onPause → onResume lamang), sa process death (ang Activity ay ginagawang muli).
Ang onRestart at onCreate ay dalawang magkaibang paraan ng pagpapanumbalik ng Activity. Ang pagpili sa pagitan ng mga ito ay depende sa kung ang Activity ay ganap na nawasak o nakatago lamang.
| Katangian | onRestart | onCreate |
|---|---|---|
| Kailan tinatawag | Ang Activity ay bumalik mula sa Stopped | Ang Activity ay ginawa sa unang pagkakataon o pagkatapos ng pagkasira |
| Ang estado ay nai-save | Oo — ViewModel at mga field ay buhay | Hindi — lahat ay ginagawang muli |
| Bundle | Hindi ipinapasa | Ipinapasa (savedInstanceState) |
| Mga karaniwang aksyon | Pag-update ng data, pag-refresh ng UI | Pagsisimula ng View, pag-subscribe sa LiveData |
| Dalas ng pagtawag | Bawat oras sa pagbabalik | Isang beses o pagkatapos ng pagkasira |
Panuntunan sa pagpili: gawin ang pagsisimula ng View at pag-subscribe sa LiveData/StateFlow sa onCreate (o onViewCreated para sa Fragment). Pag-update ng data, pag-reload ng mga listahan, at pagsusuri ng estado — sa onRestart. Kung ang data ay na-load sa pamamagitan ng ViewModel, ang onRestart ay maaaring tumawag lamang ng refresh() method sa ViewModel, at ang View ay mag-subscribe sa na-update na data sa pamamagitan ng reactive stream.
Inirerekomenda ng Google: huwag i-duplicate ang logic ng onCreate sa onRestart. Ihiwalay sa ViewModel ang mga refresh() method na naglo-load ng kasalukuyang data at tawagin ang mga ito sa onRestart. Ito ay nagpapanatili ng kalinawan ng arkitekturang MVVM at nag-aalis ng pagdodoble ng code.
Ang onRestart — perpektong lugar para sa mga operasyon na dapat isagawa sa bawat pagbabalik sa screen, ngunit hindi kailangan sa unang pagbukas. Narito ang mga karaniwang sitwasyon:
viewModel.refreshItems() sa onRestart.Ano ang hindi gagawin sa onRestart: huwag simulan muli ang View — sila ay buhay dahil ang Activity ay hindi nawasak. Huwag mag-subscribe muli sa LiveData — ang subscription sa onCreate ay buhay. Huwag gumawa ng bagong fragment — sila ay nasa FragmentManager na.
Ang pinakamahalagang pagbubukod: ang onRestart ay hindi tinatawag kung ang proseso ng app ay pinatay ng system. Ito ang pangunahing punto na madalas na napalampas ng mga developer sa pamamagitan ng pag-asa sa onRestart para sa pagpapanumbalik ng estado.
Sa process death:
Paano protektahan ang iyong sarili: palaging i-save ang kritikal na estado sa onSaveInstanceState(Bundle) (tinatawag bago ang onStop) o gamitin ang SavedStateHandle sa ViewModel. Sa onCreate, suriin ang savedInstanceState: kung hindi ito null, ibalik ang estado mula sa Bundle, kung null — mag-load ng sariwang data.
Ayon sa Google Android Vitals, humigit-kumulang 7% ng mga pagbabalik sa Activity pagkatapos ng mahabang pananatili sa background ay nangyayari pagkatapos ng process death. Nangangahulugan ito na bawat ika-15 Activity na dapat tumawag ng onRestart ay sa katunayan ay dumadaan sa onCreate. Ang pagwawalang-bahala sa sitwasyong ito ay isa sa mga pangunahing sanhi ng mga bug na „blangkong screen pagkatapos bumalik“.
Tinatawag ng Activity ang viewModel.refreshTasks() sa onRestart upang i-update ang listahan ng mga gawain pagkatapos bumalik mula sa edit screen.
class TaskListActivity : AppCompatActivity() {
private val viewModel: TaskViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_task_list)
viewModel.tasks.observe(this) { tasks ->
Log.d("TaskList", "${tasks.size} gawain ang natanggap")
}
}
override fun onRestart() {
super.onRestart()
Log.d("TaskList", "onRestart: pag-update ng listahan ng gawain")
viewModel.refreshTasks()
}
}
class TaskViewModel : ViewModel() {
private val _tasks = MutableLiveData<List<Task>>()
val tasks: LiveData<List<Task>> get() = _tasks
fun refreshTasks() {
viewModelScope.launch {
_tasks.value = TaskRepository().getAllTasks()
}
}
}
Ang ViewModel.refreshTasks() ay naglo-load ng kasalukuyang data mula sa repository. Awtomatikong nag-aabiso ang LiveData sa Activity tungkol sa pagbabago ng data — ang UI ay nag-a-update nang walang karagdagang code. Ang OnRestart ay hindi gumagawa ng bagong subscription — ito ay nakatakda na sa onCreate.
Sinusuri ng Activity ang validity ng token sa pagbabalik at nagre-redirect sa login kung kinakailangan.
class ProfileActivity : AppCompatActivity() {
private val authManager = AuthManager()
private val launcher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { Log.d("Profile", "Bumalik mula sa login screen") }
override fun onRestart() {
super.onRestart()
if (!authManager.isTokenValid()) {
Log.d("Profile", "Nag-expire ang token — na-redirect sa login")
launcher.launch(Intent(this, LoginActivity::class.java))
}
}
}
class AuthManager {
fun isTokenValid(): Boolean {
val expiry = SharedPreferencesManager().getTokenExpiry()
return System.currentTimeMillis() < expiry
}
}
Kung na-minimize ng user ang app nang mahabang panahon at bumalik pagkatapos mag-expire ang token, ire-redirect siya ng onRestart sa login screen. Pinipigilan nito ang mga error sa API kapag sinusubukang magsagawa ng request na may expired na token. Pansinin: pagsusuri sa onRestart, hindi sa onResume, upang maiwasan ang hindi kinakailangang pagsusuri sa pagbabalik mula sa dialog.
Gumagamit ang Fragment ng onRestart sa pamamagitan ng LifecycleObserver para sa pag-update ng data.
class FeedFragment : Fragment() {
private val viewModel: FeedViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycle.addObserver(object : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESTART)
fun onRestart() {
Log.d("FeedFragment", "onRestart sa pamamagitan ng LifecycleObserver")
viewModel.refreshFeed()
}
})
}
}
Sa halip na i-override ang onRestart sa Fragment, ginagamit ang LifecycleObserver — isang mas flexible na paraan na nagpapahintulot sa pagdaragdag ng logic sa mga lifecycle na kaganapan nang walang inheritance. Ginagarantiyahan ng ViewLifecycleOwner na ang observer ay nabubuhay sa scope ng View (hindi lumalampas sa onDestroyView).
Mga Madalas Itanong
Ang onResume ay tinatawag sa bawat oras na ang Activity ay makakuha ng focus — kabilang ang pagbabalik mula sa dialog o system menu (ang Activity ay hindi pumunta sa onStop). Ang onRestart ay tinatawag lamang sa pagbabalik mula sa Stopped na estado, kapag ang Activity ay ganap na nakatago. Ang onRestart ay isang mas makitid na kaganapan para sa „mabibigat“ na pag-update, ang onResume ay para sa magaang na operasyon (pagbabago ng pamagat, pag-update ng oras).
Hindi, hindi maaari. Ang onRestart ay ang paired na paraan ng onStop: ang onRestart ay tinatawag lamang pagkatapos na ang Activity ay dumaan sa onStop. Kung ang Activity ay hindi pumunta sa onStop (halimbawa, nakabukas ang dialog window), sa pagbabalik ang onRestart ay hindi tinatawag — onResume lamang.
Pindutin ang Home (button ng bahay) sa emulator — ang Activity ay ma-mi-minimize, makakatanggap ng onStop. Pagkatapos ay buksan ang app sa pamamagitan ng Recent Apps o launcher — ang Activity ay makakatanggap ng onRestart → onStart → onResume. Para sa debugging, gumamit ng Debug na may mga breakpoint sa onRestart o Log.d na may tag na Activity.
Ang hindi nahuling exception sa onRestart ay magdudulot ng Force Close. Hindi nahuhuli ng system ang mga exception sa lifecycle callbacks. Kung sa onRestart ay isinasagawa ang mga operasyon na maaaring magtapon ng exception (network request na walang try-catch, pagtatrabaho sa null View), balutin ang mga ito ng try-catch.
Hindi. Ang onRestart ay tinatawag lamang para sa buhay na Activity na bumabalik mula sa Stopped na estado. Ang isFinishing() sa onRestart ay palaging magiging false. Ang pagsusuri ng isFinishing() ay may katuturan sa onPause (pag-save ng data) at onDestroy (pag-iiba ng recreation mula sa finish()).
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