Android四大組件(Activity)

四大組件分別是:Activity、Service、ContentProvider、BroadcastReceiver

1. Activity

作用:界面顯示捂蕴,與用戶交互

一個(gè)Activity為一個(gè)單獨(dú)的界面(窗口)
Activity之間通過(guò)Intent通信
每個(gè)Activity都需要在AndroidManifest文件中注冊(cè)

生命周期

Activity生命周期
方法 詳解
onCreate activity開(kāi)始創(chuàng)建時(shí)調(diào)用 使用場(chǎng)景
onStart activity被啟動(dòng)時(shí)調(diào)用 頁(yè)面初始化
onResume 1. 界面首次啟動(dòng)完成,前端展示 2. activity被彈框遮蓋闪幽,失去焦點(diǎn),處于onPause涡匀,再次回到前臺(tái)展示頁(yè)可交互狀態(tài)時(shí) 數(shù)據(jù)恢復(fù)&展示
onPause Activity失去焦點(diǎn)盯腌,仍可見(jiàn)(例如:彈框遮蓋) 數(shù)據(jù)存儲(chǔ)、停止動(dòng)畫(huà)陨瘩、注銷廣播(不能處理耗時(shí)任務(wù))
onStop activity不可見(jiàn)狀態(tài)腕够,頁(yè)面跳轉(zhuǎn)后 數(shù)據(jù)恢復(fù)
onDestroy Activity即將被銷毀 回收、資源釋放

注意:經(jīng)測(cè)試舌劳,onPause()方法在彈出Dialog時(shí)不會(huì)被調(diào)用帚湘,而在被另一個(gè)透明或者Dialog樣式的Activity覆蓋時(shí)才會(huì)被調(diào)用。

引申問(wèn)題:
a. 啟動(dòng)頁(yè)面A—>跳轉(zhuǎn)到頁(yè)面B—>B返回頁(yè)面A甚淡,兩個(gè)頁(yè)面生命周期的變化
答:
A跳轉(zhuǎn)B
onCreate(A)—>onStart(A)—>onResume(A)—>onPause(A)—>onCreate(B)
—>onStart(B)—>onResume(B)—>onStop(A)
B返回A:
onPause(B)—>onRestart(A)—>onStart(A)—>onResume(A)—>onStop(B)—>onDeatory(B)
注意:大诸,如果B是透明的Activity則不會(huì)調(diào)用A的onStop(),B是對(duì)話框則不會(huì)調(diào)用A的onPause()和onStop()
b. 當(dāng)前Activity為A贯卦,此時(shí)用戶打開(kāi)ActivityB后资柔,那么A的onPause()和B的onResume()哪個(gè)方法先執(zhí)行?
答:先 A的onPause() 撵割,再B的onResume()
Activity的啟動(dòng)過(guò)程:由ActivityManagerService(AMS)對(duì)棧內(nèi)的Activity狀態(tài)進(jìn)行同步管理 & 規(guī)定:新Activity啟動(dòng)前贿堰,棧頂?shù)腁ctivity必須先onPause(),才能啟動(dòng)新的Activity(執(zhí)行onResume())

四種啟動(dòng)模式

通常我們能夠直接在 AndroidManifest.xml 文件里面的 <activity> 標(biāo)簽中使用一個(gè)屬性指定啟動(dòng)模式啡彬,如:

<activity
    android:name=".SingleTaskActivity"
    android:label="singleTask launchMode"
    android:launchMode="singleTask"/>

