Android四大基本組件分別是Activity,Service服務,Content Provider內容提供者,BroadcastReceiver廣播接收器。
本章主要涉及一下知識點:
一. Activity的生命週期及應用情境:
二 . 讓Activity變成一個視窗:Activity屬性設定
三 你背景Activity被系統 回收怎麼辦:onSaveInstanceState
一 Activity的生命週期 :
Android的應用程式 的生命週期是被統一掌控 的,也就是說我們寫的應用程式命運掌握在別人(系統)的手裡,不能改變它,只能學習 並適應它。
簡單地說一下為什麼是這樣:我們手機在運行 一個應用程式的時候,有可能打進來電話發進來簡訊 ,或者沒有電了,這時候程式都會被中斷,優先去服務電話的準系統 ,
另 外系統也不允許你佔用太多資源 ,至少要保證電話功能吧,所以資源不足的時候也就有可 能被幹掉。
activity生命週期圖
四大狀態:
一般來講,某一時刻,Activity處在下面四個狀態之一:
Active:當Activity運行在螢幕前台,此時它擷取了焦點能響應使用者的操作,屬於運行狀態,同一個時刻只會有一個Activity 處於活動(Active)或運行。
Paused:當Activity失去焦點但仍對使用者可見(如在它之上有另一個透明的Activity或Toast、AlertDialog等快顯視窗時)它處於暫停狀態。暫停Activity仍然是存活狀態(它保留著所
有的狀態和成員資訊並保持和視窗管理器的串連),但是當系統記憶體極小時可以被系統殺掉。
Stopped:完全被另一個Activity遮擋時處於停止狀態,它仍然保留著所有的狀態和成員資訊。只是對使用者不可見,當其他地方需要記憶體時它往往被系統殺掉,但是以 通 過 notification進行通訊。
Dead:Activity 尚未被啟動、已經被手動終止,或已經被系統回收時處於非活動的狀態,要手動終止Activity,可以在程式中調用"finish"方法。例如為了釋放緊缺的記憶體空間。
狀態轉變的事件:
當狀態改變時,Android會提供1個或者多個觸發調用方法。我們通過重寫這些方法來實現我們的處理。
public class MyActivity extends Activity{
protected void onCreate(Bundle savedInstanceState){….. }
protected void onStart(){….. }
protected void onRestart(){….. }
protected void onResume(){….. }
protected void onPause(){….. }
protected void onStop(){….. }
protected void onDestroy(){….. }
}
我們的Activity會按需要 重載這些方法,onCreate是免不了的,在一個Activity正常啟動的過程中,他們被調用的順序是 onCreate -> onStart -> onResume,
在Activity被幹掉的時候順序是onPause -> onStop -> onDestroy ,這樣就是一個完整的生命週期,
但是有人問了 ,程式正運行著呢來電話了,這個程式咋辦?中止了唄,如果中止的時候新出的一個Activity是全屏的那麼:onPause->onStop ,恢複的時候onStart->onResume ,如果打斷 這個應用程式的是一個Theme為Translucent 或者Dialog 的Activity那麼只是onPause ,恢複 的時候onResume
生命週期七種狀態解析:
onCreate(Bundle savedInstanceState) :通常用於初始化設定: 1、為Activity設定所要使用的布局檔案2、為按鈕綁定監聽器等靜態設定作業
onStart() :當Activity可見未獲得使用者焦點不能互動時系統會調用
onRestart() : 當Activity已經停止然後重新被啟動時系統會調用
onResume(): 當Activity可見且獲得使用者焦點能互動時系統會調用
onPause(): 應該使用onPause()來儲存持久資料。
當系統啟動另外一個新的Activity時,在新Activity啟動之前被系統調用儲存現有的Activity中的持久資料、停止動畫等,這個實現方法必須非常快。當系統而不是使用者自己出於回收記憶體時,關閉了activity 之後。使用者會期望當他再次回到這個activity 的時候,它仍保持著上次離開時的樣子。此時用到了onSaveInstanceState(),方法onSaveInstanceState()用來儲存Activity被殺之前的狀態,在onPause()之前被觸發,當系統為了節省記憶體銷毀了Activity(使用者本不想銷毀)時就需要重寫這個方法了,當此Activity再次被執行個體化時會通過onCreate(Bundle
savedInstanceState)將已經儲存的臨時狀態資料傳入因為onSaveInstanceState()方法不總是被調用,觸發條件為(按下HOME鍵,按下電源按鍵關閉螢幕,橫豎屏切換情況下),你應該僅重寫onSaveInstanceState()來記錄activity的臨時狀態,而不是持久的資料。應該使用onPause()來儲存持久資料。
onStop():當Activity被新的Activity完全覆蓋不可見時被系統調用
onDestroy():當Activity(使用者調用finish()或系統由於記憶體不足)被系統銷毀殺掉時系統調用,(整個生命週期只調用1次)用來釋放onCreate ()方法中建立的資源,如結束線程等
生命週期情境例子:
一下例子參用愷風 哥們的:
情境1:如果我們在一個activity(activity1)中通過intent啟動另一個activity(activity2),那麼觸發的過程是:
activity1-onPause()->activity2-onCreate()->activity2-onStart()->activity2-onResume()->activity1-onStop()
activity1:失去了使用者的焦點,無法和使用者進行互動,被activity2覆蓋,調用了onPause(),然後是activity2的啟動調用過程,通常activity2不是覆蓋部分,而且完全佔據螢幕,由此activity1被隱藏,activity1進入了Stopped狀態,調用activity1-onStop()。如果acvity2已對話方塊的方式,而不是全螢幕,即activity1不會並因此,仍然保留在Paused狀態,則不會觸發activity1-onStop()。
activity2:對於一個activity的啟動順序為初始化onCreate() -> 使用者可視onStart() -> 使用者可互動(獲得焦點)onResume()
情境2:我們按菜單的返回鍵,從activity2退出,並恢複為activity1
activity2-onPause() -> activity1-onRestart() -> activity1-onStart() -> activity1-onResume() ->
activity2-onStop() -> activity2-onDestory()
activity1:在情境1中進入Stopped狀態,重新恢複,進入onRestart()狀態,UI可視onStart(),獲得焦點使用者可互動onResume()
activity2:按返回鍵,acivity將被登出,根據android給出來的圖,依次進行onPause()失去焦點不可互動->onStop()不可視->on Destory()被關閉。
二 . 讓Activity變成一個視窗:Activity屬性設定
簡單你只需要設定 一下Activity的主題就可以了在AndroidManifest.xml 中定義 :比如一個漂浮在手機主介面等
Xml代碼
android :theme="@android:style/Theme.Dialog"
android:theme="@android:style/Theme.Dialog"
這就使你的應用程式變成對話方塊的形式彈出來了,或者
Xml代碼
android:theme="@android:style/Theme.Translucent"
android:theme="@android:style/Theme.Translucent"
就變成半透明的,
上面說的是屬性名稱,具體有什麼值是在android.R.style中 可以看到,比如這個"@android:style/Theme.Dialog" 就對應於android.R.style.Theme_Dialog
三 .你背景Activity被系統回收怎麼辦:onSaveInstanceState
儲存資料的方式為onSaveInstanceState(),要注意,由於activity會頻繁地執行之,所以一定要保證高效,只將我們的data存放如Bundle。擷取資料有兩個途徑,一是onCreate(Bundle)中的參數攜帶該data,二是在onRestoreInstanceState()。我們可以選擇所需的資料,這個資料甚至可以是一個callback
當你的程式中某一個Activity A 在運行時中,主動或被動地運行另一個新的Activity B
這個時候A會執行
Java代碼
public
void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("id", 11111111111);
}