Ang siklo ng buhay ng mobile app ay tumutukoy kung paano kumilos ang app kapag inilunsad, pinaliit, ibinalik mula sa background, at isinara. Sa artikulong ito, tatalakayin natin ang App Lifecycle (iOS), Activity Lifecycle (Android), Fragment Lifecycle, ViewController Lifecycle at LifecycleOwner. Ang pag-unawa sa mga prosesong ito ay kritikal para maiwasan ang pagtagas ng memorya, pagkawala ng data, at hindi tamang pag-uugali ng app. Higit pang detalye sa opisyal na dokumentasyon ng Android Activity Lifecycle.
Mga Pangunahing Punto
Bago sumabak sa siklo ng buhay ng mga indibidwal na screen, mahalagang maunawaan ang siklo ng buhay ng buong aplikasyon. Sa iOS, ang app ay dumadaan sa limang estado: Not Running (hindi tumatakbo), Inactive (sa background, hindi tumatanggap ng mga kaganapan), Active (aktibo), Background (sa background, ang code ay tumatakbo) at Suspended (sa background, ang code ay naka-pause). Ang mga estadong ito ay pinamamahalaan sa AppDelegate sa pamamagitan ng mga pamamaraang applicationDidFinishLaunching, applicationDidBecomeActive, applicationWillResignActive, applicationDidEnterBackground at applicationWillTerminate.
Sa Android, ang katumbas ay ang Application Lifecycle, na sinusubaybayan sa pamamagitan ng interface na Application.ActivityLifecycleCallbacks. Gayunpaman, mas nakatuon ang Android sa siklo ng buhay ng isang Activity — isang indibidwal na screen ng app. Ito ay dahil ang isang Android app ay maaaring binubuo ng maraming Activities, bawat isa ay may sariling siklo.
Ang makabagong diskarte sa Android ay ang paggamit ng ProcessLifecycleOwner mula sa library na lifecycle-process. Pinapayagan nito ang pagsubaybay sa estado ng buong proseso nang hindi nakatali sa isang partikular na Activity. Sa iOS, ang UISceneDelegate (mula noong iOS 13) o AppDelegate ay ginagamit para sa pagsubaybay sa estado ng app. Ang SceneDelegate ay humahawak ng maraming window (multiwindow) sa iPad. Ang pag-unawa sa App Lifecycle ay lalong mahalaga para sa IT Sectr kapag nagde-develop ng mga app na may background synchronization, streaming, at mga tawag sa VoIP.
Activity ay ang pangunahing bahagi ng isang Android app na kumakatawan sa isang screen. Ang Activity ay may malinaw na tinukoy na siklo ng buhay na pinamamahalaan ng operating system bilang tugon sa mga aksyon ng user at mga kaganapan sa system (pag-ikot ng screen, papasok na tawag, mababang memorya).
| Pamamaraan | Paglalarawan | Ano ang Gagawin |
|---|---|---|
| onCreate | Tinatawag nang isang beses kapag ginawa ang Activity | Pagsisimula ng UI, findViewById, pag-setup ng ViewModel |
| onStart | Naging visible ang Activity | Simulan ang mga animation, irehistro ang BroadCastReceiver |
| onResume | Nakakuha ng input focus ang Activity | Simulan ang camera, sensor, animation |
| onPause | Nawala ang focus ng Activity (bahagyang visible) | I-save ang mga draft, ihinto ang mga animation |
| onStop | Hindi visible ang Activity | Palayain ang mga resource, ihinto ang mga update |
| onDestroy | Nasira ang Activity | Linisin ang lahat ng reference, mag-unsubscribe mula sa LiveData |
| onRestart | Tinatawag bago ang onStart pagkatapos ng onStop | Muling pagsisimula |
Mahalaga: Ang onSaveInstanceState ay tinatawag bago ang onStop upang i-save ang pansamantalang estado. Ang pagpapanumbalik ay nangyayari sa onCreate sa pamamagitan ng Bundle savedInstanceState o sa pamamagitan ng SavedStateHandle sa ViewModel. Kung walang tamang paghawak ng siklo ng buhay, mawawala ng app ang lahat ng hindi naka-save na data kapag umikot ang screen.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("draft", draftText)
}
override fun onDestroy() {
super.onDestroy()
// Отписка от всех подписок
}
}Sa Jetpack Compose, ang siklo ng buhay ng Activity ay nananatiling hindi nagbabago, ngunit nagbibigay ang Compose ng mga karagdagang tool: Komposisyong may kamalayan sa siklo ng buhay sa pamamagitan ng LifecycleOwner, mga epektong LifecycleEventEffect at DisposableEffect para sa awtomatikong paglilinis ng resource kapag nasira.
Fragment sa Android ay nabubuhay sa loob ng isang Activity at may sariling siklo ng buhay, na bahagyang nag-o-overlap sa Activity ngunit nagdaragdag ng mga bagong pamamaraan. Ang mga Fragment ay maaaring idagdag, palitan, alisin nang hindi sinisira ang Activity, na ginagawang mas flexible ngunit mas kumplikado.
Mga pangunahing pamamaraan ng Fragment Lifecycle: onAttach — Fragment nakakabit sa Activity (unang tawag); onCreate — pagsisimula ng data; onCreateView — paggawa ng View; onViewCreated — View nagawa, maaaring i-configure ang UI; onStart — Fragment visible; onResume — Fragment nasa focus; onPause — Fragment nawawala ang focus; onStop — Fragment hindi visible; onDestroyView — View nasira; onDestroy — Fragment nasira; onDetach — Fragment naalis mula sa Activity.
Pangunahing pagkakaiba mula sa Activity: Ang onCreateView at onDestroyView ay maaaring tawagin nang maraming beses (hal., kapag nagpapalit ng TabLayout), habang ang onCreate ay tinatawag nang isang beses. Alinsunod dito, ang pagsisimula ng View ay dapat gawin sa onViewCreated, hindi sa onCreateView. Ang mga resource na nauugnay sa View (tulad ng mga adaptor ng RecyclerView) ay dapat linisin sa onDestroyView.
UIViewController ay ang base class para sa pamamahala ng mga screen sa iOS. Ang siklo ng buhay nito ay binubuo ng isang pagkakasunod-sunod ng mga pamamaraan na awtomatikong tinatawag ng UIKit. Ang pag-unawa sa siklong ito ay kritikal para sa tamang pagsisimula ng UI, pamamahala ng data, at paghawak ng memorya.
| Pamamaraan | Kailan Tinatawag | Karaniwang Paggamit |
|---|---|---|
| loadView | Kapag ni-load ng View Controller ang kanyang hierarchy ng View | Custom na pagsisimula nang walang storyboard |
| viewDidLoad | Pagkatapos ma-load ang View sa memorya (isang beses) | Pag-setup ng UI, pag-load ng paunang data |
| viewWillAppear | Bago lumitaw ang View sa screen | I-update ang data, mag-subscribe sa mga notification |
| viewDidAppear | Pagkatapos lumitaw ang View sa screen | Simulan ang mga animation, simulan ang mga animation ng pagsubaybay |
| viewWillDisappear | Bago mawala ang View sa screen | I-save ang estado, mag-unsubscribe sa mga notification |
| viewDidDisappear | Pagkatapos mawala ang View sa screen | Ihinto ang mga animation, palayain ang mga resource |
| dealloc | Kapag nasira ang View Controller | Palayain ang lahat ng resource |
Mahalaga: Ang viewDidLoad ay tinatawag lamang nang isang beses sa buhay ng isang View Controller. Upang i-update ang data sa bawat paglitaw, gamitin ang viewWillAppear. Kung mag-subscribe ka sa NotificationCenter sa viewWillAppear, siguraduhing mag-unsubscribe sa viewDidDisappear upang maiwasan ang pagtagas ng memorya.
Pinamamahalaan ng SwiftUI ang siklo ng buhay ng mga View sa pamamagitan ng mga istruktura ng View. Sa halip na mga pamamaraan ng callback, gumagamit ang SwiftUI ng mga modifier na onAppear at onDisappear. Para sa mga pandaigdigang estado ng app, ginagamit ang App Lifecycle sa pamamagitan ng mga protokol ng App at Scene. Awtomatikong pinamamahalaan ng SwiftUI ang paggawa at pagkasira ng mga View batay sa estado, na nagpapasimple sa pag-develop ngunit nangangailangan ng pag-unawa sa pagkakakilanlan at habang-buhay ng View.
struct ContentView: View {
var body: some View {
Text("Hello")
.onAppear {
print("View появилась")
}
.onDisappear {
print("View исчезла")
}
}
}LifecycleOwner ay isang interface mula sa Android Architecture Components na nagmamarka ng isang bagay na may siklo ng buhay (Activity, Fragment). LifecycleObserver ay isang interface na nagpapahintulot sa isang bagay na mag-subscribe sa mga kaganapan ng LifecycleOwner. Magkasama silang bumubuo ng pundasyon ng reaktibong pamamahala ng siklo ng buhay sa modernong pag-develop ng Android.
Sa halip na tahasang tumawag ng mga pamamaraan sa onStart/onStop, inirerekomenda na gamitin ang DefaultLifecycleObserver (kapalit ng hindi na ginagamit na LifecycleObserver na may mga anotasyong @OnLifecycleEvent). Ito ang diskarte na itinaguyod ng Google para sa ViewModel at iba pang mga bahagi na kailangang tumugon sa siklo ng buhay nang walang direktang mga reference sa Activity o Fragment.
class MyObserver : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
// Подписка на обновления
}
override fun onStop(owner: LifecycleOwner) {
// Отписка
}
}Sa IT Sectr, ginagamit namin ang LifecycleOwner sa lahat ng proyekto sa Android. Ang ViewModel ay nag-subscribe sa LifecycleOwner ng Activity sa pamamagitan ng viewModelScope at lifecycleScope, na ginagarantiyahan ang awtomatikong pagkansela ng mga coroutine kapag ang Activity ay nasira. Ito ay pumipigil sa pagtagas ng memorya at ginagawang mas malinis at mas ligtas ang code.
Mga Madalas Itanong
Ang Activity ay dumadaan sa anim na estado: Created (onCreate), Started (onStart), Resumed (onResume), Paused (onPause), Stopped (onStop), Destroyed (onDestroy).
Pagkakasunod-sunod: loadView → viewDidLoad → viewWillAppear → viewDidAppear → viewWillDisappear → viewDidDisappear. Ang viewDidLoad ay tinatawag nang isang beses.
LifecycleOwner ay isang bahagi ng Android Architecture Components na nagmamay-ari ng siklo ng buhay ng isang Activity o Fragment. Pinapayagan ang pag-subscribe sa mga kaganapan sa pamamagitan ng LifecycleObserver.
Ang iOS app ay dumadaan sa limang estado: Not Running, Inactive, Active, Background, Suspended. Ang mga transisyon ay pinamamahalaan sa pamamagitan ng UIApplicationDelegate.
Saved State ay ang mekanismo ng Android para mapanatili ang estado ng Activity/Fragment sa pag-ikot ng screen o muling paggawa ng proseso. Gumagamit ito ng onSaveInstanceState at SavedStateHandle.
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.