Android基礎知識梳理--activity組件
- 功能:提供與用戶進行交互的界面、展示數據
- 基本用法:Activity本質上就是一個Java類,不過我們在使用的時候需要繼承Activity這個基類,并且需要在AndroidManifest.xml文件中注冊,不注冊使用的時候會拋異常,每個Activity一般會有對應的xml文件來放置布局。
- 生命周期方法
- onCreate :Activity第一次創建的時候被調用
- onStart :Activity從不可見轉為可見的時候調用
- onResume:Activity處于可見的時候調用
- onPause:程序準備啟動或者恢復另一個activity的時候調用
- onStop:activity完全不可見的時候調用
- onDestory:activity被銷毀前調用
- onRestart:由停止狀態轉變成運行狀態的時候調用
- activity的四種狀態
- 運行狀態:此時activity位于棧頂
- 暫停狀態:activity不處于棧頂,但仍然在前臺(即:仍然可見)
- 停止狀態:不處于棧頂,且處于后臺(完全不可見)
- 銷毀狀態:activity從棧中移除,并且被系統回收
- 生命周期詳細說明
- 啟動activity時候:onCreate ---> onStart ---> onResume
- 鎖屏或者被其它activity覆蓋:onPause --->onStop
- 屏幕解鎖或者由被覆蓋狀態回到前臺:onRestart ---> onStart ---> onResume
- 跳轉到其它activity或者按Home進入后臺:onPause ---> onStop
- 回退到此activity:onRestart ---> onStart ---> onResume
- 退出此activity: onPause---> onStop --->onDestory
- 從Aactivity跳轉到Bactivity:A的onPause ---> B的onCreate ---> B的onStart ---> B的onResume ---> A的onStop
- 從Bactivity返回Aactivity:B的onPause ---> A的onRestart ---> A的onStart ---> A的onResume ---> B的onStop --->B的onDestory(從B調回A的時候,A沒有銷毀,如果A銷毀的話重新走一次啟動時候的activity生命周期)
- activity啟動模式
- standard標準模式:此模式是activity的默認模式,在這種模式下,每次調用startActivity都會創建activity
- singleTop單一頂部模式:每次調用startActivity,系統會判斷當前的activity是否已經被創建并且位于棧頂,如果沒創建或者不位于棧頂,都會創建一個activity實例,如果是,就直接調用。一般用于特殊需求,比如一直彈出某個頁面。
- singleTask單一任務棧模式:如果任務棧中已經存在當前的activity,就直接去調用activity實例,并且把activity實例以上的activity彈棧,不存在,就新建activity實例,這種模式一般用于當某個界面需要顯示的資源非常大,只需要初始化一次實例。
- singleInstance單一實例模式:activity會在一個新的任務棧中實例化,并且其它的activity不會創建在新的任務棧中,在整個程序中,始終只初始化一次,一般用于只需要初始化一次的頁面。
- onSaveInstanceState方法
- 用于保存activity的狀態存儲一些臨時數據
- activity被覆蓋或者進入后臺時,系統因為資源不足導致activity被殺死的時候調用
- 用戶改變屏幕方向的時候也會調用
- 跳轉到其它activity或者用戶按Home鍵的時候調用
- onRestoreInstanceState方法
- 用于恢復保存的臨時數據
- 這個方法需要傳入一個Bundle參數,這個Bundle參數也會傳遞到onCreate方法中,也可以在onCreate方法中恢復數據
- 因為系統資源不足activity被殺死之后重新回到此activity時候也會被調用
- 用戶改變屏幕方向重建activity的時候也會被調用
- 會在onStart之后調用
- 一些需要注意的地方
- 設置activity豎屏,在activity對應的AndroidMainifest.xml中設置android:screenOrientation="portrait"屬性或者在onCreate中調用setRequestOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
- 設置activity橫屏:在activity對應的AndroidMainifest.xml中設置android:screenOrientatiaon="landscape"屬性或者在onCreate中調用setRequestOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
- 切換屏幕方向的時候activity會銷毀、重建,重走一次生命周期:onPause--->onStop--->onDestory--->onCreate--->onStart--->onResume
- 給activity設置不同的affinity屬性就可以將同一個程序中的activity存放在不同的任務棧中,但是啟動activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK標志
- 給activity設置android:theme="@android:style/Theme.Dialog"可以將activity設置成窗口的樣式
- 問題:內存不足的時候怎么保存activity的狀態?做哪些操作?
在需要保存的activity中的onSaveInstanceState方法中保存activity的狀態,然后在onRestoreInstanceState方法中或者onCreate方法中恢復activity的狀態。 - 問題:怎么退出activity?怎么安全地退出已經調用多個activity的Application?
直接調用finish方法就可以退出activity。
安全退出多個activity的方法:
1、 拋異常強制退出,但是這樣會彈出Force Close窗口,需要解決這個問題
2、記錄打開的activity,在需要退出的時候,依次結束掉每一個activity
3、 發送廣播退出,需要結束應用的時候發送一個廣播,每個activity接收到廣播就關閉即可
4、 遞歸退出,調用新的activity的時候使用startActivityForResult,然后給每個activity添加標志,在onActivityResult中處理,遞歸關閉