Android瞭解四大基本組件

來源:互聯網
上載者:User

Android四大基本組件分別是Activity,Service服務,Content Provider內容提供者,BroadcastReceiver廣播接收器。

一:瞭解四大基本組件

Activity :

應用程式中,一個Activity通常就是一個單獨的螢幕,它上面可以顯示一些控制項也可以監聽並處理使用者的事件做出響應。

一個Activity通常展現為一個可視化的使用者介面。例如,一個activity可能展現為一個使用者可以選擇的功能表項目列表或者展現一些圖片以及圖片的標題。一個Message Service應用程式可能包含一個顯示連絡人清單的activity,一個編寫資訊的activity,以及其它一些查看資訊和修改應用程式設定的activity。雖然這些activity一起工作,共同組成了一個應用程式,但每一個activity都是相對獨立的。每一個activity都是Activity(android.app.Activity)的子類。

一個應用程式可能只包含一個activity,或者像上面提到的Message Service程式一樣有多個activity。一個應用程式套件組合含幾個activity以及各個activity完成什麼樣的功能完全取決於應用程式以及它的設計。通常每個應用程式都包含一個在應用程式啟動後第一個展現給使用者的activity。在當前展現給使用者的activity中啟動一個新的activity,可以實現從一個activity轉換到另外一個activity。

每個activity都會有一個用於繪製使用者介面的視窗。通常這樣一個視窗會填充整個螢幕,當然這個視窗也可以比螢幕小並漂浮在其他視窗之上。activity還可以使用一些額外的視窗,例如一個要求使用者響應的彈出式對話方塊,或者是當使用者在螢幕上選擇一個條目後向使用者展現一些重要訊息的視窗。

展示activity視窗的可視化內容地區是一些具有層次關係(很像資料結構中的樹)的視圖,而視圖則是由類View的子類表示的。每個視圖控制視窗中的一個矩形地區。父視圖包含一些子視圖並管理子視圖的布局。位於分葉節點的視圖直接控制並響應使用者的動作。因此視圖就是activity與使用者互動的介面。例如,一個顯示圖片的視圖,當使用者單擊的時候它可能會啟動一個動作。Android有許多開發人員可以直接使用的視圖,包括按鈕,文本域,捲軸,菜單,複選框等。

通過調用Activity.setContentView()方法來設定展現activity的視窗的視圖。內容視圖則是視圖階層中的根節點視圖

Service服務:

service沒有使用者介面,但它會在後台一直運行。例如,service可能在使用者處理其它事情的時候播放背景音樂,或者從網路上擷取資料,或者執行一些運算,並把運算結構提供給activity展示給使用者。每個service都擴充自類Serivce。

service可以在和多場合的應用中使用,比如播放多媒體的時候使用者啟動了其他Activity這個時候程式要在後台繼續播放,比如檢測SD卡上檔案的變化,再或者在後台記錄你地理資訊位置的改變等等,總之服務嘛,總是藏在後頭的。

多媒體播放器播放音樂是應用service的一個非常好的例子。多媒體播放器程式可能含有一個或多個activity,使用者通過這些activity選擇並播放音樂。然而,音樂回放並不需要一個activity來處理,因為使用者可能會希望音樂一直播放下去,即使退出了播放器去執行其它程式。為了讓音樂一直播放,多媒體播放器activity可能會啟動一個service在背景播放音樂。Android系統會使音樂回放service一直運行,即使在啟動這個service的activity退出之後。

應用程式可以串連到一個正在運行中的service。當串連到一個service後,可以使用這個service向外暴露的介面與這個service進行通訊。對於上面提到的播放音樂的service,這個介面可能允許使用者暫停,停止或重新播放音樂。

一個Service 是一段長生命週期的,沒有使用者介面的程式,可以用來開發如監控類程式。比較好的一個例子就是一個正在從播放清單中播放歌曲的媒體播放器。在一個媒體播放器的應用中,應該會有多個activity,讓使用者可以選擇歌曲並播放歌曲。然而,音樂重放這個功能並沒有對應的activity,因為使用者當然會認為在導航到其它螢幕  時音樂應該還在播放的。在這個例子中,媒體播放器這個activity 會使用Context.startService()來啟動一個service,從而可以在後台保持音樂的播放。同時,系統也將保持這個service 一直執行,直到這個service 運行結束。另外,我們還可以通過使用Context.bindService()方法,串連到一個service 上(如果這個service 還沒有運行將  啟動它)。當串連到一個service 之後,我們還可以service 提供的介面與它進行通訊。拿媒體播放器這個例子來說,我們還可以進行暫停、重播等操作。

與activity以及其它組件一樣,service同樣運行在應用程式進程的主線程中。所以它們不能阻塞其它組件或使用者介面,通常需要為這些service派生一個線程執行耗時的任務。

