Android開發-Activity(二)

Intent


Android中組件間都是通過Intent進行交流的,這也使得組件間的耦合度大大減低。Intent分爲兩種:顯式Intent和隱式Intent,Intent類定義了八個重要的成員變量:

private String mAction;
private Uri mData;
private String mType;
private String mPackage;
private ComponentName mComponent;
private int mFlags;
private HashSet<String> mCategories;
private Bundle mExtras;

其中mComponent是用於顯式Intent的,它有兩個重要的成員變量:

private final String mPackage;
private final String mClass;//注意這個是類全限定名,不是類名!

而mAction、mData和mCategories則是用於隱式Intent,注意它們的匹配優先級:Action>Data>Category
Action:唯一的字符串,表示要執行的動作。
Data:要執行的動作需要的數據。它的類型是Uri,Uri的格式是這樣的,scheme://host:port/path,而host:port合在一起叫authority。Uri是一個抽象類,它幾個常見的實現類有StringUri、OpaqueUri和HierarchicalUri。
Category:執行動作的“上下文”。

其實這些匹配規則都是人爲定的,沒必要要很具體的說哪個有什麼作用。只要記住常見的就行。

常見的Action:

ACTION_MAIN:表示程序啓動的第一個Activity,注意如果有一個以上的Activity帶有該Action(不含CATEGORY_LAUNCHER),則啓動配置清單第一個含有該Action的Activity。注意如果一個意圖過濾器既有ACTION_MAIN又有CATEGORY_LAUNCHER,那麼桌面上會有該Activity的圖標,點擊是進入該Activity,而不是剛纔說的第一個含有ACTION_MAIN的Activity。
ACTION_CALL:直接執行打電話操作,注意要設置Data(要打的電話號碼)的值。
ACTION_DIAL:調用撥號界面,可以設置也可以不設置Data的值,注意與ACTION_CALL的區別。
ACTION_SEND:發郵件。
ACTION_VIEW:查看操作,如查看網頁,查看地圖等。

常見Category:

CATEGORY_LAUNCHER:將該Activity的圖標顯示在Launcher上。注意要有ACTION_MAIN纔會起作用。
CATEGORY_HOME:指定爲Home程序,不過使用貌似有點問題(或許是第三方ROM的問題)。
CATEGORY_DEFAULT:每個隱式意圖都會帶有該category,所以如果你的Activity想要可以被category匹配到,至少需要在意圖過濾器加上CATEGORY_DEFAULT。

Activity的生命週期


可以說Activity的生命週期是學習Activity最重要的部分。最直接也是最有效的方法就是理解Google安卓官網給出的Activtiy生命週期圖:

這裏寫圖片描述

說明:
1.當Activity處於onPause時如果內存極度緊張系統可以銷燬該Activity,處於onStop時如果其它地方需要內存但內存不足時可以銷燬該Activity,處於onDestroy系統也可以銷燬該Activity。其它階段系統都不會主動銷燬該Activity。
2.onPause爲可見不可及階段,該階段該Activity有關聯着WindowManager。onStop爲不可見階段,該階段該Activity並沒有關聯WindowManager。
3.對於從Activity A跳轉到Activity B,調用的生命週期函數順序爲:
onPause(A) –> onCreate(B) –> onStart(B) –>onResume(B) 如果此時A不可見,此時還會調用onStop(A)。
4.在系統任務列表清理殺死當前進程時,會調用該進程所有仍存在的Activity的onDestroy方法。

Google安卓官網上解釋onSaveInstanceState圖:

這裏寫圖片描述

說明:
1.好的應用程序都應該考慮到使用onSaveInstanceState方法來保存當前Activity的相關信息,以便在該Activity被回收然後重新創建時恢復到原來的狀態。
2.某一Activity在前臺時主動調用finish方法時,並不會執行onSaveInstanceState方法。
3.當系統殺死某一Activity所在進程時,並不會執行onSaveInstanceState方法。
4.清單文件的Activity節點有個configChanges屬性,如果設置該屬性值爲”orientation|screeSize”的話,則在切換橫豎屏時系統不會銷燬當前Activity然後創建新的Activity,而是隻調用onConfigurationChanged。而假如沒有設置這個屬性或者設置的屬性值包含”orientation|screeSize”的話,那麼橫豎屏切換時就會銷燬並創建新的Activity,此時會調用Activity的一系列生命週期回調函數(從onPause開始),包括onSaveInstanceState方法和onRestoreInstanceState方法。

Activity其它一些回調函數說明:


1.onSaveInstanceState(Bundle outState):在某個Activity可能會被系統銷燬(包括被系統銷燬)時會回調該方法。注意在onSaveInstanceState保存的是臨時性數據,而onPause保存的是永久化數據。Activity的onSaveInstanceState默認實現會保存那些有id屬性的控件狀態。
2.onRestoreInstanceState(Bundle savedInstanceState):Activity被系統銷燬後再次啓動時。
3.onConfigurationChanged(Configuration newConfig):當配置清單爲Activity配置屬性configChanges爲某一配置時且該Activity在運行時該配置發生改變。否則系統會重啓Activity。
4.onUserLeaveHint():當用戶自己主動選擇將當前Activity移到後臺時調用,注意它在onPause方法前調用。
5.onLowMemory():系統內存不足時調用。一般是在所有後臺進程都被系統殺死時調用。

轉載請註明原文地址:http://blog.csdn.net/u012619640/article/details/48449213

本博客已停止更新,轉移到微信公衆號上寫文章,歡迎關注:Android進階驛站
Android進階驛站

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章