Android Activity的生命周期與加載模式超詳細(xì)圖文解析
Activity的生命周期
Activity是安卓應(yīng)用的重要組成單元之一,其對于安卓的作用類似于Servlet對于Web應(yīng)用的作用。
整個(gè)Activity生命周期的圖解如下

具體的生命周期可以總結(jié)成如下幾個(gè)步驟
onCreate():Activity啟動后第一個(gè)被調(diào)用的函數(shù),常用來進(jìn)行Activity的初始化,如創(chuàng)建View,綁定數(shù)據(jù)和恢復(fù)數(shù)據(jù)。
onStart():當(dāng)Activity顯示在屏幕上時(shí),函數(shù)被調(diào)用。
onRestart():Activity從停止?fàn)顟B(tài)進(jìn)入活動狀態(tài)是調(diào)用。
onResume():Activity可以接受用戶輸入時(shí),該函數(shù)被調(diào)用,此時(shí)的activity位于activity棧的棧頂。
onPause():當(dāng)Activity進(jìn)入暫停狀態(tài)時(shí),該函數(shù)被調(diào)用,一般用來保存持久的數(shù)據(jù)或釋放占用的資源。
onStop():當(dāng)Activity變?yōu)椴豢梢姾?,該函?shù)被調(diào)用,Activity進(jìn)入停止?fàn)顟B(tài)。
onDestroy():在Activity被終止前,被調(diào)用。
歸納起來,Activity大概會經(jīng)歷四種狀態(tài)
運(yùn)行狀態(tài):當(dāng)前Activity位于前臺,用戶可見,可以獲得焦點(diǎn)
暫停狀態(tài):其他Activity位于前臺,該Activity依然可見,只是不能獲得焦點(diǎn)
停止?fàn)顟B(tài):該Activity不可見,失去焦點(diǎn)
銷毀狀態(tài):該Activity結(jié)束,或Activity所在的進(jìn)程被結(jié)束
我們使用給一個(gè)程序來看一下看一下Activity的生命周期。程序非常簡單,就是定義兩個(gè)Activity,分別命名為FirstActivity和SecondActivity,先從FirstActivity跳轉(zhuǎn)到SecondActivity,然后再在SecondActivity銷毀該Activity,最后銷毀FirstActivity
public class FirstActivity extends Activity {
final String TAG = "-----FirstActivity-----";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first);
// 輸出日志
Log.d(TAG, "-----onCreate-----");
TextView textView = findViewById(R.id.text1);
Button button1 = findViewById(R.id.bn_first1);
Button button2 = findViewById(R.id.bn_first2);
// 第一個(gè)按鈕跳轉(zhuǎn)到第二個(gè)Activity
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
// 第二個(gè)按鈕銷毀該Activity
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FirstActivity.this.finish();
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "-----onStart-----");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "-----onRestart-----");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "-----onResume-----");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "-----onPause-----");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "-----onStop-----");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.v(TAG, "-----onDestory-----");
}
}public class SecondActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
Button button = findViewById(R.id.bn_second);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SecondActivity.this.finish();
}
});
}
}

最后得到的日志信息如下所示,我們過濾了其他日志,只保留FirstActivity的日志

