Android 101
Table of contents
架構圖
Key Components
- Activity 與User互動的class,可想像成是一個/畫面/
- View 可視的元件的共同祖先
- Context 環境變數及資源存取的class
- Services 背景作業的服務程式
- Broadcast receivers 接收廣播(Broadcast)事件
- Content providers 提供內容(資料)給程式使用
- Widgets 各種視覺化元件
- Intents 應用程式內部的訊息傳遞系統
- Notifications 通知系統,會以比較明顯的方式顯示在瑩幕上
Activity
一個Activity就是一個畫面或是一個表單(Form),所有與使用者的互動,都是基於Activity
,實作時會把一個View(通常是Layout)設定到Activity
生命周期
Activity共有四種狀態
- active or running (作用中)
- paused (暫停)
- stopped (停止)
- finish (結束)
上圖中的onXxx() methods是callback method,也就是說,當從某個狀態轉換到某個狀態時,會回呼相對的onXxx() methods
View
View是UI的元件的共同祖先
類別結構圖
View
是所有可視元件(component)的基本,除了基本的UI元件(TextEdit,
Button)外,也是View
Group的父類別。
View Group
多個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),像是播放音樂,從網路汲取資料等類似的服務。
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的功能(重要)
- 是否可以呼叫沒有source的Applications?
- 如果得知無source的applications的服務有那些?
- 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
所有在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>
- “\”符號可以避免產生額外的空白
- <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
- http://www.vogella.de/android.html
- 這邊的教學的質量都很不錯