啟動(dòng)模式共包含四種:Standard羹与、SingleTop故硅、SingleTask、SingleInstance纵搁,下面我們來(lái)一一詳解
standard
標(biāo)準(zhǔn)模式(默認(rèn)的啟動(dòng)模式)吃衅,每次激活A(yù)ctivity時(shí)(startActivity),都創(chuàng)建新的Activity實(shí)例诡渴,并放入任務(wù)棧的棧頂捐晶;
singleTop
棧頂模式,singleTop 模式的 Activity 表現(xiàn)形式與 standard 很像妄辩,多數(shù)情況下 Activity 實(shí)例會(huì)按照我們想要的樣子那樣被創(chuàng)建惑灵。唯一不同的是,如果在調(diào)用者 Task 棧頂已經(jīng)存在有一個(gè)相同類型的 Activity 實(shí)例的話眼耀,將不會(huì)創(chuàng)建新的 Activity英支,取而代之的是通過(guò) onNewIntent() 方法將 Intent 發(fā)送至這個(gè)已經(jīng)存在的 Activity 實(shí)例中。

使用 singleTop 模式時(shí)哮伟,你必須同時(shí)在 onCreate()onNewIntent() 方法中接受處理發(fā)送而來(lái)的 Intent 數(shù)據(jù)干花,以應(yīng)對(duì)所有使用場(chǎng)景。

這種模式的使用案例之一便是搜索功能楞黄。想象一下池凄,創(chuàng)建一個(gè)能夠跳轉(zhuǎn)至一個(gè)展示搜索結(jié)果的 SearchActivity 的搜索框。為了擁有更好的用戶體驗(yàn)鬼廓,通常我們會(huì)在搜索結(jié)果頁(yè)面也放置一個(gè)搜索框肿仑,使用戶在不需要按返回鍵的情況下搜索其他關(guān)鍵字。

現(xiàn)在設(shè)想一下碎税,如果我們每一次都啟動(dòng)一個(gè)新的 SearchActivity 來(lái)展示新的搜索結(jié)果尤慰,10 次搜索便產(chǎn)生 10 個(gè)新的 Activities。當(dāng)你按返回鍵的時(shí)候雷蹂,就會(huì)顯得非常奇怪伟端。因?yàn)槟悴坏貌话?10 次返回鍵來(lái)跳過(guò)這些搜索結(jié)果頁(yè)面從而返回至你前面的 Activity。

相反的匪煌,如果在棧頂有一個(gè) SearchActivity 的話责蝠,更好的做法是我們發(fā)送一個(gè) Intent 到已經(jīng)存在的 Activity 實(shí)例并讓它更新搜索結(jié)果。現(xiàn)在只有一個(gè) SearchActivity 位于棧頂萎庭,你只需要按一次返回鍵就能回到之前的 Activity玛歌。這顯然更有意義。

然而擎椰,singleTop 模式僅僅在與調(diào)用者相同的 task 中起作用支子。如果你希望一個(gè) Intent 被發(fā)送至另一個(gè) Task 里面的已經(jīng)存在的棧頂 Activity 的話,我不得不失望地告訴你這種方式并不奏效达舒。啟動(dòng) singleTop Activity 的 Intent 來(lái)自另一個(gè)應(yīng)用程序時(shí)值朋,一個(gè)新的 Activity 會(huì)被啟動(dòng)叹侄,就像 standard 模式那樣(5.0 以前:放置在調(diào)用者 Task 的棧頂,5.0 開(kāi)始:創(chuàng)建一個(gè)新的 Task)昨登。

singleTask
這種模式與 standard 和 singleTop 截然不同趾代。擁有 singleTask 啟動(dòng)模式的 Activity 在系統(tǒng)中只允許存在一個(gè)實(shí)例(有點(diǎn)像單例)。如果系統(tǒng)中已經(jīng)有一個(gè) Activity 實(shí)例的話丰辣,擁有該實(shí)例的 Task 將被移到頂部撒强,并且 Intent 將通過(guò) onNewIntent() 方法傳遞過(guò)來(lái)。如果沒(méi)有笙什,新的 Activity 將被創(chuàng)建并放在對(duì)應(yīng)的 Task 中飘哨。

