2013年3月19日 星期二

[Android] Android Developer App Components Note 2

為了避免找不到對應的網頁,
接下來每一篇都會給出原文網頁的連結。
本篇是Application Component

2. Application Component(應用程式組件)
應用程式組件是一隻Android app中的必要組成。
每個組件都是一個系統可以進入你的app的進入點
當然,對使用者來說不是所有的組件(components)都是進入點(entry point),
且一部分是互相依賴。
但每一個組件都有其自己的實體,並且扮演一個特定的腳色:
(他們每一個)都是一個區塊(block),可以幫你來定義app的整體行為。

應用程式組件共分為四種,各自提供截然不同的目的而且有明顯的生命週期(lifecycle),
作為定義一個組件何時生滅(created and destroyed)。(天啊這句我翻得好帥氣XDDD)

下面介紹這四種應用程式組件:

Activities(活動) (不過應該沒有人會刻意叫它中文因為大概會愣住XD)
    一個activity代表一個有著使用者介面的單一的螢幕。舉例來說,
一個e-mail app大概會有:
    a. 用來顯示新信件列表的activity
    b. 用來寫信的activity
    c. 用來讀信的activity
雖然activities之間協力合作來形成一個無接縫感的(cohesive)e-mail app的使用者體驗,
每個activity之間仍是相互獨立的。因此,一個不同的app,
可以打開任何一個e-mail app中的activity(如果e-mail app有允許的話)。
舉例來說你可以用相機的app拍照然後呼叫e-mail app中發新信的activity,
讓使用者得以分享照片。
一個activity是作為Activity這個類別的子類別來實作的。

Services(服務)
    service是一種跑在背景的組件,它目的是為了執行長期運轉的操作,
或是處理遠端操控程序。 一個服務本身不提供使用者介面
舉例來說,service可能做的事是像在背景播音樂(前景是別的app),
或者是邊從網路下載檔案但不去擋到使用者和activity的互動
別的組件(比如activity)可以啟動一個service然後放給它跑,
或跟它作結合作為之後的互動使用。
一個service是作為Service這個類別的子類別來實作的。

Content providers(內容提供者)
    content provider管理一組共用的app資料。你可以將檔案存在檔案系統、
SQL資料庫、網路上、或其他你的app可以存取的儲存空間。
透過它,別的程式可以去讀取(query)甚至修改資料。(如果它允許的話)
舉例來說,任一個Android的系統提供了一個content provider,
它管理了使用者的通訊錄。任何的app只要有取得適當的授權允許(permissions),
就可以取得一部分content provider的資料來讀寫存取特定的一筆聯絡人。

content provider也適合在讀寫只供app本體使用且不分享的私密資料。

一個content provider是作為ContentProvider這個類別的子類別來實作的,
而且必須實作一套標準的API來令其他app能實行交易(transactions)。

Broadcast receivers(區域廣播接受器)
    broadcast receiver是用來對系統全域廣播做反應的組件。
很多廣播是源於系統,比方說:
螢幕關掉了、電源不足、相片已被擷取......等。
app也可以發起廣播,比方說可以告訴使用者資料已經下載好可以用了之類的。
雖然它並不用使用者介面,但可能產生狀態列通知(status bar notification),
作為提示使用者有廣播的事件發生了。在絕大多數的狀況,
一個broadcast receiver只是一個到別的組件的"閘道",
且偏向只做很小一部分的工作。
舉例來說,事件發生時,它可能會開一個service來做工作(而不是自己做)。


一個broadcast receiver是作為BroadcastReceiver這個類別的子類別來實作的,
而且每次的廣播是作為Intent的物件來傳遞的。



Android系統設計的一個特殊角度是,任何一個app可以去開另一個app的組件
舉例來說,如果你要使用者去用裝置的相機來拍照,
大概早就有人寫相機的app可以讓你的app直接用了,
那你就不用自己寫activity來處理它,只要去開人家的activity,
再拿回拍好的photo就好了。然而就使用者看起來,
拍照的過程好像也是你整個app的一部分。

當系統開始一個組件,它就開始了app的程序(process)
(如果不是原先已經在跑的話),並初始化相應所需的組件的classes。
舉例來說,如果你的app拿人家的相機app來照相,
那麼拍照的activity是在相機app的程序而非你的app的程序裡跑。
所以不像其他大多數的系統,android系統沒有單一的進入點。
(最直觀來看就是沒有main()這樣的主函式)

因為系統在每個app上都是在分開的程序裡跑,
各程序有其檔案權限許可來限制對其他app的存取。
你的app不能直接對別的app中的組件來啟動,
但這對Android系統來說是可以的XD!

所以要啟動別家app的組件的話,你得把訊息包在intent裡面,
交給系統要它開個特定的組件,系統接下來就會啟動組件給你。

註:
就像是當你拍了照或掃了QR Code或點了網址以後,
出現一串相應的清單,你可以選擇相應的程式來操作後續。





沒有留言:

張貼留言