1.1 是什么
安卓應(yīng)用程序的主要組件之一,用于與用戶交互并完成某些任務(wù)。app的主要功能模塊往往由幾個松耦合的activity組成。
1.2 使用姿勢
- 繼承Activity或其子類,實現(xiàn)需要的生命周期的回調(diào)方法;
- 在
manifest文件中聲明:
<activity
android:name=".activity.ExtraToolActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait"/>
1.2.1 啟動與回收
1.2.1.1 launcher啟動
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
1.2.1.2 顯式調(diào)用
調(diào)用startActivity(params)方法。
1.2.1.3 隱式調(diào)用
IntentFilter匹配
IntentFilter中的過濾信息有action、category、data三種匹配信息。三類同時匹配成功才能啟動Activity。
action匹配:匹配任意一個,區(qū)分大小寫。
category匹配:Intent中所有category都必須在過濾列表中找到匹配。沒寫category就是默認(rèn)的android.intent.category.DEFAULT。
data匹配:data中有scheme、host、port、path、pathPattern、pathPreffix、mimeType等屬性。匹配規(guī)則是必須有data數(shù)據(jù)且在過濾列表中完全匹配。且必須有scheme屬性(image/*和text/*類型默認(rèn)為content和file)。
任何啟動方式都需要先在manifest文件聲明activity。
1.2.2 模塊間通信
Intent通信。包括startActivityForResult(params)。
EventBus通信。
1.3 生命周期


狀態(tài)的變更和保存
狀態(tài)變更的時機(jī):
- 主動點擊回退。
onPause->onStop->onDestroy->onCreate->onStart->onResume - Home鍵返回首頁。
onPause—>onSaveInstanceState(Bundle)(不保證被調(diào)用)->onStop—->onRestart——>onStart—–>onResume - activity被意外銷毀時。比如內(nèi)存不足。
- 旋轉(zhuǎn)屏幕。
app轉(zhuǎn)屏?xí)r的生命周期:onCreate->onStart->onResume-> Running 轉(zhuǎn)屏 ->onPause->onSaveInstanceState(Bundle)->onStop->onDestroy->onCreate->onStart->onRestoreInstanceState(Bundle)->onResume
onCreate(Bundle)和onSaveInstanceState(Bundle)取得的是相同的參數(shù)。
onSaveInstanceState一定在onStop之前調(diào)用,但是不確定是否在onPause之前。
ui狀態(tài)的保存
onSaveInstanceState和onRestoreInstanceState分別用于保存、恢復(fù)組件狀態(tài)。
onSaveInstanceState的默認(rèn)實現(xiàn)會自動為有android:id的ui組件保存狀態(tài),底層用Parcerable和Bundle。
存在不需要保存狀態(tài)的情況(比如用戶主動點擊返回鍵),onSaveInstanceState不保證一定被調(diào)用。
持久性數(shù)據(jù)的保存
onSaveInstanceState不穩(wěn)定,可以在onPause()中將有必要的數(shù)據(jù)保存到數(shù)據(jù)庫等。
使用Fragment保存數(shù)據(jù)
Bundle并非設(shè)計來攜帶大型對象(比如位圖),而且其中數(shù)據(jù)必須先序列化再反序列化會消耗大量系統(tǒng)資源。因此可以用Fragment保存數(shù)據(jù),減輕Activity的負(fù)擔(dān)。
因設(shè)備配置改變,造成activity被銷毀的情況下(比如旋轉(zhuǎn)屏幕),設(shè)置了setRetainInstance(true)的Fragment會被保留下來

android:configChanges
android:configChanges="xxx"屬性,常用的主要有下面三個選項:
local:設(shè)備的本地位置發(fā)生了變化,一般指切換了系統(tǒng)語言;
keyboardHidden:鍵盤的可訪問性發(fā)生了變化,比如用戶調(diào)出了鍵盤;
orientation:屏幕方向發(fā)生了變化,比如旋轉(zhuǎn)了手機(jī)屏幕。
配置了android:configChanges="xxx"屬性之后,Activity就不會在對應(yīng)變化發(fā)生時重新創(chuàng)建,而是調(diào)用Activity的onConfigurationChanged方法。
1.4 啟動模式
standard
每次啟動創(chuàng)建新的實例。
新啟動的activity屬于啟動它的任務(wù)棧。singleTop棧頂復(fù)用模式
只會復(fù)用棧頂?shù)膶嵗?/strong>
啟動的activity如果在棧頂,則復(fù)用它并回調(diào)onNewIntent(Bundle)。
啟動的activity如果在棧中有實例,但是不在棧頂,會新建一個實例(同standard)。
其他情況同standard。singleTask棧內(nèi)復(fù)用
啟東時去對應(yīng)的棧內(nèi)尋找實例,找到則復(fù)用并回調(diào)onNewIntent,并將之上的activity全部出棧。
棧內(nèi)找不到則新建實例。
找不到棧則創(chuàng)建任務(wù)棧。
不同應(yīng)用的activity可以被指定到同一個棧中,只要設(shè)置相同的android:taskAffinity。singleInstance單例模式
啟動時會新建特殊的任務(wù)棧并將activity入棧,復(fù)用時回調(diào)onNewIntent。
ActivityInfo的taskAffinity屬性
1.標(biāo)識一個Activity的任務(wù)棧名,默認(rèn)所有任務(wù)棧名為應(yīng)用包名;
2.任務(wù)的affinity取決于其root activity的taskAffinity;
3.可以在manifest為Activity單獨指定taskAffinity,相同的為同一任務(wù)棧,為空則不屬于任何任務(wù)棧。
1.5 場景用例
singleTop適用于展示消息通知等。
singleTask適用于程序主頁等,也可以用于搜索頁。
singleInstance適用于完全獨立的頁面。
1.6 啟動流程源碼分析
略
參考文章
activity狀態(tài)
澤毛-Activity 知識梳理(3) - Activity狀態(tài)保存和恢復(fù)
一大三千-Android學(xué)習(xí)之保存 Activity 的狀態(tài)
暗暗笑-Activity : 狀態(tài)保存與恢復(fù)
jxq1994-Activity狀態(tài)的幾種保存方法
Hujiawei-Art of Android Development Reading Notes 1