Android四大組件

Android的四大組件包括:Activity、Service、BroadcasReceiver、ContentProvider,下面我們一一來分析這四大組件。

一、Activity

Activity是我們Android開發中最常用的組件,提到activity就不得不說說它的生命周期:

onCreate: 該方法是在Activity被創建時回調,它是生命周期第一個調用的方法,我們在創建Activity時一般都需要重寫該方法,然後在該方法中做一些初始化的操作,如通過setContentView設置界面布局的資源,初始化所需要的組件信息等。

onStart: 此方法被回調時表示Activity正在啟動,此時Activity已處於可見狀態,只是還沒有在前台顯示,因此無法與用戶進行交互。

Advertisements

onResume: 當此方法回調時,則說明Activity已在前台可見,可與用戶交互了(處於前面所說的Active/Running形態)。當然從流程圖,我們也可以看出當Activity停止后(onPause方法和onStop方法被調用),重新回到前台時也會調用onResume方法,因此我們也可以在onResume方法中初始化一些資源,比如重新初始化在onPause或者onStop方法中釋放的資源。

onPause: 此方法被回調時則表示Activity正在停止(Paused形態),一般情況下onStop方法會緊接著被回調。在onPause方法中我們可以做一些數據存儲或者動畫停止或者資源回收的操作,但是不能太耗時,因為這可能會影響到新的Activity的顯示——onPause方法執行完成後,新Activity的onResume方法才會被執行。

Advertisements

onStop: 一般在onPause方法執行完成直接執行,表示Activity即將停止或者完全被覆蓋(Stopped形態),此時Activity不可見,僅在後台運行。

onRestart:表示Activity正在重新啟動,當Activity由不可見變為可見狀態時,該方法被回調。這種情況一般是用戶打開了一個新的Activity時,當前的Activity就會被暫停(onPause和onStop被執行了),接著又回到當前Activity頁面時,onRestart方法就會被回調。

onDestroy:此時Activity正在被銷毀,也是生命周期最後一個執行的方法,一般我們可以在此方法中做一些回收工作和最終的資源釋放。

二、Service

Service主要用於在後台處理一些耗時操作或者執行一些需要長期運行的任務,我們經常會需要在程序退出之後,還需要保持service運行去處理一些邏輯,常見的就是音樂播放器等等。

Service的啟動方式有兩種:startService()和bindService();使用startService會分別調用onCreate、onStartCommand、onDestroy,其中onCreate只有在service第一次啟動時才會調用,多次啟動只會調用onStartCommand一個方法,onDestory只有在service銷毀時才會調用。使用startService啟動服務,就需要stopService來停止服務,不管啟動了多少次service,只需要調用一次stopService就能夠停止服務。使用bindService會分別調用onCreate、onBind、onDestory,onBind會返回客戶端一個IBind介面實例,這樣就能夠把調用者和service連接起來了,這個在後面介紹Android IPC機制的時候會詳細說明。

注意:onStartCommand需要返回一個int類型,返回值不同代表不同模式:

START_NOT_STICKY

如果系統在onStartCommand()方法返回之後殺死這個服務,那麼直到接受到新的Intent對象,這個服務才會被重新創建。這是最安全的選項,用來避免在不需要的時候運行你的服務。

START_STICKY

如果系統在onStartCommand()返回后殺死了這個服務,系統就會重新創建這個服務並且調用onStartCommand()方法,但是它不會重新傳遞最後的Intent對象,系統會用一個null的Intent對象來調用onStartCommand()方法,在這個情況下,除非有一些被發送的Intent對象在等待啟動服務。這適用於不執行命令的媒體播放器(或類似的服務),它只是無限期的運行著並等待工作的到來。

START_REDELIVER_INTENT

如果系統在onStartCommand()方法返回后,系統就會重新創建了這個服務,並且用發送給這個服務的最後的Intent對象調用了onStartCommand()方法。任意等待中的Intent對象會依次被發送。這適用於那些應該立即恢復正在執行的工作的服務,如下載文件。

Service基本上都是在後台運行,其優先順序還是比較低,如果系統資源不足,service很可能會被系統自動回收掉。如果需要一直保持service的運行,這個時候就需要創建前台service,通過在service的oncreate方法中調用startForeground方法來創建,前台service會在系統狀態欄中顯示出來。

三、BroadcasReceiver

BroadcasReceiver就是我們常說的廣播接收器,用於接收一些系統廣播或者自定義廣播,然後進行相應的邏輯處理,比如接收系統啟動狀態或者時間變化狀態,也可以用於接收其他應用程序發送的自定義廣播來接收數據。

BroadcasReceiver分為兩種:

1、正常廣播 Normal broadcasts(用 Context.sendBroadcast()發送)是完全非同步的。它們都運行在一個未定義的順序,通常是在同一時間。這樣會更有效,但意味著receiver不能包含所要使用的結果或中止的API。

2、有序廣播 Ordered broadcasts(用 Context.sendOrderedBroadcast()發送)每次被發送到一個receiver。所謂有序,就是每個receiver執行后可以傳播到下一個receiver,也可以完全中止傳播--不傳播給其他receiver。 而receiver運行的順序可以通過matched intent-filter 裡面的android:priority來控制,當priority優先順序相同的時候,Receiver以任意的順序運行。

一個BroadcastReceiver 對象只有在被調用onReceive(Context, Intent)的才有效的,當從該函數返回后,該對象就無效的了,結束生命周期。在所調用的onReceive(Context, Intent)函數里,不能有過於耗時的操作,不能使用線程來執行。

BroadcastReceiver 的註冊方式有兩種,通過AndroidManifest.xml聲明方式為靜態註冊,通過registerReceiver函數為動態註冊,靜態註冊為常駐廣播接收器,聲明則一直有效,而動態註冊的廣播接收器生命周期和activity一樣,當activity被銷毀后,廣播接收器也會被銷毀。

四、ContentProvider

ContentProvider(內容提供者)主要用於對外共享數據,也就是通過ContentProvider把應用中的數據共享給其他應用訪問,其他應用可以通過ContentProvider對指定應用中的數據進行操作。

Android開發經常需要做數據存儲操作,一般使用files、database和SharedPreferences三種方式,而這些方式都只是針對自身應用的數據,如果需要獲取到其他應用的數據,就需要使用到ContentProvider了。

android中提供ContectResolver與ContentProvider來操作別的應用程序的數據。一個應用實現ContentProvider來提供內容給別的應用來操作,一個應用通過ContentResolver來操作別的應用數據,當然在自己的應用中也可以。使用ContentProvider的時候,我們需要定義一個Uri供其他應用來訪問,其實就相當與我們平時使用的網址。Uri分為三部分:

  第一部分是"content://",相當於網址中的"http://"。

  第二部分是主機名或authority,用於唯一標識這個ContentProvider,外部應用需要根據這個標識來找到它,可以看作是網址中的主機名。

  第三部分是路徑名,用來表示將要操作的數據,可以看作網址中細分的內容路徑。

Advertisements

你可能會喜歡