一、任務(wù)和返回棧
1-Task
- 任務(wù)
- 是指在執(zhí)行特定作業(yè)時與用戶交互的一系列 Activity.
2-Back Stack
- 返回棧
- 組成任務(wù)的這些Activity按照各自的打開順序排列在堆棧中.
3-Task與backstack的關(guān)系
- 系統(tǒng)中會存在多個Task, 多個Back Stack.
- 其中一個Back Stack中可以有多個Task.
- Task可以理解為一次交互的Activities的組合(一般來說一個Application的所有Activity運行在一個Task).
- Back Stack可以理解為從Launcher界面進入某一個應(yīng)用開始交互, 可能有很多操作, 這些操作可能分成不同任務(wù)的, 例如在編輯聯(lián)系人的時候跳轉(zhuǎn)到相冊了, 可能新啟了一個Task, 但是這整個交互流程都在一個Back Stack.
? 簡單來說, 個人理解, Back Stack的重點是在Back, 就是說同一Stack的Activity是可以一直返回的.
二、Activity之launchMode
有四種(standard, singleTop, singleTask, singleInstance), 默認standard.
2.1 Standard
默認的啟動模式,即標(biāo)準(zhǔn)模式。每次啟動一個Activity都會重寫創(chuàng)建一個新的實例,誰啟動了該模式的Activity,該Activity就屬于啟動它的Activity的任務(wù)棧中。這個Activity它的onCreate(),onStart(),onResume()方法都會被調(diào)用。
<activity android:name=".standard.StandardActivity" android:launchMode="standard" >
2.2 singleTop --棧頂復(fù)用模式
如果新的activity已經(jīng)位于棧頂,那么這個Activity不會被重寫創(chuàng)建,同時它的onNewIntent方法會被調(diào)用,通過此方法的參數(shù)我們可以去除當(dāng)前請求的信息。(先onPause, 然后onNewIntent喚起, 走onResume.)
如果棧頂不存在該Activity的實例,則情況與standard模式相同。
2.3 singleTask--棧內(nèi)復(fù)用模式
singleTask啟動模式啟動Activity時,首先會根據(jù)taskAffinity去尋找當(dāng)前是否存在一個對應(yīng)名字的任務(wù)棧
如果不存在,則會創(chuàng)建一個新的Task,并創(chuàng)建新的Activity實例入棧到新創(chuàng)建的Task中去
如果存在,則得到該任務(wù)棧,查找該任務(wù)棧中是否存在該Activity實例
如果存在實例,則將它上面的Activity實例都出棧,然后回調(diào)啟動的Activity實例的onNewIntent方法 (復(fù)用的, onNewIntent喚起, 走的onRestart流程.)
如果不存在該實例,則新建Activity,并入棧
此外,我們可以將兩個不同App中的Activity設(shè)置為相同的taskAffinity,這樣雖然在不同的應(yīng)用中,但是Activity會被分配到同一個Task中去
2.4 singleInstance--全局唯一模式
具備singleTask模式的所有特性外,這種模式下的Activity會單獨占用一個Task棧,具有全局唯一性,即整個系統(tǒng)中就這么一個實例,由于棧內(nèi)復(fù)用的特性,后續(xù)的請求均不會創(chuàng)建新的Activity實例,除非這個特殊的任務(wù)棧被銷毀了。以singleInstance模式啟動的Activity在整個系統(tǒng)中是單例的,如果在啟動這樣的Activiyt時,已經(jīng)存在了一個實例,那么會把它所在的任務(wù)調(diào)度到前臺,重用這個實例。
(A是復(fù)用的, 這個時候如果一直按Back鍵返回, 不會再看到A了)
三、生命周期
3.1 生命周期
當(dāng)Activity從一種狀態(tài)轉(zhuǎn)變到另一種狀態(tài)時,會調(diào)用其生命周期方法。Activity一共有七個生命周期方法,
- void onCreate() 設(shè)置布局以及進行初始化操作
- void onStart() 可見, 但不可交互
- void onRestart() 調(diào)用onStart()
- void onResume() 可見, 可交互
- void onPause() 部分可見, 不可交互
- void onStop() 完全不可見
- void onDestroy() 銷毀
注意:指定Activity以對話框的形式顯示, 需在activity節(jié)點追加以下主題android:theme="@android:style/Theme.Dialog"
3.2 Activity有三種狀態(tài):
- 當(dāng)它在屏幕前臺時,響應(yīng)用戶操作的Activity, 它是激活或運行狀態(tài)
- 當(dāng)它上面有另外一個Activity,使它失去了焦點但仍然對用戶可見時, 它處于暫停狀態(tài)。
- 當(dāng)它完全被另一個Activity覆蓋時則處于停止?fàn)顟B(tài)。
3.3 橫豎屏切換問題
橫豎屏切換時,默認情況下會把activity先銷毀再創(chuàng)建
不讓Activity在橫豎屏切換時銷毀,只需要在清單文件聲明Activity時配置<activity>節(jié)點的幾個屬性即可,其方式如下:
4.0以下版本:
android:configChanges="orientation|keyboardHidden"
4.0以上版本:
android:configChanges="orientation|screenSize"
兼容所有版本
android:configChanges="orientation|keyboardHidden|screenSize"
configChange="orientation" 屏幕方向改變:不讓屏幕在切換時重新創(chuàng)建activity。sreensize 屏幕大小,keyboardHidden是軟鍵盤,如果切換屏幕,軟鍵盤會去判斷屏幕大小是否合適顯示軟鍵盤,在判斷過程中會重啟activity。
禁止橫豎屏:screenOrientation="" 指定屏幕固定方向,不會隨著屏幕旋轉(zhuǎn)而旋轉(zhuǎn),
- landscape橫屏(旋轉(zhuǎn)以后順時針旋轉(zhuǎn)90度,還是橫屏)
- portrait豎屏, 旋 轉(zhuǎn)以后逆時針旋轉(zhuǎn)90度,還是豎屏。
- sensorLandscape:根據(jù)手機左右倒,而橫屏旋轉(zhuǎn),
- sensor:上左右三個方向。
3.5 dialog
activity,彈出對話框時,生命周期方法:onpause()、onResume()方法不會執(zhí)行。因為對話框是activity的一部分。 所以,構(gòu)造對話框的Builder(context),這個context是指定這個對話框掛載在哪個activity上。
activity的聲明周期比較
正常activity啟動的
onPause--onStop--onRestart--onStart--onResume
設(shè)置thme<item name="android:windowIsTranslucent">true</item>
onPause--onResume
a啟動 啟動b
A: onCreate
A: onStart
A: onResume
A: onPause
B: onCreate
B: onStart
B: onResume
A: onStop
返回鍵
B: onPause
A: onStart
A: onResume
B: onStop
B: onDestroy