2020.8.5
學(xué)完界面之間的兩種跳轉(zhuǎn)模式后社痛,便可實(shí)現(xiàn)下面這個(gè)demo
在體驗(yàn)該項(xiàng)目的過(guò)程中恩沽,發(fā)現(xiàn)有一個(gè)bug眨补,就是當(dāng)你由豎屏轉(zhuǎn)換成橫屏?xí)r管削,屏幕上的數(shù)據(jù)會(huì)消失,回到了該頁(yè)面起始的狀態(tài)撑螺,其本質(zhì)是因?yàn)闄M豎屏的轉(zhuǎn)換會(huì)導(dǎo)致生命周期重新開(kāi)始含思,下面將詳細(xì)講解Activity的生命周期
一.日志打印
在程序找bug的時(shí)候,我們通常會(huì)選擇在終端打印信息甘晤,但無(wú)論在模擬器上運(yùn)行還是真機(jī)含潘,終端會(huì)輸出很多無(wú)關(guān)信息,所以println()的方式不太方便查找安皱,此時(shí)便使用日志打印调鬓,其優(yōu)點(diǎn)是可以對(duì)你想要的信息進(jìn)行篩選
使用步驟:
- 調(diào)用格式:Log.v("進(jìn)行篩選的標(biāo)志","打印內(nèi)容")
- 在Logcat中進(jìn)行篩選
打印信息的幾種類(lèi)型:
Log.v() -> Verbose
Log.d() -> Debug
Log.i() -> Info
Log.e -> Eorror
Log.w -> Warn
當(dāng)然最常用的還是Log.v()
二.生命周期
Activity生命周期:從創(chuàng)建->界面銷(xiāo)毀 經(jīng)歷的過(guò)程
生命周期環(huán)節(jié) | 何時(shí)發(fā)生調(diào)用 |
---|---|
onCreate | 當(dāng)Activity被創(chuàng)建,需要對(duì)界面進(jìn)行布局/初始化 |
onStart | 開(kāi)始啟動(dòng)頁(yè)面 |
onRestart | 重新啟動(dòng)酌伊,從后臺(tái)到前臺(tái) |
onResume | 可以進(jìn)行交互了 |
onPause | 暫停交互 |
onStop | 界面暫停 |
onDestroy | 界面銷(xiāo)毀 |
了解app幾種操作經(jīng)歷的生命周期
- 程序第一次啟動(dòng)
onCreate
onStart
onResume
處于可以進(jìn)行交互的狀態(tài)
- 程序切換到后臺(tái)
onPause
onStop
- 程序從后臺(tái)切換到前臺(tái)并顯示
onRestart
onStart
onResume
- 按返回鍵
onPause
onStop
onDestroy
當(dāng)前界面會(huì)被釋放掉
- 切換到其他頁(yè)面
onPause
onStop
- 從其他頁(yè)面切換回來(lái)
onRestart
onStart
onResume
- 屏幕旋轉(zhuǎn)
onPause
onStop
onDestroy
onCreate
onStart
onResume
屏幕旋轉(zhuǎn)時(shí)腾窝,會(huì)銷(xiāo)毀當(dāng)前頁(yè)面缀踪,重新加載頁(yè)面,因而之前存的值都會(huì)消失
為了解決這個(gè)問(wèn)題虹脯,我們需要在界面旋轉(zhuǎn)之前將textView上的文本內(nèi)容進(jìn)行保存驴娃,系統(tǒng)專(zhuān)門(mén)提供了一個(gè)方法onSaveInstanceState(outState: Bundle)
存值:outState用來(lái)管理鍵值對(duì),在界面旋轉(zhuǎn)前會(huì)回調(diào)這個(gè)方法進(jìn)行存值
取值:當(dāng)調(diào)用onCreate時(shí)循集,需要將值取出來(lái)傳給textView唇敞,這樣給用戶的感覺(jué)是,值一直都在咒彤,之所以會(huì)在onCreate中取值疆柔,因?yàn)閛nCreate的參數(shù)
onCreate(savedInstanceState: Bundle?),savedInstanceState會(huì)一直伴隨整個(gè)過(guò)程镶柱,當(dāng)然存的值也在里面
取值
override fun onCreate(savedInstanceState: Bundle?) {
savedInstanceState?.getString("content").also {
textView.text=it
}
}
存值
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("content",textView.text.toString())
}
總結(jié):了解生命周期各個(gè)階段在什么時(shí)候發(fā)生在很多時(shí)候都特別有用旷档,比如界面間的來(lái)回切換,我們希望返回界面時(shí)展示其他圖片等歇拆,可以用一個(gè)值來(lái)進(jìn)行記錄鞋屈,在調(diào)用onCreate方法時(shí)進(jìn)行讀取判斷該值的狀態(tài),還是挺有幫助的故觅,因而生命周期的應(yīng)用主要是Activity的狀態(tài)改變上
三.Lifecycle
雖然我們可以像上面那樣直接在onCreate的方法中實(shí)現(xiàn)該階段應(yīng)該實(shí)現(xiàn)的功能厂庇,但這種方式不易于維護(hù),比如高德地圖输吏,當(dāng)我們啟動(dòng)應(yīng)用的時(shí)候权旷,它就會(huì)開(kāi)始獲取定位信息,當(dāng)我們回到桌面即讓它進(jìn)入任務(wù)棧评也,那么就應(yīng)該停止獲取定位信息炼杖,完全退出時(shí),應(yīng)該進(jìn)行回收資源盗迟,但我們有的時(shí)候需要對(duì)它們進(jìn)行階段修改,本來(lái)應(yīng)該在onStop中調(diào)用熙含,現(xiàn)在想讓它在onPause中調(diào)用罚缕,如果代碼量過(guò)多的話,修改起來(lái)就很麻煩怎静,所以為了便于維護(hù)邮弹,我們使用Lifecycle,其內(nèi)部是通過(guò)注解自動(dòng)感應(yīng)Activity的生命周期蚓聘,如果要修改腌乡,只需要修改對(duì)應(yīng)的注解即可,方便太多
- 如果要讓一個(gè)類(lèi)自動(dòng)感應(yīng)生命周期夜牡,則它必須實(shí)現(xiàn)LifecycleObserver這一接口与纽,該接口內(nèi)部沒(méi)有任何方法,只是用來(lái)感知生命周期的改變,它作為觀察者
- 同時(shí)Activity也需要添加觀察者的對(duì)象 lifecycle.addObserver(GaoDe())
每個(gè)Activity內(nèi)部都有一個(gè)lifecycle急迂,Activity作為被觀察者 - 使用方式 @OnLifecycleEvent(Lifecycle.Event.生命周期的階段)
這里的生命周期只是靜態(tài)常量影所,和上面的用法一樣,只是形式不同 - 當(dāng)被觀察者的生命周期發(fā)生變化時(shí)僚碎,會(huì)主動(dòng)去觀察者中查詢是否有觀察這個(gè)生命周期猴娩,通過(guò)注解實(shí)現(xiàn),注解值和生命周期各階段一一對(duì)應(yīng)
class GaoDe:LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun init(){
Log.v("cx","初始化地圖信息")
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun connect(){
Log.v("cx","開(kāi)始連接獲取定位信息")
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun disconnect(){
Log.v("cx","停止獲取定位信息")
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun recycle(){
Log.v("cx","回收資源")
}
}