singleTask啟動(dòng)模式啟動(dòng)Activity時(shí),首先會(huì)根據(jù)taskAffinity去尋找當(dāng)前是否存在一個(gè)對(duì)應(yīng)名字的任務(wù)棧

  • 如果不存在琐凭,則會(huì)創(chuàng)建一個(gè)新的Task芽隆,并創(chuàng)建新的Activity實(shí)例入棧到新創(chuàng)建的Task中去
  • 如果存在,則得到該任務(wù)棧统屈,查找該任務(wù)棧中是否存在該Activity實(shí)例
    如果存在實(shí)例胚吁,則將它上面的Activity實(shí)例都出棧,然后回調(diào)啟動(dòng)的Activity實(shí)例的onNewIntent方法
    如果不存在該實(shí)例愁憔,則新建Activity腕扶,并入棧
  • 此外,我們可以將兩個(gè)不同App中的Activity設(shè)置為相同的taskAffinity吨掌,這樣雖然在不同的應(yīng)用中蕉毯,但是Activity會(huì)被分配到同一個(gè)Task中去。

singleInstance

如果這種模式很接近 singleTask思犁,只允許系統(tǒng)中存在一個(gè) Activity 實(shí)例。如果使用這種模式的 Activity 打開(kāi)另一個(gè) Activity进肯,系統(tǒng)將自動(dòng)創(chuàng)建一個(gè)新的 Task 來(lái)容納新的 Activity

一旦該模式的Activity被創(chuàng)建激蹲,任何應(yīng)用激活改Activity都會(huì)重用該棧中的Activity實(shí)例(即多應(yīng)用共享該棧中的Activity實(shí)例)

卡頓原因


關(guān)于內(nèi)存泄漏 & 性能優(yōu)化,請(qǐng)看系列文章:
Android性能優(yōu)化:這是一份全面&詳細(xì)的內(nèi)存優(yōu)化指南
Android性能優(yōu)化:手把手帶你全面了解 內(nèi)存泄露 & 解決方案
Android性能優(yōu)化:那些關(guān)于Bitmap圖片資源優(yōu)化的小事
Android性能優(yōu)化:手把手帶你全面了解 繪制優(yōu)化
Android性能優(yōu)化:布局優(yōu)化 詳細(xì)解析(含江掩、講解 )

Activity啟動(dòng)加速

緩存方式(狀態(tài)緩存)


參考鏈接:
http://blog.csdn.net/sbsujjbcy/article/details/49360615
https://juejin.cn/post/6844903684057350158
demo示例代碼:https://github.com/shan1231/Shan_AndroidStudy

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末学辱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子环形,更是在濱河造成了極大的恐慌策泣,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抬吟,死亡現(xiàn)場(chǎng)離奇詭異萨咕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)火本,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門危队,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)聪建,“玉大人,你說(shuō)我怎么就攤上這事茫陆〗痿铮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵簿盅,是天一觀的道長(zhǎng)挥下。 經(jīng)常有香客問(wèn)我,道長(zhǎng)桨醋,這世上最難降的妖魔是什么棚瘟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮讨盒,結(jié)果婚禮上解取,老公的妹妹穿的比我還像新娘。我一直安慰自己返顺,他們只是感情好禀苦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著遂鹊,像睡著了一般振乏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秉扑,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天慧邮,我揣著相機(jī)與錄音,去河邊找鬼舟陆。 笑死误澳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秦躯。 我是一名探鬼主播忆谓,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼踱承!你這毒婦竟也來(lái)了倡缠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茎活,失蹤者是張志新(化名)和其女友劉穎昙沦,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體载荔,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盾饮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丐谋。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芍碧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出号俐,到底是詐尸還是另有隱情泌豆,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布吏饿,位于F島的核電站踪危,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏猪落。R本人自食惡果不足惜贞远,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望笨忌。 院中可真熱鬧蓝仲,春花似錦、人聲如沸官疲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)途凫。三九已至垢夹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間维费,已是汗流浹背果元。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留犀盟,地道東北人而晒。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像阅畴,于是被迫代替她去往敵國(guó)和親倡怎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355