四大組件分別是:Activity、Service、ContentProvider、BroadcastReceiver
1. Activity
作用:界面顯示捂蕴,與用戶交互
一個(gè)Activity為一個(gè)單獨(dú)的界面(窗口)
Activity之間通過(guò)Intent通信
每個(gè)Activity都需要在AndroidManifest文件中注冊(cè)
生命周期
方法 | 詳解 | |
---|---|---|
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