Android Activity生命周期

Android生命周期

Android的生命周期:onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroy() 如下圖所示:

  1. 1.當activity啟動時系統會先調用onCreate(),然后調用onStart(),最后調用**onResume()**方法,activity進入運行狀態。
  2. 當activity被別的activity 覆蓋在其上時:系統會掉用onPause(),然后當覆蓋在其上的activity會調用**onCreate() -> onStart() -> onResume()后,第一個activity會調用onStop()**方法使activity暫停。
  3. 當覆蓋在其上的第二個activity關閉返回此activity時,系統會先調用第二個activity的**onPause()方法然后再調用第一個activity的onRestart() -> onStart() -> onResume()方法,進入運行狀態,此時第二個activity才調用onStop() -> onDestroy()**方法關閉。
  4. 用戶退出當前activity:系統先調用onPause(),然后調用onSotp(),最后調用**onDestroy()**方法,結束當前activity。

如下日志打印 第一個activity MainActivity 打開 SingleTopActivity 在返回到 MainActivity

     MainActivity :onPause 方法-------------------------SingleTopActivity :onCreate 方法-------------------------SingleTopActivity :onStart 方法-------------------------SingleTopActivity :onResume 方法-------------------------MainActivity :onSaveInstanceState 方法--------------------MainActivity :onStop 方法-------------------------SingleTopActivity :onPause 方法-------------------------MainActivity :onRestart 方法-------------------------MainActivity :onStart 方法-------------------------MainActivity :onResume 方法-------------------------SingleTopActivity :onStop 方法-------------------------SingleTopActivity :onDestroy 方法-------------------------
復制代碼
  • onRestart():表示activity正在重新啟動,一般情況下是當前activity從不可見重新變成可見狀態時,**onRestart()**就會被調用,這種情況一般是用戶行為導致的,如從其他頁面返回當前頁面時,或者用戶按home鍵切換到桌面在重新打開app。

  • onStart()和onStop():onStart()表示activity可見了,但是還沒有獲取焦點,無法進行交互。onStop()是和onStart()對應的當activity從可見轉不可見是調用。

  • onResume()和onPause():onResume()表示activity已經獲取焦點了,可以進行交互了,onPause()是和onResume()方法對應的表示當前activity失去了焦點,此時可以做一些存儲數據和停止動畫等工作,但是不能太好時,不是會影響到新的activity的顯示,因為只有onPause()執行完了,新的activity才會進入 onCreate() 等方法。

  • onDestroy():onDestroy()表示activity正在銷毀,一般我們是在這進行資源的釋放,以避免內存的泄漏。

注意:

- 如果覆蓋在其上的activity的風格是dialog風格的化,此activity是不會進入**onSotp()**方法,回到此activity時也**不會調用onRestart()和onStart()方法** 會直接調用**onResume()**方法。- 如果activity中彈出dialog對話框的時候,**activity是不會調用onPause()方法**;- 只有舊的activity onPause()方法執行完后,新的activity才啟動
- 在所以情況下,系統在調用了onPause()和onStop()之后都會調用onDestroy(),只有一個例外:當你從onCreate()方法類調用了finish()時,在這種情況下,系統會立刻調用onDestroy(),而不調用任何其他生命周期方法。日志如下:
復制代碼
 MainActivity :onPause 方法-------------------------DialogActivity :onCreate 方法-------------------------MainActivity :onResume 方法-------------------------DialogActivity :onDestroy 方法-------------------------
復制代碼

異常情況下的生命周期:比如系統資源配置發生改變以及系統內存不足時,activity就可能被殺死。

  • 情況1:資源相關配置方式改變導致activity被殺死并重新創建。 比如當前activity處于豎屏,旋轉屏幕,這時由于activity的系統配置改為了橫屏狀態,在默認情況下,activity就會被銷毀并且重新創建,日志打印如下:
 MainActivity :onCreate 方法-------------------------MainActivity :onCreate:MainActivity  TaskId:130  hasCode:151566767MainActivity :onStart 方法-------------------------MainActivity :onResume 方法-------------------------MainActivity :onPause 方法-------------------------MainActivity :onSaveInstanceState 方法-------------------------MainActivity :onStop 方法-------------------------MainActivity :onDestroy 方法-------------------------MainActivity :onCreate 方法-------------------------MainActivity :onCreate:MainActivity  TaskId:130  hasCode:233659052MainActivity :onStart 方法-------------------------MainActivity :onRestoreInstanceState 方法-------------------------MainActivity :onResume 方法-------------------------MainActivity :onPause 方法-------------------------MainActivity :onSaveInstanceState 方法-------------------------MainActivity :onStop 方法-------------------------MainActivity :onDestroy 方法-------------------------MainActivity :onCreate 方法-------------------------MainActivity :onCreate:MainActivity  TaskId:130  hasCode:262962597MainActivity:TaskAffinity:com.hugo.reviewbasicMainActivity :onStart 方法-------------------------MainActivity :onRestoreInstanceState 方法-------------------------MainActivity :onResume 方法-------------------------
