2010年10月19日 星期二

Android基本概念

一.基本概念
Android Application是使用Java開發,compile成Java code,再利用Appt Tool將相關的resource包裝成apk檔,讓使用者可以下載安裝到他的device上,每個Application會以下列方式在系統執行。
1.每個App跑自己獨立的Linux Process,在不使用時關閉
2.每個Process有自己的VM,所以Ap是在一個完全隔離的環境下運作
3.預設每個App指定一個唯一的Linux user ID,App file只允許該
  App與該User使用,若要讓不同的App共用資料則要設定相同的
  User ID

二.元件
Android一個相當重要的特性是,每個App內包含了許多的元件,每個元件的功能都可以提供其他的App使用,你所開發的App想要使用其他App已經開發好的功能元件,不需要在程式內全部包進來或是去link它,也就是說系統會自行判斷,可以任何需要的時候去啟動任何Application的任何部份功能。

Android App並沒有一個單一的程式進入點(如main()),而是存在著以下四種元件,在必要時就實體化來使用執行
1.Activities
    每個Activity都繼承自Activity Class。
    Activity負責提供使用者介面讓使用者操作與互動。
    一個App可以包含一到多個Activity,在App起始時啟動,一個
    Activity,再由已開啟的Activity去開啟其他的Activity。
    每個Activity都會包含一個Window用來顯示畫面,預設window會
    填滿整個screen(手機),但window可以設定的更小或浮動在其他
    window上,例如popup window,window上所放的物件都是繼承自
    View Class,每個view都佔據著window內的一個矩形區塊,上層
    的view負責其子元素的layout安排,而最底層的child view則負
    責直接回應使用者的動作與輸入,利用Activity.setContentView()
    設定Activity最上層使用的View
    
2.Services
    Service提供一個可以在背景定時執行,無使用者介面的服務。
    譬如說在背景播放音樂,或是在internet上取得資料提供給
    Activity使用。    
    
3.Broadcast receivers
    繼承自BroadcastReceiver Class
    Broadcast receiver 是用來接收廣播的訊息並做回應,許多的
    廣播是來自於系統,譬如說時區改變、電池電力不足或使用者改
    變語系等,另外廣播也可來自於App的其他元件所發出來,例如
    App在下載完資料可以提供給其他App使用時,可以透過廣播讓其
    他App的Broadcast receiver可以接收到並使用
    
    Broadcast receiver沒有UI,但他可啟動Activity去顯示回應,
    或使用NotificationManager去提示使用者。
    Notification可以是device振動、或是閃爍...播放音效等可以
    吸引使用者注意,通常都會在螢幕上放一個icon,當Broadcast
    receiver接收到訊息要提示使用者,可以用NotificationManager
    讓icon有所變化    
    
4.Content providers
    繼承自ContentProvider
    Content provider提供可以讓其他App使用的data,data可以用
    file或sqlite形式儲存,提供讓其他App可以讀取與儲存資料的
    方法。App並不能直接呼叫ContentProvider的method,而是需要
    透過ContentResolver物件來呼叫ContentProvider。
    ContentResolver可以跟任何的ContentProvider做溝通,利用他
    來管理內部程序上的溝通

三.使用intent啟動元件
除了ContentProvider是透過ContentResolver來驅動使用外,其他三種元件的啟動都是透過Intent來啟動,一個intent物件是包含了要執行的內容資訊。對activities 與 services來說,intent包含了要執行的action與要用的data URI,譬如開啟圖片的連結位置等資訊,對Broadcast receiver來說,包含了要發布的action,例如當相機按鈕被按下時,將這按下按鈕的訊息發布給接收者

以下是各種元件的啟動方式
1.Activity
    透過傳遞intent物件給Context.startActivity()來啟動。接收
    到這intent的Activity,在Activity內可以透過getIntent()取
    得該intent資料。    
    一個Activity通常是由另一個Activity所觸發,如果在觸發的
    Activity後想要得到回傳資料,則改用
    Activity.startActivityForResult()來啟動Activity。
    例如要啟動另一個Activity讓使用者可以選取圖片,當使用者
    選好後,希望把選好的圖片回傳回來,回傳的資料會是用intent
    物件被回傳到原呼叫者的onActivityResult()內
2.Service
    透過傳遞intent到 Context.startService()內或是呼叫Service
    的onStart()來啟動Service。
    同樣的可以將intent傳給Context.bindService()在元件與Service
    間建立一個持續性的連線,當建立連線時,系統即會自動觸發
    Service內的onBind(),同時把intent物件丟給onBind(),若在呼
    叫onBind時,若還沒建立連線,則會自動呼叫bindService()建立,
    接下來就可以使用Service本身的method來用
3.Broadcast receiver
     透過傳遞intent到Context.sendBroadcast()、Context.sendOrderedBroadcast(),
     與Context.sendStickyBroadcast(),就可以把intent包好的訊息
     廣播出去,系統就會自動觸發有興趣的Broadcast receiver內部的
     onReceive(),同時onReceive()會接收到這個intent物件在做後續
     的處理程序    

四.關閉元件
ContentProvider只回應ContentResolver的需求,Broadcast receiver只在回應廣播時啟動,所以這兩種元件都不需要手動去關閉它,需要被關閉的元件只有Activity與Service。
1.Activity本身可透過finish()來關閉,而要關閉其他的Activity,
  例如利用startActivityForResult(),所啟動的Activity可以利用
  finishActivity()來關閉其他Activity
2.service本身可以透過stopSelf()關閉,或由外部透過
  Context.stopService()關閉,當元件已經不再被使用或當系統記
  憶體不足時會被強制關閉
五.manifest設定檔
一個Android程式包含了許多的元件還有resource檔案,在Android使用之前,需先確認資料的存在,每個App內都會有一個結構性的描述檔 AndroidManifest.xml,包含了包括activity,service,receiver,provider 等元素宣告,activity,service,provider若沒宣告在manifest檔案內,在系統內是無法使用的,只有receiver除了可以宣告在manifest內,也可以透過Context.registerReceiver()動態產生註冊到系統內

沒有留言: