Activity生命周期解析墅冷、橫豎屏切換引發(fā)問題和解決辦法解析

前提

首先我們要知道匀钧,在系統(tǒng)中有一個專門用來管理Activity實(shí)例對象的棧塘娶,這個堆棧采用的是“先進(jìn)后出”的模式箫爷。我們每創(chuàng)建一個活動對象都會放進(jìn)這個堆棧中酪劫,而最頂端的活動對象才是可見的并且可以和用戶進(jìn)行交互的舀凛!整個堆棧的活動過程如下圖所示:

了解了堆棧之后扼仲,我們再看下官方最新的活動生命周期圖:

其實(shí)我們平常在用APP的時(shí)候看到的APP界面就是以Activity(活動)為基礎(chǔ)的远寸,從而我們也能知道活動的最簡單的功能就是可以給用戶展示界面,并且和用戶交互屠凶!從這個生命周期圖中“visible”,“hidden”等字樣我們也能看出這一現(xiàn)象驰后!
那么我們在可以將活動的狀態(tài)分為:

  • 創(chuàng)建(初始化)
  • 可見不可交互
  • 可見可交互
  • 部分可見不可交互
  • 不可見不可交互
  • 銷毀

在結(jié)合上圖,我們在分別說明一下圖中的7個生命周期方法都有什么作用:

  1. onCreate() : 活動創(chuàng)建的時(shí)候被調(diào)用矗愧,創(chuàng)建之后之后活動被銷毀了之后再次啟動才會被調(diào)用灶芝。在這個方法中我們通常做一些初始化的工作,例如:控件的初始化,數(shù)據(jù)和控件的綁定等等夜涕!
     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    }
- 拓展說明:從上圖中可以看到方法還帶有一個Bundle類型的參數(shù)犯犁,Bundle類型大家應(yīng)該知道它可以以鍵值對的形式存放許多類型的數(shù)據(jù),所以這個參數(shù)可以用來恢復(fù)一些數(shù)據(jù)女器,至于是什么數(shù)據(jù)酸役,并且這些數(shù)據(jù)是怎么來的,后面會詳情說明的驾胆!
  1. onStart() :執(zhí)行到這個方法的時(shí)候就是我們上面說的“可見不可交互”狀態(tài)涣澡!

  2. onResume():執(zhí)行到這個方法的時(shí)候就是我們上面說的“可見可交互”狀態(tài),這個時(shí)候活動是處于棧頂?shù)模?/p>

  3. onPause():執(zhí)行這個方法的時(shí)候丧诺,活動處于暫停狀態(tài)暑塑,就是我們說的部分可見不可交互狀態(tài),比如:啟動一個對話框模式的活動等锅必,(特別注意:彈出的對話框并不能出發(fā)改方法)事格。從圖中我們可以看到這個方法之后有兩個路徑,向前就是重新展示上一個活動搞隐,向后就是停止當(dāng)前的活動驹愚!

  4. onStop():這個方法代表活動不再可見,也就是此時(shí)活動處于后臺運(yùn)行狀態(tài)劣纲!這個可以有兩個選擇逢捺,要么就是通過onRestart()方法重新打開活動,要么就是執(zhí)行onDestroy()銷毀活動癞季!

  5. onRestart():這個方法就是就是用來重新打開活動的劫瞳,不知道這個方法有什么意義,官方給的解釋就是:

    當(dāng)您的Activity從停止?fàn)顟B(tài)返回前臺時(shí)绷柒,它會接收對 onRestart() 的調(diào)用志于。系統(tǒng)還會在每次您的Activity變?yōu)榭梢姇r(shí)調(diào)用 onStart() 方法(無論是正重新開始還是初次創(chuàng)建)。 但是废睦,只會在Activity從停止?fàn)顟B(tài)繼續(xù)時(shí)調(diào)用 onRestart() 方法伺绽,因此您可以使用它執(zhí)行只有在Activity之前停止但未銷毀的情況下可能必須執(zhí)行的特殊恢復(fù)工作。

  6. onDestroy():就是銷毀活動的實(shí)例了嗜湃,并且這個活動也將從活動棧的棧頂被清除奈应!

梳理流程:

  1. 當(dāng)我們啟動活動的時(shí)候會執(zhí)行: 此時(shí)活動可見可交互
  • onCreate()
  • onStart()
  • onResume()
  1. 之后的操作分兩種情況:
  • 如果啟動對話框模式的Activtiy或其他操作,使得當(dāng)前活動部分不可見购披,則只會執(zhí)行:

    • onPause()

      • 這種情況之后的操作也分兩種:

        • onResume() 執(zhí)行這個方法讓活動重新處于前端
        • onStop() 執(zhí)行這個方法讓活動重新處于后臺
  • 如果啟動另一個活動杖挣,使得當(dāng)前活動完全不可見了,則會執(zhí)行:

    • onPause()

    • onStop()

      • 這種情況之后的操作也分兩種:

        • onDestroy() 執(zhí)行這個方法銷毀活動
        • onRestart()刚陡,onStart()惩妇,onResume() 執(zhí)行這些方法讓重新打開活動