Service和其他組件一樣,都是運行在主線程中的,因此不能用它來做耗時的操作。如果需要耗時的操作,那麼你就應該在服務中開啟另一個線程,在另外的線程中操作。

Service和其他的應用組件一樣,運行在進程的主線程中。這就是說如果service需要很多耗時或者阻塞的操作,需要在其子線程中實現。

Service可分為兩種:

1. 本地服務:Local Service 用於應用程式內部

Local Service用於應用程式內部。在Service可以調用Context.startService()啟動,調用Context.stopService()結束。在內部可以調用Service.stopSelf()或Service.stopSelfResult()來自己停止。無論調用了多少次startService(),都只需調用一次stopService()來停止。

它可以啟動並運行,直至有人停止了它或它自己停止。在這種方式下,它以調用Context.startService()啟動,而以調用Context.stopService()結束。它可以調用Service.stopSelf() 或 Service.stopSelfResult()來自己停止。不論調用了多少次startService()方法,你只需要調用一次stopService()來停止服務。

  用於實現應用程式自己的一些耗時任務,比如查詢升級資訊,並不佔用應用程式比如Activity所屬線程,而是單開線程後台執行,這樣使用者體驗比較好。

2. 遠程服務:Remote Service 用於android系統內部的應用程式之間

Remote Service用於android系統內部的應用程式之間。可以定義介面並把介面暴露出來,以便其他應用進行操作。用戶端建立到服務物件的串連,並通過那個串連來調用服務。調用Context.bindService()方法建立串連,並啟動,以調用 Context.unbindService()關閉串連。多個用戶端可以綁定至同一個服務。如果服務此時還沒有載入,bindService()會先載入它。

它可以通過自己定義並暴露出來的介面進行程式操作。用戶端建立一個到服務物件的串連,並通過那個串連來調用服務。串連以調用Context.bindService()方法建立,以調用 Context.unbindService()關閉。多個用戶端可以綁定至同一個服務。如果服務此時還沒有載入,bindService()會先載入它。

  可被其他應用程式複用,比如天氣預報服務,其他應用程式不需要再寫這樣的服務,調用已有的即可。

BroadcastReceive廣播接收器:

broadcase receiver不執行任何任務,僅僅是接受並響應廣播通知的一類組件。大部分廣播通知是由系統產生的,例如改變時區,電池電量低,使用者選擇了一幅圖片或者使用者改變了語言喜好設定。應用程式同樣也可以發送廣播通知,例如通知其他應用程式某些資料已經被下載到裝置上可以使用。

一個應用程式可以包含任意數量的boradcase reveiver來響應它認為很重要的通知。所有的broadcast receiver都擴充自類BroadcastReceiver。

broadcast receiver不包含任何使用者介面。然而它們可以啟動一個activity以響應接受到的資訊,或者通過NotificationManager通知使用者。可以通過多種方式使使用者知道有新的通知產生:閃動背景燈、震動裝置、發出聲音等等。通常程式會在狀態列上放置一個持久的表徵圖,使用者可以開啟這個表徵圖並讀取通知資訊。

你的應用可以使用它對外來事件進行過濾只對感興趣的外來事件(如當電話呼入時,或者資料網路可用時)進行接收並做出響應。廣播接收器沒有使用者介面。然而,它們可以啟動一個activity或serice 來響應它們收到的資訊,或者用NotificationManager 來通知使用者。通知可以用很多種方式來吸引使用者的注意力──閃動背燈、震動、播放聲音等。一般來說是在狀態列上放一個持久的表徵圖,使用者可以開啟它並擷取訊息。

廣播類型:

普通廣播,通過Context.sendBroadcast(Intent myIntent)發送的

有序廣播,通過Context.sendOrderedBroadcast(intent, receiverPermission)發送的,該方法第2個參數決定該廣播的層級,層級數值是在 -1000 到 1000 之間 , 值越大 , 發送的優先順序越高;廣播接收者接收廣播時的層級層級(可通過intentfilter中的priority進行設定設為2147483647時優先順序最高),同層級接收的先後是隨機的, 再到層級低的收到廣播,進階別的或同層級先接收到廣播的可以通過abortBroadcast()方法截斷廣播使其他的接收者無法收到該廣播,還有其他建構函式,所謂有序,就是每個receiver執行後可以傳播到下一個receiver,也可以完全中止傳播--不傳播給其他receiver。 而receiver啟動並執行順序可以通過matched intent-filter 裡面的android:priority來控制,當priority優先順序相同的時候,Receiver以任意的順序運行。