復制代碼

在上面這日志中 我們進入MainActivity -> onCreate() -> onStart () -> onResume() 這個時候MainActivity已經在棧頂并獲得焦點了,然后我們旋轉手機屏幕,

這時調用了 onPause() -> onSaveInstanceState() -> onStop() - onDestroy() 方法把當前MainActivity 銷毀了,然后緊接著又重新創建了一個MainActivity -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()

這是MainActivity已經重新創建并且是橫屏顯示的,這是我們又旋轉手機屏幕重新豎屏顯示 ,這是調用了 onPause() -> onSaveInstanceState() -> onStop() - onDestroy() 方法把當前橫屏MainActivity 銷毀了,并重新創建了豎屏的MainActivity -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()

在這上面的流程我們可以看到 在第一次進入MainActivity 時是每有調用onRestoreInstanceState() 方法的而是在重新創建時才調用了該方法,這個方法是用來做什么的呢?這個方法就是用來在activity被銷毀并重新創建時用來恢復我們保存的數據用的,那我們的數據在哪保存的呢,可以看到日志里每次在銷毀前都有調用 onSaveInstanceState() 方法,這個方法就是用來保存數據用的。

在onSaveInstanceState()方法中系統會傳入Bundle對象用來存儲數據,在重新創建時onRestoreInstanceState()方法系統會傳入在onSaveInstanceState()方法是存儲了數據的Bundle對象,在onRestoreInstanceState()方法里可以在傳入的Bundle對象中獲取存儲的數據進行頁面恢復。

根據日志可以看出 onSaveInstanceState() 總是在 onStop()之前調用,而onRestoreInstanceState() 總是在onStart() 之后調用,而且onRestoreInstanceState()在activity第一次創建時是不會調用的。

  • 情況2:在資源不足的情況下導致低優先級的activity被殺死。 這種情況下和前面第一種情況1的數據存儲和恢復是完全一致的,activity按照優先級從高到低可以分為以下三種:

    1. 前臺activity:正在和用戶交互的activity,優先級最高。 2.可見但是非前臺activity:就是能看見,但是沒有獲取到焦點不能和用戶進行直接交互。 3.后臺activity:已經被暫停的activity,比如執行了onStop()方法,優先級最低。

注意: 必須始終調用 onSaveInstanceState()和onRestoreInstanceState() 的超類實現因為這兩個方法默認實現了保存有關activity視圖層次的狀態信息和恢復視圖層次結構狀態,列如EditText小部件的文本或ListView的滾動位置。而且所有的View都有onSaveInstanceState()和onRestoreInstanceState()這兩個方法。


自行處理配置變更: 我們可以在聲明Activity將自行處理配置變更,這樣就可以阻止系統重啟activity了。 聲明時在AndroidManifest.xml文件中編輯相應的""元素,設置以包含的 android:configChanges 屬性(最常用的值包括“orientation”和“keyboardHidden”,分別用于避免因屏幕方向和可用鍵盤改變而導致的重啟)。我們可以在該屬性中聲明多個匹配值,方法是用“ | ”字符分隔這些配置值。 如下配置:

<activity android:name=".singletop.OtherTopActiivty" 
android:configChanges="orientation|screenSize"
android:launchMode="singleTop"/>
復制代碼

現在,當其中一個配置發生改變是OtherTopActiivty不會重啟,但是OtherTopActiivty的onConfigurationChanged()方法會被調用,系統會 傳入Configuration對象指定新的設備配置。我們可以通過讀Configuration中的字段,來確定新配置,進行相應的UI更改。 以下是在onConfigurationChanged()實現檢查當前設備的方向:

override fun onConfigurationChanged(newConfig: Configuration?) {???
super.onConfigurationChanged(newConfig)??
LogUtil.i(TAG,"$ActivityName :onConfigurationChanged 方法-------------------------")?
if(newConfig?.orientation == Configuration.ORIENTATION_LANDSCAPE){?????
LogUtil.i(TAG,"$ActivityName :onConfigurationChanged 橫屏")??
Toast.makeText(this,"橫屏",Toast.LENGTH_SHORT).show()??
}else if(newConfig?.orientation == Configuration.ORIENTATION_PORTRAIT){????
LogUtil.i(TAG,"$ActivityName :onConfigurationChanged 豎屏")???
Toast.makeText(this,"豎屏",Toast.LENGTH_SHORT).show()?
}
}復制代碼

