進階之路 | 奇妙的Activity之旅

前言

本文已經收錄到我的Github個人博客,歡迎大佬們光臨寒舍:

我的GIthub博客

本篇文章需要已經具備的知識:

  • Activity的基本概念
  • AndroidManifest.xml的基本概念

學習清單:

  • Activity的生命周期
  • Fragment的生命周期
  • Activity的啟動模式
  • IntentFilter的匹配規(guī)則

一.為什么要深入了解Activity呢?

Activity翻譯為活動烹玉,在Android中代表了界面和以界面為中心相應的業(yè)務邏輯伯病,包括顯示、與用戶交互等,它也是四大組件之一点骑,重要性不言而喻泛范。并且让虐,許多公司在考察Android的知識點的時候,經常會考察到Activity的知識罢荡。

因此赡突,深入了解Activity,不僅對你日常的開發(fā)有幫助区赵,還對你之后找工作有所增益惭缰。

二.核心知識點歸納

2.1 生命周期全解析

2.1.1 典型情況下的生命周期

2.1.1.1 Activity生命周期圖解

2.1.1.2 Activity切換過程

(1)啟動Activity

啟動Activity

(2)打開新的Activity / 切換到桌面

  • 正常情況:onPause()-->onStop()
  • 特殊情況:當新的Activity使用了透明主題,當前的Activity不會回調onStop笼才,會停留在Paused

想要了解Android 透明主題的可以點擊鏈接:Android透明主題

(3)返回舊的Activity

  • 當舊的Activity不可見:

    當舊的Activity不可見
  • 當舊的Activity可見:

當舊的Activity可見

問題思考:當前Activity為A漱受,打開新的ActivityB,那么B的onResume()和A的onPause()的執(zhí)行順序是怎樣的呢?

答案:AonPause()-->BonResume(),要得到這個答案骡送,需要對Activity的工作原理有所了解昂羡,筆者在本系列文章的后面幾篇會介紹。

小Tips:要關閉Activity的時候摔踱,盡量在onStop()中進行耗時操作虐先,而使得新Activity盡快顯示出來。

2.1.2 異常情況下的生命周期

2.1.2.1 異常情況下數(shù)據(jù)的保存和恢復

這個涉及到onSaveInstanceStateonRestoreInstanceState方法昌渤,具體可見下圖

數(shù)據(jù)恢復順序

需要特別留意的是:

  • onSaveInstanceState的執(zhí)行順序赴穗,是在onStop之前,與onPause沒有既定順序
  • onRestoreInstanceState的執(zhí)行順序,是在onStart之后

Q1:其中保存和恢復View的工作流程是怎樣的呢膀息?

保存View的工作流程

可以看出般眉,保存和恢復View的工作流程是典型的委托思想,上層委托下層潜支,父容器委托子元素處理事情甸赃。

后面會講到的View的繪制流程,事件分發(fā)機制等冗酿,都是才有類似的思想埠对。

Q2:其中數(shù)據(jù)恢復的方式有哪些络断?

  1. 在onCreate中恢復

    需要注意的是,必須要判斷Bundle是否為空

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //方法一:在onCreate中調用緩存恢復數(shù)據(jù)项玛,必須要判斷savedInstanceState是否為空
        if (savedInstanceState != null) {
            String test = savedInstanceState.getString("extra_test");
            Log.d(TAG, "[onCreate]restore extra_test:" + test);
        }
    }

  1. 在onRestoreInstanceState中恢復

    Bundle一定有值貌笨,不需要判斷是否為空,是官方推薦的恢復數(shù)據(jù)的方法

//利用onRestoreInstanceState 
@Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
      
        String test = savedInstanceState.getString("extra_test");
        Log.d(TAG, "[onRestoreInstanceState]restore extra_test:" + test);
    }
2.1.2.2 系統(tǒng)配置變化導致的異常

Q1:發(fā)生改變的系統(tǒng)配置通常有哪些襟沮?

  • locale:一般指切換了系統(tǒng)語言
  • orientation:旋轉屏幕
  • keyboardHidden:鍵盤的可訪問性發(fā)生變化锥惋,比如:調出鍵盤

Q2:想系統(tǒng)配置改變后,activity不被重新創(chuàng)建开伏,應該怎么辦膀跌?

ActivityManifest.xml中,對應的ActivityconfigChanges屬性中指定該選項

        <activity
            android:name="com.ryg.chapter_1.MainActivity"
            android:configChanges="orientation|screenSize"  
            android:label="@string/app_name"
            android:launchMode="standard" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
2.1.2.3 資源內存不足導致的異常

這種情況應該很容易理解固灵,類比于:當使用小內存手機的時候捅伤,會發(fā)現(xiàn)某些應用經常一切換后臺,就會自動關閉了巫玻,原理也是資源內存不足丛忆,被系統(tǒng)自動回收了。

Q1:Activity的優(yōu)先級排序是什么大审?

由上到下蘸际,優(yōu)先級由高到低

  • 前臺Activity--正在和用戶交互
  • 可見非前臺Activity--比如說,彈出新的對話框徒扶,對話框后面的Activity即屬于可見非前臺Activity
  • 后臺Activity--已經被停止的Activity

Q2:怎么提高后臺工作的優(yōu)先級呢?

將后臺工作放入Service中根穷,保證進程有一定的優(yōu)先級

2.1.3 Fragment的生命周期

因為本篇是Activity篇姜骡,筆者不便大費周章地敘述,為了滿足求知欲強的讀者屿良,筆者特地推薦一篇:Fragment生命周期圈澈,里面寫得非常詳細


2.2 Activity啟動模式

2.2.1 Activity的四種啟動模式

