1.activity共有4個狀態
如下圖所示:

運行狀態
如果一個活動位于螢屏的前臺(可見的),那么它就是活動的或正在運行的,
暫停狀態
如果一個活動失去了焦點,但仍然可見(也就是說,一個新的非全尺寸或透明的活動將焦點放在了活動的頂部),那么它將被暫停,暫停的活動是完全活動的(它維護所有狀態和成員資訊,并保持與視窗管理器的連接),但是在記憶體極低的情況下,系統可能會終止它,
比如:當前APP出現一個非全尺寸的對話框
停止狀態
如果一個活動完全被另一個活動遮擋住了,它就會被停止,它仍然保留所有的狀態和成員資訊,但是,它對用戶來說不再可見,所以它的視窗是隱藏的,當在其他地方需要記憶體時,會被系統殺死,
比如:APP在后臺運行
銷毀狀態
activity被系統殺死或者呼叫finish方法主動退出
可以重寫的方法有:
- onStart() : 當onCreate()之后,會呼叫該方法
- onResume() : 當onStart ()之后或者取消暫停后,會呼叫該方法
- onRestart() : 當取消停止后,會呼叫該方法
- onPause() : 當另個非全尺寸或透明的活動將焦點放在了活動的頂部,那么該活動就會進入暫停狀態,然后呼叫該方法
- onStop() : 當前活動被另個活動完全覆寫后(比如有人打電話過來),那么該活動就會進入停止狀態,然后呼叫該方法,一般在這個方法中停止所有關于重繪界面的操作.
- onDestroy() : activity被系統殺死或者呼叫finish方法主動退出,那么會呼叫該方法, 一般在這個方法中用于釋放資源,
2.activity啟動模式
在Android開發中,如果我們通過一個按鈕重復打開5個相同的activity的話, 系統就會創建多個實體并把它們放入任務堆疊中,然后我們點擊回傳鍵時,當前正在顯示的activity(堆疊頂的實體)則會出堆疊,然后顯示之前入堆疊的實體,要退出的話,必須也要點擊5個相同的回傳鍵. 這樣其實非常耗資源,并且每個相同的activity都是獨立的實體(資料分開的),會給用戶帶來困擾,為了了解決這一問題,Android為Actiivty提供了啟動模式launchMode
啟動模式launchMode
Activity的啟動模式有四種:standard(系統默認的模式)、singleTop、singleTask和singleInstance,如下圖所示:

2.1 standard標準模式
系統默認的模式,配置該模式的activity不管在任務堆疊中是否已存在,都會創建出來.
比如:我們通過一個按鈕重復打開5個相同的activity的話,那么退出的話,必須也要點擊5個相同的回傳鍵.因為每個相同的activity都是獨立的.
Manifest中配置如下:
android:launchMode=”standard” //可以不寫,因為默認就是standard模式,
2.2 singleTop堆疊頂單獨模式
在堆疊頂只能擁有唯一的實體,使用該模式的話,如果當前要啟動的activity是堆疊頂的activity,那么就不會被創建,并且不發生任何變化.
比如:我們在當前MainActivity中通過按鈕重復打開第二個MainActivity,系統就會檢測到當前堆疊頂正在運行的activity實體等于要打開的activity實體,就不會創建實體.
如果我們打開的順序是MainActivity->SecondActivity->MainActivity(堆疊頂,當前正在顯示的界面),則這3個實體會正常的創建出來.
Manifest中配置如下:
android:launchMode=" singleTop"
用于該模式的常見activity比如有: 二維碼掃碼界面activity(避免打開多個相同界面)
2.3 singleTask單獨實體模式
在堆疊中只能擁有唯一實體,創建使用該模式的activity的實體之前,會自動在任務堆疊中匹配實體,如果之前未創建,那么就在堆疊頂創建一個實體,如果已存在,那么會將它上面的其它所有activity全部出堆疊, 然后顯示當前已經創建的activity,并且會回呼該實體的onNewIntent()方法,
比如:
我們設定MainActivity為singleTask模式
SecondActivity為standard默認模式
然后打開的順序是MainActivity->SecondActivity->SecondActivity->SecondActivity(堆疊頂,當前正在顯示的界面),
接下來我們再次打開MainActivity,由于MainActivity為singleTask,那么系統就會將它上面的其它所有activity全部出堆疊,所以就變成了: MainActivity(堆疊頂,當前正在顯示的界面),這時點擊回傳鍵的話,那么就直接退出到桌面了.
Manifest中配置如下:
android:launchMode="singleTask"
用于該模式的常見activity比如有:主界面activity
2.4 singleInstance單例模式
該模式比較特殊,創建使用該模式的activity的實體會自動占用一個獨立任務堆疊, 具有全域唯一性,如果我們要創建的activity已存在,那么就會顯示當前已經創建的activity.
比如:
我們設定MainActivity為standard默認模式、SecondActivity為singleInstance模式
然后打開的順序是MainActivity->SecondActivity (堆疊頂,當前正在顯示的界面),
接下來我們再次打開MainActivity,由于MainActivity和SecondActivity是分開的任務堆疊,所以這次激活的是MainActivity所在的任務堆疊,那么SecondActivity獨立任務堆疊就會被壓在最下面,所以就變成了:
SecondActivity-> MainActivity (最開始的界面)-> MainActivity (堆疊頂,當前正在顯示的界面).
Manifest中配置如下:
android:launchMode="singleInstance"
用于該模式的常見activity比如有:瀏覽器界面activity(任何界面都可以去呼叫它訪問網頁)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/28355.html
標籤:Android
上一篇:Glide原始碼決議一,初始化
下一篇:微信公眾號清除記憶體快取
