網站首頁 編程語言 正文
前言
Android生命周期分為兩部分:?
- (1)典型情況下的生命周期。
- (2)異常情況下的生命周期。
典型情況下的生命周期分析
圖1 Activity的生命周期圖解
圖2 Activity生命周期的金字塔圖?
(1)典型情況下的生命周期指在有用戶參與的情況下,Activity所經過的生命周期的改變,正常情況下,Activity的常用生命周期有以下幾種情況:
- onCreate():Activity啟動后第一個被調用的函數,常用來進行Activity的初始化,如創建View,綁定數據和恢復數據。
- onStart():當Activity顯示在屏幕上時,函數被調用。
- onRestart():Activity從停止狀態進入活動狀態是調用。
- onResume():Activity可以接受用戶輸入時,該函數被調用,此時的activity位于activity棧的棧頂。
- onPause():當Activity進入暫停狀態時,該函數被調用,一般用來保存持久的數據或釋放占用的資源。
- onStop():當Activity變為不可見后,該函數被調用,Activity進入停止狀態。
- onDestroy():在Activity被終止前,被調用。
/*1.onCreate:
每個Activity在寫代碼的過程中都會看見這個函數,
是聲明周期的第一個方法。
一般做一些資源和數據初始化的工作,
比如綁定相對應的資源布局setContentView*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/*2.onRestart:
字面意思表示Activity重新啟動,這個狀態一般由用戶切換應用的行為產生,
比如從應用切換到桌面或者切打開新的Activity,
此時這個Activity就會調用onPause和onStop讓這個Activity進入展廳狀態。
再回到這個Activity就是onRestart了*/
@Override
protected void onRestart() {
super.onRestart();
}
/*3.onStart:
這個狀態我理解就是Activity啟動中的一個過程,
就是啟動中,但是還不能與用戶交互(用戶不可見),
屬于一個在后臺的狀態*/
@Override
protected void onStart() {
super.onStart();
}
/*4.onResume:
表示Activity已經可見,且已經開始活動。
與onStart類似的狀態但是就是屬于一種在前臺的狀態*/
@Override
protected void onResume() {
super.onResume();
}
/*5.onPause:
是一個非常微妙的狀態,處于正在停止的一個臨界點,
就很難重現這種狀態,就是在停止過程中,
先執行onPause然后在onStop執行之前,
回到Activity執行onResume,這期間就是onPause的狀態。
此處可以做一些存儲數據停止動畫的工作,但是不能太耗時,
不然會影響到新Activity的顯示,只有這些操作做完,
新Activity的OnResume才會執行。*/
@Override
protected void onPause() {
super.onPause();
}
/*6.onStop:
表示Activity即將停止,可以做一些相對重量級的回收工作,
同樣不能太耗時。*/
@Override
protected void onStop() {
super.onStop();
}
/*onDestroy
表示Activity即將被銷毀,這是Activity生命的盡頭,
可以做一些回收工作和資源的釋放。*/
@Override
protected void onDestroy() {
super.onDestroy();
}
(2)進一步地,可以將Activity分為3種生存期:
- 完整生存期:在 onCreate() 和 onDestroy() 之間所經歷的。
- 可見生存期:在 onStart() 和 onStop() 之間所經歷的。
- 前臺生存期:在 onResume() 和 onPause() 之間所經歷的。
(3)Activity的活動狀態:
- 運行狀態:位于返回棧棧頂的活動。
- 暫停狀態:不在棧頂位置,但仍然可見。
- 停止狀態:不在棧頂位置,完全不可見。可能會被系統回收。
- 銷毀狀態:在返回棧中移除的活動。
(返回棧:每啟動一個新的活動,會在返回棧中入棧,并處于棧頂的位置。每銷毀一個活動,處于棧頂的活動會出棧,前一個入棧的活動會重新處于棧頂的位置。)
異常情況下的生命周期分析 (1)系統配置發生改變引起生命周期的異常變化
舉例:開啟手機的自動旋轉后,當Activity從豎屏狀態轉變為橫屏時,系統會自動銷毀原先的Activity并重建。如果不做特殊處理,那么每當系統配置改變時,Activity都會銷毀重建,
如圖所示:
圖3 旋轉手機時Activity的生命周期變化情況
當手機從豎屏轉變為橫屏時,可以看到原Activity執行: onPause -> onSaveInstanceState -> onStop -> onDestroy ,走完原Activity的生命周期。當原Activity銷毀后又會迅速的開啟新的Activity執行 :onCreate -> onStart -> onRestoreInstanceState -> onResume, 最終新的Activity顯示在用戶界面上。onSaveInstanceState 和 onRestoreInstanceState 兩個方法僅在生命周期異常情況下執行。onSaveInstanceState主要是對異常銷毀的Activity進行數據保存,onRestoreInstanceState主要是對存儲的數據進行恢復,數據存取都是通過Bundle,因此我們可以在Bundle中附加個人數據進行讀寫。經過測試onSaveInstanceState在onStop前調用,onRestoreInstanceState在onStart方法后調用。這兩個方法執行的過程中,系統會自動對視圖進行信息數據的存取,例如:ListView的滾動位置等等。(2)資源內存不足導致低優先級的Activity被殺死
當系統資源不足時,系統會按照上述優先級去殺死目標的 Activity 所在的進程,并在后續通過 onSaveInstanceState 和 onRestoreInstanceState 來存儲和恢復數據。如果一些后臺的進程脫離了四大組件而獨立運行,那么這個進程很快就被殺死。我們常常將后臺工作放到 Service 中保持進程具有一定的優先級。
圖4 configChanges添加orientation后的效果
當系統配置改變時Activity會銷毀重建,通過在AndroidMainManifest.xml中為Activity添加configChanges屬性去避免這個情況。configChanges的屬性有很多,例如:orientation表示屏幕方向變化、KeyboardHidden表示虛擬鍵盤可訪問性變化等,通過設置這些屬性后當運行過程中發生上述情況Activity既不會銷毀重建也不會調用 onSaveInstanceState 和 onRestoreInstanceState 兩個方法,而是執行onConfigChanged方法。
問題: (1)onStart 和 onResume、onPause 和 onStop 從功能描述上看大同小異,到底有什么區別呢?
這兩組方法對的回調意義不同,onState 和onStop 是從 Activity 是否可見這個角度來回調的,而 onResume 和 onPause 是從 Activity 是否位于前臺這個角度來回調的,不過在實際使用中沒有其他明顯區別。
(2)假設當前Activity為A,如果這時用戶打開了一個新的Activity B,那么B的onResume方法和A的onPause方法誰先執行呢?
根據Android的基本運行機制,不能在onPause中執行重量級的操作,因為必須onPause執行完成以后新Activity才能onResume。onPause和onResume都不能執行耗時的操作,尤其是onPause,這就意味著我們應該在onStop中操作,從而使新的Activity顯示出來并切換到前臺。
原文鏈接:https://blog.csdn.net/kevinjin2011/article/details/124866144
相關推薦
- 2022-05-27 一起來學習C語言的程序環境與預處理_C 語言
- 2022-12-04 Android自定義View繪制貝塞爾曲線實現流程_Android
- 2022-02-28 CommonsChunkPlugin 插件使用方法 、 出現報錯 : Error: webpa
- 2022-08-07 C++從文件中提取英文單詞的實現方法_C 語言
- 2022-05-29 C++掃盲篇之指針詳解_C 語言
- 2022-10-08 Python中集合創建與使用詳解_python
- 2023-03-21 C#中寫入和讀取TXT文件問題_C#教程
- 2022-11-14 Swift?指針底層探索分析_Swift
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支