2013年2月5日 星期二

[Android]Android四大元件之Activity的生命週期(一)

原則上Android的應用程式會由下面四個區塊所組合而成
Activity   Broadcast Intent Receiver    Service    Content Provider
    並不是所有的Android程式都需要有這四個部份才行,而是由上面那四項去挑選出來組合而成。
但當你決定要在你的程式裏放這些元件時,你必需將它們明確的列在AndroidManifest.xml這個檔案裏。 




        package="com.my_domain.app.helloactivity">
   
       
           
               
               
           
       
   

參照下列範例可以看到類似應用及 宣告
Activity to Activity(用Intent傳遞)  

Activity to Activity(show Listview)  


(1)Activity:






Activities是四大元件中最常用的。一個Activity在你的程式裏通常都會有一個畫面(single screen)可呈現出來。每個Activity都會實作出一個類別,而且這個類別是繼承自Activity這個基礎類別。你的這個類別要顯示使用者介面的話就必需再組合可視元件(Views)及回應事件功能。大部份的程式都會由多畫面(multiple screens)組成。比如:一個文字訊息傳送程式會有一個畫面是用來顯示可傳送訊息的聯絡人清單,一個畫面用來輸入要傳送的訊息內容,另一個畫面用來查閱舊的訊息內容,或是改變程式的設定畫面。每個畫面都會實作在一個Activity裏。換一宣告個畫面就是去啟動另一個Activity起來,在某些情況下Activity可以回傳值給上一個Activity:比如說有個Activity可以讓使用者選一張照片,然後告知上一個Activity使用者選到了那張圖片。當一個新的畫面顯示出來後,上一個畫面就會進入pause的狀態,系統會將它放進歷史堆疊去。有了歷史堆疊,使用者可以很方便的返回上一個畫面。如果畫面不再需要使用的話,也可以選擇從堆疊中移除。Android會幫你管理這個歷史堆疊的資料,從家(Home)畫面開始執行的所有應用程式都會被管理到。Intent and Intent Filters:Android使用了一個很特別的類別叫Intent,用來從一個畫面跳到另一個畫面。Intent是用來描述一個程式想要作些什麼事情。在Intent的資料結構裏有兩個很重要的部份,一個是動作(action)及對資料產生反應(data to act upon)。action主要的內容有MAIN(程式的進入點),VIEW,PICK,EDIT等等。data則是用URI的形示來表示。比如:想要查看一個人的聯絡資料時,你需要建立一個Intent,它包含了VIEW的動作(action)及指向該人資料的URI描述句。

還有另一個相關的類別是IntentFilter。當Intent要求做某些事情時,IntentFilter被用來描述這個activity能夠做些什麼事情。比如一個activity要能夠顯示個人連絡資料,你就必需要在IntentFilter說明你要如何處理個人連絡資料並用ACTION_VIEW呈現出來。IntentFilter都會宣告在AndroidManifest.xml檔案裏。

而畫面的切來切去則是由resolving intent來實現的。當你想產生新的畫面時,現行的activity就使用
還有另一個相關的類別是IntentFilter。當Intent要求做某些事情時,IntentFilter被用來描述這個activity能夠做些什麼事情。比如一個activity要能夠顯示個人連絡資料,你就必需要在IntentFilter說明你要如何處理個人連絡資料並用ACTION_VIEW呈現出來。IntentFilter都會宣告在AndroidManifest.xml檔案裏。
而畫面的切來切去則是由resolving intent來實現的。當你想產生新的畫面時,現行的activity就使用startActivity(myIntent)。然後系統會根據所有已安裝的程式所定義的intent filter來看那個程式是最適合myIntent。當startActivity被呼叫時,resolving Intents的處理過程是伴隨而來的。
resolving intent提供我們兩個好處:
讓Activities可以很容易的利用Intent的方式去使用別的程式的功能。
讓Activities可以很容易的在任何情況下由新Activity所取代。

先來看看底下的範例:它的目的是希望在onClick事件引發時,使用Intent去打開http://stenlyho.blogspot.com/ 這個網頁,所以你會發現要做兩件事情,1.設定
resolving intent提供我們兩個好處:讓Activities可以很容易的利用Intent的方式去使用別的程式的功能。讓Activities可以很容易的在任何情況下由新Activity所取代。
先來看看底下的範例:它的目的是希望在onClick事件引發時,使用Intent去打開http://stenlyho.blogspot.com/ 這個網頁,所以你會發現要做兩件事情,1.設定URI資料2.把uri及action傳給新的Intent,這裏的action是view,最後startActivity(intent)把intent執行起來。但按寫程式的常理來推斷,應該是把網址傳給瀏覽器啊,為什麼都沒看到執行瀏覽器的動作,只有Intent呢?這就是resolving Intent的功能囉!其實就像你在Windows裏點.doc檔時,自動會叫起word,點.txt檔時,自動會用記事本一樣的功能啦,resolving intent會根據uri內容是http開頭的,action又是VIEW時,就直接執行browser去把你設定的網址view出來給你看。
public void onClick(){ Uri uri = Uri.parse("http://kunhsien.blogspot.tw/"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);}

接著要開始串了:
[Java&android]使用Eclipse自動產生@Override 我們學會如何在程式中加入 父類可使用的method 並適時的改寫它
在這邊我們只是要用Override功能測試生命週期

@Override
protected void onDestroy() {
System.out.println("onDestory");
super.onDestroy();
}
@Override
protected void onPause() {
System.out.println("onPause");
super.onPause();
}
@Override程式首先會
protected void onResume() {
super.onResume();
if (stop == false){
System.out.println("onResume");
}
}
@Override
protected void onStart() {
System.out.println("onStart");
super.onStart();
}
@Override
protected void onStop() {
System.out.println("onStop");
super.onStop();
}
類似這樣的@Override 主程式目標則是要傳一個intent到另一個activity開啟一個view
程式首先會 print onStart 接著onResume也會被叫到  ,再來intent將畫面轉到另一個activity時
會呼叫onPause跟onStop 從另一個activity再跳回來時則會再呼叫onStart 跟onResume
結束程式時會呼叫onDestory  大致是這樣 進階用法就是 利用會呼叫的生命週期特性
去儲存一些值 喚回的時候可以再利用

不過最近正在想辦法怎麼不去叫onResume
想到的方法就是設立boolean 再進入前先判斷的機制

也可以拿來作測試

以上!

更多activity的參考
androidbmi-activity的生命週期

http://blog.aztaru.com/2009/12/10/%E7%AD%86%E8%A8%98android-%E7%9A%84-activity-lifecycle/

http://rritw.com/a/caozuoxitong/android/2011/1123/145664.html

Android Activity 筆記


Google Android SDK實戰演練-Activity的生命週期

android生命周期的例子






沒有留言:

張貼留言