注意:

  • 自行處理配置變更可能導致備用資源的使用更為困難,因為系統不會自動應用這些資源。所以只有在我們必須避免activity因配置改變而重啟這種情況下,才考慮采用自行處理配置變更這種方法,而且對于大多數應用并不建議使用此方法。
    復制代碼
  • 在Android3.0(API 級別13)開始,設備在縱向和橫向之間切換時,“屏幕尺寸”也會發生改變,因此在開發針對API級別13或更高版本的應用時,若要避免由于設備方向的改變而導致運行時重啟,則除了“orientation”值外,還必須添加“screenSize“值。也就是必須聲明android:configChanges="orientation|screenSize"。
    復制代碼
  • 在聲明有Activity處理配置變更時,我們有責任要為其提供備用資源的所有元素。如聲明了activity處理方向變更,有些圖像是應該橫向和縱向之間切換,則必須在 onConfigurationChanged()方法中將每個資源重新分配給每個元素。
    復制代碼

這個例子代碼在這里

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388833.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388833.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388833.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

date數據存入mysql_Date對象存入mysql數據庫

java.sql.Date,java.sql.Time和java.sql.Timestamp三個都是java.util.Date的子類(包裝類)。java.sql.Date是java.util.Date的子類&#xff0c;是一個包裝了毫秒值的瘦包裝器&#xff0c;允許 JDBC 將毫秒值標識為 SQL DATE 值。毫秒值表示自 1970 年 1 月 1 日 00:00:00 GMT 以…

盛嚴謹,嚴謹,再嚴謹。_評估員工調查的統計嚴謹性

盛嚴謹,嚴謹,再嚴謹。The human resources industry relies heavily on a wide range of assessments to support its functions. In fact, to ensure unbiased and fair hiring practices the US department of labor maintains a set of guidelines (Uniform Guidelines) to …

復權就是對股價和成交量進行權息修

* 所謂復權就是對股價和成交量進行權息修復,按照股票的實際漲跌繪制股價走勢圖, * 并把成交量調整為相同的股本口徑。股票除權、除息之后&#xff0c;股價隨之產生了變化&#xff0c; * 但實際成本并沒有變化。 * 如&#xff1a;原來20元的股票&#xff0c;十送十之…

前端校驗和后端校驗

問&#xff1a;到底是前端校驗好還是后端校驗好呢&#xff1f; 答&#xff1a;后端校驗比前端校驗更安全&#xff0c;更可靠&#xff0c;前端校驗可以增加用戶體驗&#xff0c;一般來說&#xff0c;在前端校驗的東西在后端也必須校驗&#xff08;比如登陸用戶名、密碼&#xff…

[MySQL] INFORMATION_SCHEMA 數據庫包含所有表的字段

sql注入后可以通過該數據庫獲取所有表的字段信息1. COLLATIONS表 提供有關每個字符集的排序規則的信息。 COLLATIONS表包含以下列&#xff1a;COLLATION_NAME 排序規則名稱。 CHARACTER_SET_NAME 與排序規則關聯的字符集的名稱。 ID 排序規則ID。 IS_DEFAULT 排序規則是否為其字…

開根號的筆算算法圖解_一個數的開根號怎么計算

一個數的開根號怎么計算2020-11-08 15:46:47文/鐘詩賀帶根號的式子可以直接進行開平方的運算。一些特殊的根號運算有;√2≈1.414、1/2-√3≈0.5-1.732≈-1.232、2√5≈22.236≈4.236、√7-√6≈2.646-2.449≈0.197。開平方的筆算方法1&#xff0e;將被開方數的整數部分從個位起…

arima 預測模型_預測未來:學習使用Arima模型進行預測

arima 預測模型XTS對象 (XTS Objects) If you’re not using XTS objects to perform your forecasting in R, then you are likely missing out! The major benefits that we’ll explore throughout are that these objects are a lot easier to work with when it comes to …

net程序員的iPhone開發-MonoTouch

net程序員的iPhone開發-MonoTouch iPhone軟件的Native開發除了使用Apple推薦的Objective-C Cocoa之外&#xff0c;也有其他的一些工具和SDK提供 基于WEB的形式的一些框架在下面這個文章介紹過 各種SmartPhone上的跨平臺開源框架的總結 http://www.cnblogs.com/2018/archive/20…

ASP防止SQL注入

防止SQL注入http://0.0.0.0/bzhs/login.asp?logTypeedit;WAITFOR DELAY 0:0:5 --logType Replace(Replace(Replace(Replace(logType,"-",""),"",""),"&",""),";","")fcdm Replace(Rep…