非同步廣播,通過Context.sendStickyBroadcast(Intent myIntent)發送的,還有sendStickyOrderedBroadcast(intent, resultReceiver, scheduler, initialCode, initialData, initialExtras)方法,該方法具有有序廣播的特性也有非同步廣播的特性;發送非同步廣播要: "android.permission.BROADCAST_STICKY" />許可權,接收並處理完Intent後,廣播依然存在,直到你調用removeStickyBroadcast(intent)主動把它去掉。它們都運行在一個未定義的順序,通常是在同一時間。這樣會更有效,但意味著receiver不能包含所要使用的結果或中止的API。

要注意的是,即使是Normal broadcasts,系統在某些情況下可能會恢複到一次傳播給一個receiver。 特別是receiver可能需要建立一個進程,為了避免系統超載,只能一次運行一個receiver。

 Broadcast Receiver 並沒有提供可視化的介面來顯示廣播資訊。可以使用Notification和Notification Manager來實現可視化的資訊的介面,顯示廣播資訊的內容,表徵圖及震動資訊。

注意:發送廣播時的intent參數與Contex.startActivity()啟動起來的Intent不同,前者可以被多個訂閱它的廣播接收器調用,後者只能被一個(Activity或service)調用

Content Provider內容提供者 :

ContentProvider(內容提供者)是Android中的四大組件之一。主要用於對外共用資料,也就是通過ContentProvider把應用中的資料共用給其他應用訪問,其他應用可以通過ContentProvider對指定應用中的資料進行操作。ContentProvider分為系統的和自訂的,系統的也就是例如連絡人,圖片等資料。
 android中對資料操作包含有:
 file, sqlite3, Preferences, ContectResolver與ContentProvider前三種資料操作方式都只是針對本應用內資料,程式不能通過這三種方法去操作別的應用內的資料。android中提供ContectResolver與ContentProvider來操作別的應用程式的資料。

應用程式可以通過contentprovider訪問其它應用程式的一些私人資料,這是Android提供的一種標準的共用資料的機制。共用的資料可以是儲存在檔案系統中、SQLite資料庫中或其它的一些媒體中。content provider擴充自ContentProvider類,通過實現此類的一組標準的介面可以使其它應用程式存取由它控制的資料。然而應用程式並不會直接調用ContentProvider中的方法,而是通過類ContentResolver。ContentResolver能夠與任何一個ContentProvider通訊,它與ContentProvider合作管理進程間的通訊。

任何時候當Android系統收到一個需要某個組件進行處理的請求的時候,Android會確保處理此請求的組件的宿主進程是否已經在運行,如果沒有,則立即啟動這個進程,當請求的組件的宿主進程已經在運行,它會繼續查看請求的組件是否可以使用,如果不能立即使用,它會建立一個請求的組件的執行個體來響應請求。

ContentProvider是在應用程式間共用資料的一種介面機制,它使其它的應用程式儲存或讀取此ContentProvider的各種資料類型。

ContentProvider提供了更進階的資料共用方法,應用程式可以指定需要共用的資料,而其它應用程式則可以在不知資料來源、路徑的情況下,提供了查詢、添加、刪除和更新共用資料等操作的介面。許多Android系統的內建資料也通過ContentProvider提供給使用者使用,如通訊錄、音視頻檔案和影像檔等。

ContentProvider的資料模式類似於資料庫的資料表,每行是一條資料,每列具有相同的資料類型。每條記錄都有一個long型的欄位_ID,用來唯一標識每一條記錄。ContentProvider可以提供多個資料集,調用者使用URI對不同的資料集的資料進行操作。

android平台提供了Content Provider使一個應用程式的指定資料集提供給其他應用程式。這些資料可以儲存在檔案系統中、在一個SQLite資料庫、或以任何其他合理  的方式,其他應用可以通過ContentResolver類(見ContentProviderAccessApp例子)從該內容提供者中擷取或存入資料.(相當於在應用外包了一層殼),只有需要在多個應用  程式間共用資料是才需要內容提供者。例如,通訊錄資料被多個應用程式使用,且必須儲存在一個內容提供者中它的好處:統一資料訪問方式。android系統內建的內容提供  者(頂級的表示資料庫名,非頂級的都是表名)這些內容提供者在SDK文檔的android.provider Java包中都有介紹。

    見:http://developer.android.com/reference/android/provider/package-summary.html

├────Browser

├────CallLog

├────Contacts

│ ├────Groups

│ ├────People

│ ├────Phones

│ └────Photos

├────Images

│ └────Thumbnails

├────MediaStore

│ ├────Albums

│ ├────Artists

│ ├────Audio

│ ├────Genres

│ └────Playlists

├────Settings

└────Video

CallLog:地址和接收到的電話資訊

Contact.People.Phones:儲存電話號碼

Setting.System:系統設定和喜好設定


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.