Android進階編程筆記(四)深入探討Activity

來源:互聯網
上載者:User

標籤:

  在應用程式中至少包含一個用來處理應用程式的主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(轉)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.