需要了解的在生命周期中的一些方法:

 @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        L.e("保存活動狀態(tài)數(shù)據(jù)");
    }

這個方法是一定是在onStop()方法之前執(zhí)行在但是不一定在onPause()之后執(zhí)行株汉,時(shí)序不能得到保證。該的方法可以通過Bundle類型的參數(shù)來保存活動的狀態(tài)數(shù)據(jù)屿附。這里保存的數(shù)據(jù)郎逃,可以在onCreate方法中的參數(shù)獲取到哥童!上面已經(jīng)說過了挺份!也可以通過下面的方法獲取到:

 @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
    }

只要執(zhí)行了這個方法就代表savedInstanceState參數(shù)里一定有數(shù)據(jù),相反只有當(dāng)savedInstanceState參數(shù)里有數(shù)據(jù)才會執(zhí)行這個方法贮懈!但是onCreate方法卻不一定匀泊,至于要在哪個方法里恢復(fù)數(shù)據(jù),其實(shí)都可以朵你!官方推薦是在onRestoreInstanceState這個方法中恢復(fù)數(shù)據(jù)各聘;

上面這兩個方法只會在活動異常終止的情況下執(zhí)行,在正常通過返回鍵銷毀活動的時(shí)候并沒有執(zhí)行該過程抡医。

拓展知識:橫豎屏切換

為什么會說這個呢躲因,因?yàn)樵谑謾C(jī)進(jìn)行橫豎屏切換的時(shí)候,會引發(fā)活動生命周期的一輪變化忌傻,下面我通過打印的log進(jìn)行說明:
首先看下代碼:

QQ截圖20170426150140.png

在剩下的生命周期方法中我也打印了相關(guān)日志大脉,還有代碼中的參數(shù),之后我啟動程序看打印的日志:

圖片.png

執(zhí)行了相關(guān)的周期方法水孩,并且打印了參數(shù)值镰矿!這時(shí)候我手動旋轉(zhuǎn)手機(jī)變成橫向的再看打印的日志:

圖片.png

從日志可以看出,先是執(zhí)行了onPause(),onStop(),onDestroy(),把當(dāng)前的活動銷毀俘种,之后又重新執(zhí)行了一遍生命周期秤标!

解決這個問題也很簡單,就是在manifests文件生命這個活動的資源里添加這條屬性:

圖片.png

這兩個值解釋下:

orientation:屏幕方向發(fā)生變化宙刘,配置該參數(shù)可以解決橫豎屏切換時(shí)苍姜,Activity重建問題(API<13)
screenSize:當(dāng)設(shè)備旋轉(zhuǎn)時(shí),屏幕尺寸發(fā)生變化悬包,API>13后必須配置該參數(shù)才可以保證橫豎切換不會導(dǎo)致Activity重建怖现。

這樣切屏的時(shí)候就不再回調(diào)

 @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
    }

而是回調(diào):

  @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        L.e("onConfigurationChanged");
    }

并且不會再引發(fā)生命周期的變化:

QQ截圖20170426150630.png

** 并且可以通過一下方法來判斷旋轉(zhuǎn)之后的屏幕狀態(tài)是橫屏還是豎屏: **

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            L.e("此時(shí)為橫屏模式");
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            L.e("此時(shí)為豎屏模式");
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市玉罐,隨后出現(xiàn)的幾起案子屈嗤,更是在濱河造成了極大的恐慌,老刑警劉巖吊输,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饶号,死亡現(xiàn)場離奇詭異,居然都是意外死亡季蚂,警方通過查閱死者的電腦和手機(jī)茫船,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門琅束,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人算谈,你說我怎么就攤上這事涩禀。” “怎么了然眼?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵艾船,是天一觀的道長。 經(jīng)常有香客問我高每,道長屿岂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任鲸匿,我火速辦了婚禮爷怀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘带欢。我一直安慰自己运授,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布乔煞。 她就那樣靜靜地躺著吁朦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瘤缩。 梳的紋絲不亂的頭發(fā)上喇完,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機(jī)與錄音剥啤,去河邊找鬼锦溪。 笑死,一個胖子當(dāng)著我的面吹牛府怯,可吹牛的內(nèi)容都是我干的刻诊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼牺丙,長吁一口氣:“原來是場噩夢啊……” “哼则涯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冲簿,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤粟判,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后档礁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吝沫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年呻澜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了递礼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡羹幸,死狀恐怖脊髓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情栅受,我是刑警寧澤将硝,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站窘疮,受9級特大地震影響袋哼,放射性物質(zhì)發(fā)生泄漏冀墨。R本人自食惡果不足惜闸衫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诽嘉。 院中可真熱鬧蔚出,春花似錦、人聲如沸虫腋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悦冀。三九已至趋翻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盒蟆,已是汗流浹背踏烙。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留历等,地道東北人讨惩。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像寒屯,于是被迫代替她去往敵國和親荐捻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容