Table of contents


架構圖

Key Components

  1. Activity 與User互動的class,可想像成是一個/畫面/
  2. View 可視的元件的共同祖先
  3. Context 環境變數及資源存取的class
  4. Services 背景作業的服務程式
  5. Broadcast receivers 接收廣播(Broadcast)事件
  6. Content providers 提供內容(資料)給程式使用
  7. Widgets 各種視覺化元件
  8. Intents 應用程式內部的訊息傳遞系統
  9. Notifications 通知系統,會以比較明顯的方式顯示在瑩幕上

Activity

一個Activity就是一個畫面或是一個表單(Form),所有與使用者的互動,都是基於Activity,實作時會把一個View(通常是Layout)設定到Activity

生命周期

Activity共有四種狀態

  1. active or running (作用中)
  2. paused (暫停)
  3. stopped (停止)
  4. finish (結束)

activity_lifecycle.png

上圖中的onXxx() methods是callback method,也就是說,當從某個狀態轉換到某個狀態時,會回呼相對的onXxx() methods

View

View是UI的元件的共同祖先

類別結構圖

view_hierachy.png

View是所有可視元件(component)的基本,除了基本的UI元件(TextEdit, Button)外,也是View Group的父類別。

View Group

view_group_hierachy.png

多個view可以組成View Group,而布局控制(Layout)也是View Group的子類別

Web View

Web View元件執行後,會像browser功能,但它可以直接與Java code互動。 ex: google mail本身有些mail reading operations,像是讀取、刪除、回覆…,但這些操作都是適合在一般電腦的瀏覽器操作,而Web View可以把他轉換成Android的Buttons

Context

Services

Services是在背景執行的服務程式(執行在main thread),像是播放音樂,從網路汲取資料等類似的服務。

android_101_001.png

Broadcast receivers

Broadcast receivers是用來接收系統或使用者發出來廣播事件。 系統在使用者變更設定、語系設定、動作完成等事件時,皆會發出廣播事件,使用者也可以發出自行定義的廣播事件。

Content Providers

要將某一應用程式資料提供給另一應用程式時,可透過Content providers達到資料共享的目的。

例如,如果自行客製的程式,需要存取通訊錄時,可透過通訊錄程式所提供的Content Providers得到通訊息的內容。

Run Demo Applications

每個不同版本的Android,都會有些Demo程式,這些Demo程式放在ANDROID_HOME/samples/android-7/底下 (Android 2.1),可透過Eclipse IDE的Import Exists Project匯入專案,匯入後即可執行這些Demo程式。

Process Management

  • Android允許多個Process同時運時
  • 每個Process可以reuse其他process的功能(重要)
    1. 是否可以呼叫沒有source的Applications?
    2. 如果得知無source的applications的服務有那些?
    3. Dependency Checking?
  • Process是Kernel管理,非活動的process會放到System Process裡
  • System Process裡的processes可能會被消滅(destroy),但當該Application被再被active時,process的狀態會被再次回復。

Location Manager

用來管理GPS之類的服務

啟動application的intent
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

Resource Management

2010-7-24_13-59-15.png

所有在PROJECT_HOME\res目錄底下的所有xml檔,會被編譯成R.java,xml檔案名稱會被編譯成field name,在程式中,便可透過標準的java語法來存取Resource

ex: /ApiDemos/res/layout/activity_animation.xml 會被編譯成R.layout.activity_animation

  • @+id 表示新增一個id,@id表示引用一個id
  • @ 表示參照到resource file裡
  • ? 表示參照到theme裡

Units

  • px (pixels): Dots on the screen.
  • in (inches): Size as measured by a ruler.
  • mm (millimeters): Size as measured by a ruler.
  • pt (points): 1/72 of an inch.
  • dp (density-independent pixels): An abstract unit based,on the density of the screen. On a display with 160 dots, per inch, 1dp = 1px.
  • dip: Synonym for dp, used more often in Google examples.
  • sp (scale-independent pixels): Similar to dp but also scaled by the user’s font size preference.

建議文字的單位總是採用sp,其他單位總是採用dip

landscape layout

在landscape mode時,如果layout效果不理想,有時必須另外建立一個lanscape mode專用的layout

res/layout-land/main.xml

String resource

string.xml裡的字串,可以有格試設定,像是

<string name="some_text">\
 a <i>blocks</i> string
</string>

  1. “\”符號可以避免產生額外的空白
  2. <i>blocks</i>可以讓字體變粗體

MISC

Event Mediator

在實務應用上,常會把多個元件(此例中的button)的listener設定為元件所屬的Activity ,然後宣告該Activity implements OnClickListener,在Activity的onClick event裡在判斷click的目標對象是那個元件,然後進行該元件進行處理。

public class My extends Activity implements OnClickListener {
    private Button myButton;
    private Button myButton2;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.about);
        myButton.setOnClickListener(this);
        myButton2.setOnClickListener(this);
    }
 
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.myButton:
            // action for myButton click
            break;
            case R.id.myButton2:
            // action for myButton2 click
            break;
        }
    }
}

不過,讓Activity implements OnXXXListener很容易造成Activity的太多methods,尤其是有些listener的methods一堆,但真正需要實作的只有其中一兩個, 所以,有時會用inner class來實作。

public class My extends Activity  {
    private Button myButton;
    private Button myButton2;
    class MyOnClickListener implements OnClickListener   {
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.myButton:
            // action for myButton click
            break;
            case R.id.myButton2:
            // action for myButton2 click
            break;
        }
    }
    }
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.about);
                MyOnClickListener myOnClickListener = new MyOnClickListener()
        myButton.setOnClickListener(myOnClickListener);
        myButton2.setOnClickListener(myOnClickListener);
    }
 
}

是否採用service來播放music? 這取決於是否activity結束後,是否要繼續播放的動作。用service,可以在activity結束後繼續播放的動作。

Resources