一共七種狀态,成對出現
oncreate()——ondestory()
onstart()——onstuop()
onresume()——onpause()
再加上一個官方文檔中寫的onrestart()
生命周期就是重寫這些方法,在相應的方法(狀态)裡執行相應的操作就可以了
<1>oncreate和ondestory
——oncreate這個方法會在activity啟動的時候被調用
在這個啟動的階段,也就是在這個方法的内部,你可以去做一些初始化的動作
就是前面我們說到的初始化控件,初始化事件之類的
在這個方法裡,也應該通過setcontentview這個方法來設定activity加載的ui内容
使用findviewbyid來找到這個ui裡的各控件
——ondestory中一般執行一些釋放資源的操作,同樣要注意不要在這裡面儲存資料,因為這個步驟有可能被跳過,儲存資料不安全
<2>onstart和onstop
onstart()是可見的,onstop()不可見
——onstart方法中一般較少設定事件
——onstop方法有些情況下可能不會被執行,比如說切換到另一個界面,但是另一個界面是透明的,是以原界面還是能被看見的,這時候就隻會onpause()而不會onstop();還有可能目前系統的記憶體不足以運作目前的activity的時候,就會調用onpause()方法而不調用onstop()方法
是以在onstop()方法中不要進行一些儲存資料的操作,可能會不安全
<3>onresume和onpause
——onresume方法中一般用于放一些開始動畫
——onpuse方法中一般進行儲存正在編輯的資料,停止動畫等操作
<4>
onstart()可見,但是沒有焦點,沒有擷取到焦點,不可以進行操作
onresume()可見,并且擷取到了焦點,可以進行操作,可以互動
onpause(),可見,但失去了焦點,暫停,不可操作
onstop()已經不可見了
一般情況下,onstart和onresume成對出現,onpause和onstop成對出現,例如從主界面跳轉到另外一個界面
應該是主界面首先onpause(),onstop(),然後切換回主界面時onstart(),onresume()
但在某些情況下,例如第二個界面是透明的,那麼我們雖然切換到了第二個界面,我們還是可以看見主界面的内容,隻是不能進行操作
這種情況下主界面切換時就隻會onpause(),切換回來時onresume()
<5>橫豎屏切換時activity生命周期的變化
當手機螢幕橫豎屏進行切換時,會産生以下操作
onpause()
onstop()
ondestory()
oncreate()
onstart()
onresume()
也就是說activity會先銷毀掉,然後再重新建立
例如,我們一開始在播放器看視訊,途中手機切換一下橫豎屏,這個時候就相當于建立了一個新的activity對象,這個對象的值如果不做處理的話,是相對于一個全新的界面,是不同于橫豎屏切換之前的狀态的
——如何解決橫豎屏切換帶來的問題呢?
1,禁止旋轉,鎖定螢幕的方向(常用于遊戲開發)
在配置檔案manifest.xml中配置,把要設定為橫屏或豎屏鎖定的界面activity中加入一條語句
android:screenorientation=“ ”(填入portrait就是豎屏,landscape就是橫屏)
2,設定界面對配置不敏感(常用于視訊播放器開發)
在配置檔案manifest.xml中配置
configchanges後面的這三個選項通常一起使用,意思就是隐藏鍵盤,螢幕尺寸變化,螢幕方向
——這兩種方式都保證了在旋轉螢幕的過程中不會銷毀原有對象,不需要重走一遍生命周期
在開發中,需要遇到橫豎屏切換的場景有:
1,遊戲開發,遊戲時會用到橫屏
2,視訊播放器
3,其他使用場景
<6>activity啟動模式
activity一共有四種啟動模式
我們在自己編寫界面的時候,自己編寫的xxxactivity其實都是直接或間接地繼承自activity,而activity由系統建立啟動的時候,由四種模式,分别是:
1,standard——标準模式
2,singletop——單一棧頂模式
3,singletask——單任務模式
4,singleinstance——單例模式
我們要設定activity的啟動模式,具體操作就是在配置清單manifest.xml裡的activity聲明中配置加載模式(launchmode)即可
(1)standard模式;
最基本的啟動模式,每一次點選就會在任務棧中新加入一個任務,新打開一個界面
點選了多少下任務按鈕,就會建立多少個新界面
在傳回的時候,也需要按相應次數的傳回按鈕才能退出程式
使用場景——一般都是用這個模式,如果不進行配置,預設也是這種模式
(2)singletop模式:
如果任務棧的棧頂已經是目前要執行的任務了,那麼就不會再建立新的任務
使用場景——如果想保證某個任務隻有一個,不被建立多個,就可以用這種模式
例如應用的通知推送,如果已經有推送了,就不會一直重複再推送
(3)singletask模式:
如果我們要建立的任務不存在任務棧中,那麼就會建立這個任務,并且放在棧頂
如果我們要建立的任務存在與任務棧中,就會把這個任務以上的任務全部從任務棧中移除,使它置于棧頂
使用場景——當要打開的任務所占資源比較大的時候
(4)singleinstance模式:
前三種啟動模式,都是在同一個任務棧中的,但singleinstance比較特殊,它是獨立一個任務棧的,在第一次打開的時候會單獨建立一個棧來存放這個任務
它獨占一個棧,再次點選的時候不會再建立,隻是把這個任務棧直接提前到别的任務棧的前面
使用場景——在整個系統中隻有唯一一個執行個體的情況,可以使用這種模式,例如谷歌翻譯隻需要打開一個,但是它可以在任何别的界面中調取,調取的時候不用重新打開新的谷歌翻譯界面,而是把這個任務棧提前就好了