Android開(kāi)發(fā)——界面跳轉(zhuǎn)實(shí)戰(zhàn)引出生命周期

2020.8.5

學(xué)完界面之間的兩種跳轉(zhuǎn)模式后社痛,便可實(shí)現(xiàn)下面這個(gè)demo

demo演示.gif

在體驗(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)行篩選

使用步驟:

  1. 調(diào)用格式:Log.v("進(jìn)行篩選的標(biāo)志","打印內(nèi)容")
  2. 在Logcat中進(jìn)行篩選
Logcat.png

打印信息的幾種類(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)歷的生命周期
  1. 程序第一次啟動(dòng)
    onCreate
    onStart
    onResume
    處于可以進(jìn)行交互的狀態(tài)
首次啟動(dòng)app.gif
  1. 程序切換到后臺(tái)
    onPause
    onStop
大返回(home鍵).gif
  1. 程序從后臺(tái)切換到前臺(tái)并顯示
    onRestart
    onStart
    onResume
后臺(tái)回到app.gif
  1. 按返回鍵
    onPause
    onStop
    onDestroy
    當(dāng)前界面會(huì)被釋放掉
返回到桌面.gif
  1. 切換到其他頁(yè)面
    onPause
    onStop
跳轉(zhuǎn)到其他頁(yè)面.gif
  1. 從其他頁(yè)面切換回來(lái)
    onRestart
    onStart
    onResume
從其他頁(yè)面切換回來(lái).gif
  1. 屏幕旋轉(zhuǎn)
    onPause
    onStop
    onDestroy
    onCreate
    onStart
    onResume
屏幕旋轉(zhuǎn).gif

屏幕旋轉(zhuǎn)時(shí)腾窝,會(huì)銷(xiāo)毀當(dāng)前頁(yè)面缀踪,重新加載頁(yè)面,因而之前存的值都會(huì)消失


旋轉(zhuǎn)問(wèn)題.gif

為了解決這個(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","回收資源")
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末勺阐,一起剝皮案震驚了整個(gè)濱河市卷中,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渊抽,老刑警劉巖蟆豫,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異腰吟,居然都是意外死亡无埃,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)毛雇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嫉称,“玉大人,你說(shuō)我怎么就攤上這事灵疮≈模” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵震捣,是天一觀的道長(zhǎng)荔棉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蒿赢,這世上最難降的妖魔是什么润樱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮羡棵,結(jié)果婚禮上壹若,老公的妹妹穿的比我還像新娘。我一直安慰自己皂冰,他們只是感情好店展,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著秃流,像睡著了一般赂蕴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舶胀,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天概说,我揣著相機(jī)與錄音碧注,去河邊找鬼。 笑死席怪,一個(gè)胖子當(dāng)著我的面吹牛应闯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挂捻,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼碉纺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了刻撒?” 一聲冷哼從身側(cè)響起骨田,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎声怔,沒(méi)想到半個(gè)月后态贤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡醋火,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年悠汽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芥驳。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柿冲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出兆旬,到底是詐尸還是另有隱情假抄,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布丽猬,位于F島的核電站宿饱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏脚祟。R本人自食惡果不足惜谬以,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望由桌。 院中可真熱鬧蛉签,春花似錦、人聲如沸沥寥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)邑雅。三九已至,卻和暖如春妈经,著一層夾襖步出監(jiān)牢的瞬間淮野,已是汗流浹背捧书。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骤星,地道東北人经瓷。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像洞难,于是被迫代替她去往敵國(guó)和親舆吮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350