activity 生命周期_从0系统学Android-2.4 Activity 的生命周期
本系列文章,參考《第一行代碼》,作為個人筆記
更多內容:更多精品文章分類
本系列持續更新中….
2.4 Activity 的生命周期
掌握 Activity 的生命周期對于開發者來說是非常重要的!
2.4.1 返回棧
Android 中的 Activity 是可以層疊的。我們每次啟動一個新的 Activity,就會覆蓋在原來的 Activity 上面,然后點擊 back 鍵就會銷毀最上面的 Activity,下面的 Activity 就會重新顯示出來。
Android 使用任務(Task)來管理 Activity 的,一個任務(Task)就是一組存放在棧中的 Activity 的集合。這個棧也被稱為返回棧(Back Task)。
棧是一種后進先出的數據結構,默認情況下,每當我們啟動一個新的 Activity,這個 Activity 就會在返回棧中入棧,并且處于棧頂的位置。每當我們按下 Back 鍵或者調用 finish 方法后就會銷毀一個 Activity。處于棧頂的Activity 就會出棧,這是前一個入棧的 Activity 就會重新處于棧頂的位置。系統總是會顯示處于棧頂的 Activity 給用戶。
2.4.2 Activity 狀態
每個 Activity 在其生命周期中最多有 4 種狀態。
1.運行狀態
當一個 Activity 處于返回棧的棧頂的時候,這個時候的 Activity 就是運行狀態。系統是最不愿意回收這種狀態的 Activity 的。
2.暫停狀態
當一個 Activity 不處于棧頂狀態但是仍然可見的時候,這種狀態稱為暫停狀態。不處于棧頂仍然可見是因為很多 Activity 不一定是占滿全屏的,比如對話框形式的 Activity。這種狀態的 Activity 系統也是不愿意回收的,除非內存極低的情況。
3.停止狀態
當 Activity 不處于棧頂狀態并且不可見的時候,這種狀態稱為停止狀態。這種狀態下系統仍然會保留 Activity 的相應狀態和變量。但是當內存不太足,也是可能會被回收的。
4.銷毀狀態
Activity 從棧中移除,這個時候就稱為銷毀狀態。系統最傾向回收銷毀狀態的 Activity,從而保證內存充足。
2.4.3 Activity 的生存期
Activity 中定義了 7 個回調方法,覆蓋了聲明周期的每一個環節。
onCreate()
Activity 第一次被創建的時候調用。應該在這個方法里完成 Activity 的初始化操作,比如:加載布局、綁定事件等。
onStart()
這個方法在 Activity 由不可見變為可見的時候調用
onResume()
這個方法在 Activity 準備好和用戶進行交互的時候調用。此時 Activity 一定位于棧頂,并且處于運行狀態
onPause()
在系統準備啟動或者恢復另一個 Activity 的時候調用。我們通常會在這個方法中將一些消耗 CPU 的資源釋放掉,以及保存一些關鍵的數據,但是這個方法的執行速度一定要快,不然會影響到新的棧頂 Activity 的使用。
onStop()
這個方法在 Activity 完全不可見的時候調用。它和 onPause 的主要區別在于,如果啟動的新 Activity 是一個對話框式的 Activity 的時候,那么 onPause() 會得到執行,而 onStop() 不會執行。
onDestroy()
這個方法在 Activity 被銷毀 前 調用,之后 Activity 的狀態就處于銷毀狀態。
onRestart()
這個方法 Activity 由停止狀態變為運行狀態之前調用,也就是 Activity 被重新恢復了。
以上的 7 個方法除了 onRestart() 方法外,其余的都是兩兩相對,從而又將 Activity 分為 3 對生存期。
完整生存期
Activity 在 onCreate() 和 onDestroy() 方法之間所經歷的,就是完整的生存期。一般情況下 Activity 會在 onCreate() 方法中完成各種初始化操作,onDestroy() 中完成釋放內存操作。
可見生存期
Activity 在 onStart() 和 onStop() 方法之間所經歷的就是完整的可見生存期。在可見生存期內,Activity 對用戶是可見的,但是可能無法了用戶交互。可以通過這兩個方法來合理的管理那些對用戶可見的資源。比如在 onStart() 方法中對資源進行加載,而 onStop() 方法中對資源進行釋放,從而保證處于停止狀態的 Activity 不會占用過多的內存。
前臺生存期
Activity 在 onResume() 和 onPause() 方法之間所經歷的就是前臺生存期。在前臺生存期,Activity 總是處于運行狀態,此時 Activity是可以與用戶交互的,我們平時看到和接觸最多的就是這個狀態下的 Activity 了。
2.4.4 體驗 Activity 的生命周期
上面主要是理論的知識,下面從實戰方向出發,去體驗一下 Activity 的生命周期。
這里新建一個項目,項目中有兩個 Activity ,一個是普通的 Activity ,一個是對話框式的 Activity。體現對話框式的 Activity 就是要修改一下這個 Activity 的樣式。在 AndroidManifest.xml 的 Activity 標簽配置中
<activity android:name=".DialogActivity"android:theme="@style/Theme.AppCompat.Dialog"> </activity>就是通過 android:theme 屬性來設置。Android 系統內置了很多的主題可以選擇。
MainActivity 中有兩個按鈕,第一個按鈕啟動 NormalActivity ,第二個按鈕啟動 DialogActivity。
下面啟動 MainActivity,這個時候的打印信息是:
MainActivity:onCreate MainActivity:onStart MainActivity:onResume然后點擊第一個按鈕啟動 NormalActivity,打印信息:
MainActivity:onPause MainActivity:onStop由于 NormalActivity 已經把 MainActivity 徹底遮擋住了,因此 onPause 和 onStop 方法都執行。
然后按下 Back 鍵,返回到 MainActivity ,打印信息:
MainActivity:onRestart MainActivity:onStart MainActivity:onResume由于之前 MainActivity 已經進入了停止狀態,所以 onRestart 方法會得到執行。
點擊第二個按鈕,啟動 DialogActivity,此時打印信息:
MainActivity:onPauseonStop 方法并沒有執行,這是因為 DialogActivity 并沒有完全遮蓋住 MainActivity,此時 MainActivity 只是進入了暫停狀態,并沒有進入停止狀態。
2.4.5 Activity 被回收了怎么辦?
一個 Activity 在進入了停止狀態后,就有可能會被系統回收。
比如:應用中有一個 Activity A,用戶在 A 的基礎上啟動了 Activity B ,這個時候 A 進入了停止狀態,由于系統內存不足,A 被回收了。然后用戶按下了 Back 鍵返回 A 。這個時候會出現什么問題呢?
其實 A 會正常顯示,只不過不會執行 onRestart 方法了,而是會執行 onCreate 方法。重新創建一次。那么之前的狀態就全沒有了。
這個時候 onSaveInstanceState() 方法排上用場了,這個方法可以保證在 Activity 被回收前一定會被調用,因此我們可以通過這個方法來保存 Activity 被回收前的狀態數據。
@Override protected void onSaveInstanceState(Bundle outState){super.onSaveInstanceState(Bundle outState);String tempData = "要保存的狀態";outState.putString("data",tempData); }數據保存下來了,然后我們就可以通過 onCreate() 方法中的參數來獲取里面的數據了。
總結
以上是生活随笔為你收集整理的activity 生命周期_从0系统学Android-2.4 Activity 的生命周期的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql2008 cet查询 所有层级_案
- 下一篇: hutool 读取扩展名文件_用卓语言实