天天看點

四大元件之Activity小結

一大波面試就要靠近,趕緊總結總結一些基礎問題

注1:activity之間通過intent進行通信。(在intent 的描述結構中,有兩個最重要的部分:動作和動作對應的資料)

注2:activity與view的差別

1)     activity是四大元件中唯一一個用來和使用者進行互動的元件。可以說activity就是android的視圖層。

2)     如果再細化,activity相當于視圖層中的控制層,是用來控制和管理view的,真正用來顯示和處理事件的實際上是view。

3)     每個activity内部都有一個window對象, window對象包含了一個decorview(實際上就是framelayout),我們通過setcontentview給activity設定顯示的view實際上都是加到了decorview中。

當一個activity被kill之前它可以調用onsaveinstancestate來儲存目前activity的狀态資訊

上一張經典的圖來感受一下

四大元件之Activity小結

【oncreate】

;當activity第一次被執行個體化的時候系統會調用,,整個生命周期隻調用1次這個方法,通常用于初始化設定: 1、為activity設定所要使用的布局檔案2、為按鈕綁定監聽器等靜态的設定操作

【onstart()】

當activity可見未獲得使用者焦點不能互動時系統會調用

【onrestart()】

當activity已經停止然後重新被啟動時系統會調用

【onresume()】

當activity可見且獲得使用者焦點能互動時系統會調用

【onpause】

當系統将要啟動另一個 activity時調用。此方法主要用來将未儲存的變化進行持久化,停止類似動畫這樣耗費cpu的動作等。

比如:

(1)當系統而不是使用者自己出于回收記憶體時,關閉了activity 之後。使用者會期望當他再次回到這個activity 的時候,它仍保持着上次離開時的樣子。此時用到了onsaveinstancestate(),方法onsaveinstancestate()用來儲存 activity被殺之前的狀态,在onpause()之前被觸發,

(2)當系統為了節省記憶體銷毀了activity(使用者本不想銷毀)時就需要重寫這個方法 了,當此activity再次被執行個體化時會通過oncreate(bundle savedinstancestate)将已經儲存的臨時狀态資料傳入因為onsaveinstancestate()方法不總是被調用,觸發條件為(按 下home鍵,按下電源按鍵關閉螢幕,橫豎屏切換情況下),應該僅重寫onsaveinstancestate()來記錄activity的臨時狀态, 而不是持久的資料。應該使用onpause()來存儲持久資料。

【onstop】

當activity被新的activity完全覆寫不可見時被系統調用

【ondestroy()】

當activity(使用者調用finish()或系統由于記憶體不足)被系統銷毀殺掉時系統調用,(整個生命周期隻調用1次)用來釋放oncreate ()方法中建立的資源,如結束線程等

首先必須說明是activity是以棧的形式存放的。

【standard】    

預設模式,可以不用寫配置。在這個模式下,都會預設建立一個新的執行個體。是以,在這種模式下,可以有多個相同的執行個體,也允許多個相同activity疊加。即不管有沒有已存在的執行個體,都生成新的執行個體

【singletop】   

可以有多個執行個體,但是不允許多個相同activity疊加。即如果activity在棧頂的時候,啟動相同的activity,不會建立新的執行個體,而會調用其onnewintent方法。

【singletask】

隻有一個執行個體。在同一個應用程式中啟動它的時候,若activity不存在,則會在目前task建立一個新的執行個體,若存在,則會把task中在其之上的其它activity destory掉并調用它的onnewintent方法。如果是在别的應用程式中啟動它,則會建立一個task,并在該task中啟動這個activity,singletask允許别的activity與其在一個task中共存,也就是說,如果我在這個singletask的執行個體中再打開新的activity,這個新的activity還是會在singletask的執行個體的task中。

【singleinstance】    隻有一個執行個體,并且這個執行個體獨立運作在一個task中,這個task隻有這個執行個體,不允許有别的activity存在。

關于onnewintent方法截個圖說明一下

四大元件之Activity小結

具體在方式需要在清單檔案中配置

如:<activity android:name="com.example.mobilesafe.watchdogactivity"

             android:launchmode="singleinstance"/>

主要有倆種

【startactivity()】    在一個activity中調用startactivity()方法。

直接啟動activity,不帶請求碼。

【startactivityforresult()】   在一個activity中調用startactivityforresult()方法。

可以一次性完成這項任務,當程式執行到這段代碼的時候,頁面會跳轉到下一個activity,

而當這個activity被關閉以後(this.finish()),程式會自動跳轉會第一個activity,并調用前一個activity的onactivityresult( )方法

帶請求碼啟動activity。

注:其實startactivity()本質就是startactivityforresult(),在startactivity()源碼中還是調用了startactivityforresult(),将其第二個參數設定為-1而已,是以他們本質上沒啥差別,startactivity()隻是将startactivityforresult()做了一個簡單封裝而已。

轉自:http://blog.csdn.net/xsf50717/article/details/47344067

繼續閱讀