a:standard:標準模式

  • 含義:每次啟動一個Activity就會創(chuàng)建一個新的實例,而不管實例存在與否尘惧。
  • 注意:使用ApplicationContext去啟動standard模式Activity就會報錯康栈。因為standard模式的Activity會默認進入啟動它所屬的任務棧,但是由于非Activity的Context沒有所謂的任務棧喷橙,所以就會報錯啥么。

b:singleTop:棧頂復用模式

  • 含義:如果新Activity已經位于任務棧的棧頂,就不會重新創(chuàng)建贰逾,并回調onNewIntent(intent)方法悬荣。

c:singleTask:棧內復用模式

  • 含義:只要Activity在一個棧中存在,都不會重新創(chuàng)建疙剑,并回調onNewIntent(intent)方法氯迂。如果不存在践叠,系統(tǒng)會先尋找是否存在需要的棧,如果不存在該棧嚼蚀,就創(chuàng)建一個任務棧禁灼,并把該Activity放進去;如果存在轿曙,就會查看棧中是否有實例存在弄捕,若實例存在,則將實例調到棧頂拳芙,并回調onNewIntent(intent)方法察藐,否則創(chuàng)建實例到已經存在的棧中。

d:singleInstance:單實例模式

  • 含義: 具有此模式的Activity只能單獨位于一個任務棧中舟扎,且此任務棧中只有唯一一個實例分飞。

標識Activity任務棧名稱的屬性:android:taskAffinity,默認為應用包名睹限。

2.2.2 Activity的Flags

Flags有很多譬猫,這里介紹幾個常用的Flags

  • FLAG_ACTIVITY_NEW_TASK:指定singleTask模式
  • FLAG_ACTIVITY_SINGLE_TOP:指定singleTop模式
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:指定新的Activity不會出現(xiàn)在最近啟動的Activity的列表中

2.3 IntentFilter的匹配規(guī)則

原則:

  • 一個intent只有同時匹配某個Activity的intent-filter中的actioncategory羡疗、data才算完全匹配染服,才能啟動該Activity。
  • 一個Activity可以有多個intent-filter叨恨,一個 intent只要成功匹配任意一組 intent-filter柳刮,就可以啟動該Activity。

Q1:action的匹配規(guī)則

  • 只要Intent中的存在一個action且能夠和任何一個 intent-filter中的action相同即可成功匹配
  • 區(qū)分大小寫
  • 必須存在

Q2:category的匹配規(guī)則

  • 有其他category痒钝,則要求intent中的category和intent-filter中的所有category 相同秉颗。
  • 非必須,這是因為此時系統(tǒng)給該Activity 默認加上了< category android:name="android.intent.category.DEAFAULT" />屬性值送矩。

Q3:data匹配規(guī)則

  • 類似于action
  • URI非必須指定蚕甥,默認值為contentfile

需要注意的是,為Intent指定完整的data的時候栋荸,要調用setDataAndType(URI,mimeType)方法

intent.setDataAndType(Uri.parse("file://abc"),"video/png");

采用隱式方式啟動Activity時菇怀,可以用PackageManagerresolveActivity(Intent)方法或者IntentresolveActivity(Intent)方法,來判斷是否有Activity匹配該隱式Intent,如果匹配不到晌块,會返回NULL

三.課堂小測試

恭喜你爱沟,已經看完了前面的文章,相信你對Activity已經有一定深度的了解摸袁,下面钥顽,進行一下課堂小測試,驗證一下自己的學習成果吧靠汁!

  • 題目情景:有三個Activity蜂大,分別名為A,B,C闽铐,A的啟動模式是standardBC的啟動模式是singleTask,現(xiàn)在進行如下操作:A啟動了B奶浦,B啟動了C兄墅,C啟動了A,A再啟動B澳叉,現(xiàn)在連按2次BACK隙咸,你看到的是哪個Activity

  • 答案揭曉:回到桌面成洗,具體過程可以參考下面的流程圖

    流程圖

如果文章對您有一點幫助的話五督,希望您能點一下贊,您的點贊瓶殃,是我前進的動力

本文參考鏈接:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末充包,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子遥椿,更是在濱河造成了極大的恐慌基矮,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冠场,死亡現(xiàn)場離奇詭異家浇,居然都是意外死亡,警方通過查閱死者的電腦和手機碴裙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門钢悲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舔株,你說我怎么就攤上這事譬巫。” “怎么了督笆?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诱贿。 經常有香客問我娃肿,道長,這世上最難降的妖魔是什么珠十? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任料扰,我火速辦了婚禮,結果婚禮上焙蹭,老公的妹妹穿的比我還像新娘晒杈。我一直安慰自己,他們只是感情好孔厉,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布拯钻。 她就那樣靜靜地躺著帖努,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粪般。 梳的紋絲不亂的頭發(fā)上拼余,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音亩歹,去河邊找鬼匙监。 笑死,一個胖子當著我的面吹牛小作,可吹牛的內容都是我干的亭姥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼顾稀,長吁一口氣:“原來是場噩夢啊……” “哼达罗!你這毒婦竟也來了?” 一聲冷哼從身側響起础拨,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤氮块,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后诡宗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滔蝉,經...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年塔沃,在試婚紗的時候發(fā)現(xiàn)自己被綠了蝠引。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛀柴,死狀恐怖螃概,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情鸽疾,我是刑警寧澤吊洼,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站制肮,受9級特大地震影響冒窍,放射性物質發(fā)生泄漏。R本人自食惡果不足惜豺鼻,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一综液、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧儒飒,春花似錦谬莹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽埠戳。三九已至,卻和暖如春士葫,著一層夾襖步出監(jiān)牢的瞬間乞而,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工慢显, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留庄新,地道東北人峡继。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親莉钙。 傳聞我的和親對象是個殘疾皇子秃殉,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內容