標籤:
在應用程式中至少包含一個用來處理應用程式的主UI功能的主介面螢幕。這個主介面一般由多個Fragment組成,並由一組次要Activity支援。要在螢幕之間切換,就必須要啟動一個新的Activity。一般的Activity都佔據了整個顯示屏,但可以建立成半透明或二者浮動的Activity。
一、建立Activity
通過繼承Activity類可以建立一個Activity視窗,基本架構如下:
1 public class MyActivity extends Activity {2 @Override3 protected void onCreate(Bundle savedInstanceState) {4 super.onCreate(savedInstanceState);5 }6 }
以上代碼是一個空的Activity,可以通過使用Fragment、布局和視圖來建立UI。視圖是用來顯示資料和提供互動互動的UI控制項。Android提供給了多個布局類,成為ViewGroup,它可以包含多個視圖來協助UI布局。Fragment用來封裝UI的各個部分,從而能夠方便的建立動態介面,這些介面能夠針對不同的螢幕尺寸很方向重新排列,起到最佳化UI的效果。
要想把一個UI分配給一個Activity,需要在onCreate()方法中調用setContentView()方法。可以通過在java代碼中建立布局,也可以通過調用xml布局資源檔來建立。如下兩種方式:
1 protected void onCreate(Bundle savedInstanceState) {2 super.onCreate(savedInstanceState);3 TextView tvShow = new TextView(this);4 setContentView(tvShow);5 tvShow.setText("你好");6 }
當然,通過調用xml布局檔案來建立UI的方法更常用,如下:
1 protected void onCreate(Bundle savedInstanceState) {2 super.onCreate(savedInstanceState);3 setContentView(R.layout.activity_main);4 }
最後,建立好了Activity類不要忘了在Manifest中對其註冊。(註冊方法及原因請參考:Android進階編程筆記(二)Manifest檔案節點詳解)
需要注意的是,想讓一個Activity可以被應用程式啟動器使用,它必須包含一個監聽MAIN動作和LAUNCHER分類的Intent-Filter,如下:
1 <activity2 android:name="com.codingblock.myactivity.MyActivity"3 android:label="@string/app_name" >4 <intent-filter>5 <action android:name="android.intent.action.MAIN" />6 <category android:name="android.intent.category.LAUNCHER" />7 </intent-filter>8 </activity>
二、Activity的生存期
正確理解Activity的生存期,可以更好的對應用程式管理資源,從而讓應用程式更加連貫流暢。
1、Activity棧
每一個Activity的狀態是由他在Activity棧中所處的位置所決定的,Activity棧是當前所有正在啟動並執行Activity的後進先出的集合。當一個新Activity啟動,它就會變成Activity狀態,並移到棧頂,當返回到前一個Activity,前台Activity被關閉,那麼站總的下一個Activity就會移動到棧頂,變成活動狀態。
2、Activity狀態
隨著Activity的建立和銷毀,從棧中移進移出的過程中他們經曆了如下4種可能的狀態:
· 活動狀態:當一個Activity處於棧頂是,它是可見的、具有焦點的前台Activity並可以接受使用者輸入。
· 暫停狀態:Activity可見,但沒有焦點,不能接受使用者輸入事件。(例如:當一個透明的或者非全屏的Activity位於該Activity之前時)
· 停止狀態:Activity不可見。此時,Activity仍然會保留在記憶體中,儲存所有狀態資訊,然而當系統的其他地方要求使用使用記憶體時,會優先終止此類狀態的Activity。
· 非使用中:Activity被終止。此時Activity已經從棧中移除了。
3、監控狀態改變
為了保證Activity可以對狀態改變做出反應,Android提供了一系列的回調方法,當Activity的狀態改變時它們就會被觸發。以下代碼是整個Activity生存期的架構,各方法的說明已在代碼注釋中詳細給出:
1 public class MyActivity extends Activity { 2 3 //在完整生存期開始調用 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 //初始化Activity並填充UI 8 } 9 10 //在onCreate方法完成後調用,用於恢複UI狀態11 @Override12 protected void onRestoreInstanceState(Bundle savedInstanceState) {13 super.onRestoreInstanceState(savedInstanceState);14 /* 15 * 從savedInstanceState恢複UI狀態16 * 這個Bundle也被傳遞給了onCreate17 * 自Activity上次可見之後,只有系統終止了該Activity時,才會被調用18 */19 }20 21 //在隨後的Activity進程可見生存期之前調用22 @Override23 protected void onRestart() {24 super.onRestart();25 //載入改變,知道Activity在此進程中已經可見26 }27 28 //在可見生存期的開始時調用29 @Override30 protected void onStart() {31 super.onStart();32 //既然Activity可見,就應用任何要求的UI Change33 }34 35 //在Activity狀態生存期開始時調用36 @Override37 protected void onResume() {38 super.onResume();39 /*40 * 恢複Activity需要,但是當它處於不活動狀態時被掛起的暫停UI更新、線程或進程41 * 在Activity狀態生命週期結束的時候滴啊用,用來儲存UI狀態的改變42 */43 }44 45 //在UI狀態改變儲存到saveInstanceState46 @Override47 protected void onSaveInstanceState(Bundle outState) {48 super.onSaveInstanceState(outState);49 /*50 * 如果進程被運行時終止並被重啟,51 * 那麼這個Bundle將被傳遞給onCreate和onRestoreInstanceState52 */53 }54 55 //在Activity狀態生存期結束時調用56 @Override57 protected void onPause() {58 super.onPause();59 /*60 * 掛起不需要更新的UI更新、線程或者CPU密集的進程61 * 當Activity不是前台的活動狀態的Activity時62 */63 }64 65 //在可見生存期結束時調用66 @Override67 protected void onStop() {68 super.onStop();69 /*70 * 掛起不需要的UI更新、線程或處理71 * 當Activity不可見時,儲存所有的編輯或者狀態改變,因為在調用這個方法後,京城可能會被終止72 */73 }74 75 //在完整生存期結束時調用76 @Override77 protected void onDestroy() {78 super.onDestroy();79 /*80 * 清理所有的資源,包括結束線程、81 * 關閉資料庫連接等82 */83 }84 }
4、理解Activity的生存期
在一個Activity從建立到銷毀的完整的生存期內,它會經曆活動生存期和可見生存期的一次或者多次重複。每一次轉化都會觸發以上方法處理常式。
· 完整生存期:對onCreate()的第一次調用和對onDestroy()的最後一次調用之間的時間範圍。有時候還會發生一個Activity的進程終止,卻沒有調用onDestroy方法的情況。
使用onCreate方法初始化Activity,如果Activity意外終止,onCreate方法接受一個包含UI狀態的Bundle對象,該對象是在最後一次調用onSaveInstanceState時儲存的。應該使用這個Bundle將UI恢複為上一次的狀態,既可以通過onCreate方法也可以重寫onRestoreInstanceState。
對象的快速建立和銷毀會導致額外的垃圾收集過程,為了保證代碼高效,盡量不要建立短期對象。如果Activity是有規律的建立相同的對象集,可以考慮在onCreate建立,因為onCreate只在Activity生存期調用一次。
· 可見生存期:onStart和onStop之見的時間。此時,Activity可見,但可能沒有焦點,或者可能被部分遮擋了。Activity在完整生存期期間可能會包含多個可見生存期。在個別極端情況下,Android運行時可能會在一個Activity位於可見生存期事把它終止,而不調用onStop方法。
onStop方法應該用來暫停或者停止動畫、線程、感應器監聽器、GPS尋找、定時器、Service或者其他專門用於更新使用者介面的進程。當UI再次啟動時,可以用onStart或者onRestart方法來恢複或者重啟這些進程。
onRestart在除了對onStart方法的第一次調用之外的所有方法之前被立即調用。可以用它完程只有當Activity在它的完整生存期之內重啟時才能完成的特殊處理。
onStart/onStop方法也可以用來註冊或者登出那些專門用來更新使用者介面的Broadcast Reciver。
· 活動生存期:onResume及其對應的onPause之間的時間。
當Activity處於活動期時,它在前台,並可以接收使用者輸入事件。Activity被銷毀前可能會經曆多個活動生存期,在失去焦點是,活動生存期就結束了。盡量讓onPause和onResume方法中的代碼執行迅速,儘可能少。以保證前後台切換時能夠保持響應。
onResume方法可以是輕量級的。使用它可以重新註冊已經使用onPause停止的Broadcast Receiver或者其他進程。
http://www.cnblogs.com/codingblock/p/4757913.html
Android進階編程筆記(四)深入探討Activity(轉)