protobuf java 生成_protobuf代碼生成

windows :1,兩個文件&#xff1a;proto.exe, protobuf-java-2.4.1.jar2,建立一個工程TestPb&#xff0c;在下面建立一個proto文件件&#xff0c;用來存放【。proto】文件3&#xff0c;將proto,exe放在工程下&#xff0c;4&#xff0c;建立一個msg.proto文件&#xff1a;option …

bigquery_在BigQuery中鏈接多個SQL查詢

bigqueryBigquery is a fantastic tool! It lets you do really powerful analytics works all using SQL like syntax.Bigquery是一個很棒的工具&#xff01; 它使您能夠使用像語法一樣SQL來進行真正強大的分析工作。 But it lacks chaining the SQL queries. We cannot run …

允許指定IP訪問遠程桌面

允許指定IP訪問遠程桌面 電腦軟件 2010-01-23 02:33:40 閱讀595 評論0 字號&#xff1a;大 中 小 訂閱 一、新建IP安全策略 WINR打開運行對話框&#xff0c;輸入gpedit.msc進入組策略編輯器。 依次打開“本地計算機”策略--計算機配置--Windows設置--安全設置--IP安…

大理石在哪兒 (Where is the Marble?,UVa 10474)

題目描述&#xff1a;算法競賽入門經典例題5-1 1 #include <iostream>2 #include <algorithm>3 using namespace std;4 int maxn 10000 ;5 int main()6 {7 int n,q,a[maxn] ,k0;8 while(scanf("%d%d",&n,&q)2 && n &&q…

Volley 源碼解析之網絡請求

Volley源碼分析三部曲Volley 源碼解析之網絡請求Volley 源碼解析之圖片請求Volley 源碼解析之緩存機制 Volley 是 Google 推出的一款網絡通信框架&#xff0c;非常適合數據量小、通信頻繁的網絡請求&#xff0c;支持并發、緩存和容易擴展、調試等&#xff1b;不過不太適合下載大…

為什么修改了ie級別里的activex控件為啟用后,還是無法下載,顯示還是ie級別設置太高?

如果下載插件時下載不了&#xff0c;這樣設置&#xff0c;打開IE選工具/Internet 選項/安全/自定義級別/設置中的ActiveX控件自動提示“禁用”。 對標記為可安全執行腳本ActiveX控件執行腳本“啟用” 對沒有標記為安全的ActiveX初始化和腳本運行“啟用”&#xff08;下載插件后…

mysql 遷移到tidb_通過從MySQL遷移到TiDB來水平擴展Hive Metastore數據庫

mysql 遷移到tidbIndustry: Knowledge Sharing行業&#xff1a;知識共享 Author: Mengyu Hu (Platform Engineer at Zhihu)作者&#xff1a;胡夢瑜(Zhhu的平臺工程師) Zhihu which means “Do you know?” in classical Chinese, is the Quora of China: a question-and-ans…

兩個日期相差月份 java_Java獲取兩個指定日期之間的所有月份

String y1 "2016-02";//開始時間String y2 "2019-12";//結束時間try{Date startDate new SimpleDateFormat("yyyy-MM").parse(y1);Date endDate new SimpleDateFormat("yyyy-MM").parse(y2);Calendar calendarCalendar.getInstance(…

js前端日期格式化處理

js前端日期格式化處理 1.項目中時間返回值&#xff0c;很過時候為毫秒值&#xff0c;我們需要轉換成 能夠看懂的時間的格式&#xff1b; 例如&#xff1a; ? yyyy-MM-dd HH:mm:ss 2.處理方法&#xff08;處理方法有多種&#xff0c;可以傳值到前端處理&#xff0c;也可以后臺可…

如何用sysbench做好IO性能測試

sysbench 是一個非常經典的綜合性能測試工具&#xff0c;通常都用它來做數據庫的性能壓測&#xff0c;但也可以用來做CPU&#xff0c;IO的性能測試。而對于IO測試&#xff0c;不是很推薦sysbench&#xff0c;倒不是說它有錯誤&#xff0c;工具本身沒有任何問題&#xff0c;它的…

XCode、Objective-C、Cocoa 說的是幾樣東西

大部分有一點其他平臺開發基礎的初學者看到XCode&#xff0c;第一感想是磨拳擦掌&#xff0c;看到 Interface Builder之后&#xff0c;第一感想是躍躍欲試&#xff0c;而看到Objective-C的語法&#xff0c;第一感想就變成就望而卻步了。好吧&#xff0c;我是在說我自己。 如果…