Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android了解四大基本組件

Android了解四大基本組件

編輯:關於Android編程

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

一:了解四大基本組件

Activity :

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

一個Activity通常展現為一個可視化的用戶界面。例如,一個activity可能展現為一個用戶可以選擇的菜單項列表或者展現一些圖片以及圖片的標題。一個消息服務應用程序可能包含一個顯示聯系人列表的activity,一個編寫信息的activity,以及其它一些查看信息和修改應用程序設置的activity。雖然這些activity一起工作,共同組成了一個應用程序,但每一個activity都是相對獨立的。每一個activity都是Activity(android.app.Activity)的子類。

一個應用程序可能只包含一個activity,或者像上面提到的消息服務程序一樣有多個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:系統設置和偏好設置


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved