Android Activity的生命周期與加載模式超詳細圖文解析
Activity的生命周期
Activity是安卓應用的重要組成單元之一,其對於安卓的作用類似於Servlet對於Web應用的作用。
整個Activity生命周期的圖解如下
具體的生命周期可以總結成如下幾個步驟
onCreate():Activity啟動後第一個被調用的函數,常用來進行Activity的初始化,如創建View,綁定數據和恢復數據。
onStart():當Activity顯示在屏幕上時,函數被調用。
onRestart():Activity從停止狀態進入活動狀態是調用。
onResume():Activity可以接受用戶輸入時,該函數被調用,此時的activity位於activity棧的棧頂。
onPause():當Activity進入暫停狀態時,該函數被調用,一般用來保存持久的數據或釋放占用的資源。
onStop():當Activity變為不可見後,該函數被調用,Activity進入停止狀態。
onDestroy():在Activity被終止前,被調用。
歸納起來,Activity大概會經歷四種狀態
運行狀態:當前Activity位於前臺,用戶可見,可以獲得焦點
暫停狀態:其他Activity位於前臺,該Activity依然可見,隻是不能獲得焦點
停止狀態:該Activity不可見,失去焦點
銷毀狀態:該Activity結束,或Activity所在的進程被結束
我們使用給一個程序來看一下看一下Activity的生命周期。程序非常簡單,就是定義兩個Activity,分別命名為FirstActivity和SecondActivity,先從FirstActivity跳轉到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); // 第一個按鈕跳轉到第二個Activity button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(FirstActivity.this, SecondActivity.class); startActivity(intent); } }); // 第二個按鈕銷毀該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:標準模式,這是默認的加載模式
- singleTop:Task棧頂單例模式
- singleTask:Task內單例模式
- singleInstance:全局單例模式
安卓采用Task來管理多個Activity,當我們啟動應用的時候,安卓就會位置創建一個Task,然後啟動這個引用的入口Activity,(即<intent-filter>中配置為MAIN和LAUNCHER的Activity)。
我們可以將Task簡單理解成存放Activity的棧,先加載的Activity位於棧底,後加載的Activity位於棧頂。
Activity的加載模式就是按照什麼樣的方式去實例化,加載Activity,並且控制Activity和Task之間的關系。
standard模式
當我們通過standard模式啟動Activity的時候,每次都會創建一個新的Activity示例放置到棧頂。當我們在配置Activity時沒有指定加載模式的時候,采用的就是standard模式。
singleTop模式
這種模式與standard模式基本相同,唯一不同的就是,當要啟動的Activity已經位於棧頂的時候不會創建一個新的實例,而是復用已有的實例。如果我們的目標Activity不位於棧頂,那麼還是會創建一個新的實例,這一點和standard模式是一樣的。
singleTask模式
采用singleTask模式的Activity在同一個Task中隻有一個實例,當系統采用singleTask模式啟動目標Activity的時候,可分為如下三種情況
如果要啟動的Activity實例不存在,系統會創建一個實例,並且將其置於棧頂
如果要啟動的Activity實例位於棧頂,此時的操作與singleTop模式相同
如果要啟動的Activity實例存在於棧中,但是沒有位於棧頂,那麼系統就會將該Activity上的所有Activity移出Task棧,從而使目標Activity轉入棧頂
singleInstance模式
在這種加載模式下,系統保證無論從哪個Task中啟動目標Activity,隻會創建一個目標Activity實例,並會使用一個全新的Task棧來加載該Activity實例。
當系統采用singleInstance模式啟動目標Activity時,可分為如下兩種情況
如果要啟動的目標Activity不存在,系統會創建一個全新的Task,再創建目標Activity的實例,並將它加入到新的Task棧頂
如果要啟動的目標Activity已經存在,無論它位於哪個應用程序中,位於哪個Task中,系統都會把該Activity所在的Task轉到前臺,從而使該Activity顯示出來
到此這篇關於Android Activity的生命周期與加載模式超詳細圖文解析的文章就介紹到這瞭,更多相關Android Activity的生命周期內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Android四大組件之Activity詳細介紹
- Android入門之在Activity之間穿梭的Intent
- Android進程間使用Intent進行通信
- Android四大組件之Activity深入解讀生命周期
- Android中Intent組件的入門學習心得