Activity的加載模式
Activity一共有四種加載模式
- standard:標(biāo)準(zhǔn)模式,這是默認(rèn)的加載模式
- singleTop:Task棧頂單例模式
- singleTask:Task內(nèi)單例模式
- singleInstance:全局單例模式
安卓采用Task來管理多個(gè)Activity,當(dāng)我們啟動應(yīng)用的時(shí)候,安卓就會位置創(chuàng)建一個(gè)Task,然后啟動這個(gè)引用的入口Activity,(即<intent-filter>中配置為MAIN和LAUNCHER的Activity)。
我們可以將Task簡單理解成存放Activity的棧,先加載的Activity位于棧底,后加載的Activity位于棧頂。
Activity的加載模式就是按照什么樣的方式去實(shí)例化,加載Activity,并且控制Activity和Task之間的關(guān)系。
standard模式
當(dāng)我們通過standard模式啟動Activity的時(shí)候,每次都會創(chuàng)建一個(gè)新的Activity示例放置到棧頂。當(dāng)我們在配置Activity時(shí)沒有指定加載模式的時(shí)候,采用的就是standard模式。
singleTop模式
這種模式與standard模式基本相同,唯一不同的就是,當(dāng)要啟動的Activity已經(jīng)位于棧頂?shù)臅r(shí)候不會創(chuàng)建一個(gè)新的實(shí)例,而是復(fù)用已有的實(shí)例。如果我們的目標(biāo)Activity不位于棧頂,那么還是會創(chuàng)建一個(gè)新的實(shí)例,這一點(diǎn)和standard模式是一樣的。
singleTask模式
采用singleTask模式的Activity在同一個(gè)Task中只有一個(gè)實(shí)例,當(dāng)系統(tǒng)采用singleTask模式啟動目標(biāo)Activity的時(shí)候,可分為如下三種情況
如果要啟動的Activity實(shí)例不存在,系統(tǒng)會創(chuàng)建一個(gè)實(shí)例,并且將其置于棧頂
如果要啟動的Activity實(shí)例位于棧頂,此時(shí)的操作與singleTop模式相同
如果要啟動的Activity實(shí)例存在于棧中,但是沒有位于棧頂,那么系統(tǒng)就會將該Activity上的所有Activity移出Task棧,從而使目標(biāo)Activity轉(zhuǎn)入棧頂
singleInstance模式
在這種加載模式下,系統(tǒng)保證無論從哪個(gè)Task中啟動目標(biāo)Activity,只會創(chuàng)建一個(gè)目標(biāo)Activity實(shí)例,并會使用一個(gè)全新的Task棧來加載該Activity實(shí)例。
當(dāng)系統(tǒng)采用singleInstance模式啟動目標(biāo)Activity時(shí),可分為如下兩種情況
如果要啟動的目標(biāo)Activity不存在,系統(tǒng)會創(chuàng)建一個(gè)全新的Task,再創(chuàng)建目標(biāo)Activity的實(shí)例,并將它加入到新的Task棧頂
如果要啟動的目標(biāo)Activity已經(jīng)存在,無論它位于哪個(gè)應(yīng)用程序中,位于哪個(gè)Task中,系統(tǒng)都會把該Activity所在的Task轉(zhuǎn)到前臺,從而使該Activity顯示出來
到此這篇關(guān)于Android Activity的生命周期與加載模式超詳細(xì)圖文解析的文章就介紹到這了,更多相關(guān)Android Activity的生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android實(shí)現(xiàn)簡易登陸注冊邏輯的實(shí)例代碼
在android的應(yīng)用中越來越多的包含了網(wǎng)絡(luò)互動功能,這就帶來了注冊,登陸賬號功能,這篇文章主要給大家介紹了關(guān)于Android實(shí)現(xiàn)簡易登陸注冊邏輯的相關(guān)資料,需要的朋友可以參考下2021-06-06
Android UI實(shí)現(xiàn)多行文本折疊展開效果
這篇文章主要為大家詳細(xì)介紹了Android UI實(shí)現(xiàn)多行文本折疊展開效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Android UI控件RatingBar實(shí)現(xiàn)自定義星星評分效果
這篇文章主要為大家詳細(xì)介紹了Android UI控件RatingBar實(shí)現(xiàn)自定義星星評分效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
Android 用RxBinding與RxJava2實(shí)現(xiàn)短信驗(yàn)證碼倒計(jì)時(shí)功能
這篇文章主要介紹了Android 用RxBinding與RxJava2實(shí)現(xiàn)短信倒計(jì)時(shí)功能示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Android 一鍵清理、內(nèi)存清理功能實(shí)現(xiàn)
這篇文章主要介紹了Android 一鍵清理、內(nèi)存清理功能實(shí)現(xiàn),非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-01-01
Android實(shí)現(xiàn)仿網(wǎng)易新聞主界面設(shè)計(jì)
這篇文章主要為大家介紹了Android實(shí)現(xiàn)仿網(wǎng)易新聞主界面設(shè)計(jì)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01
Android組件必學(xué)之TabHost使用方法詳解
這篇文章主要為大家詳細(xì)介紹了Android組件中的TabHost組件使用方法,如何利用TabHost定義Tab標(biāo)簽樣式,感興趣的小伙伴們可以參考一下2016-05-05

