Android的四大組件有:Activity、Service、Content provider、Broadcast receiver;java
1、Activityandroid
(1)一個Activity一般就是一個單獨的屏幕(窗口)。數據庫
(2)Activity之間經過Intent進行通訊。app
(3)android應用中每個Activity都必需要在AndroidManifest.xml配置文件中聲明,不然系統將不識別也不執行該Activity。ide
Activity的生命週期的各類設計
一、 onCreate :當活動第一次啓動的時候,觸發該方法,能夠在此時完成活動的初始化工做。
onCreate 方法有一個參數,該參數能夠爲空( null ),也能夠是以前調用 onSaveInstanceState ()方法保存的狀態信息。
二、onStart :該方法的觸發表示所屬活動將被展示給用戶。
三、onResume :當一個活動和用戶發生交互的時候,觸發該方法。
四、onPause :當一個正在前臺運行的活動由於其餘的活動須要前臺運行而轉入後臺運行的時候,觸發該方法。這時候須要將活動的狀態持久化,好比正在編輯的數據庫記錄等。
五、onStop :當一個活動再也不須要展現給用戶的時候,觸發該方法。若是內存緊張,系統會直接結束這個活動,而不會觸發 onStop 方法。 因此保存狀態信息是應該在onPause時作,而不是onStop時作。活動若是沒有在前臺運行,都將被中止或者Linux管理進程爲了給新的活動預留足夠的存儲空間而隨時結束這些活動。所以對於開發者來講,在設計應用程序的時候,必須時刻牢記這一原則。在一些狀況下,onPause方法或許是活動觸發的最後的方法,所以開發者須要在這個時候保存須要保存的信息。
六、onRestart :當處於中止狀態的活動須要再次展示給用戶的時候,觸發該方法。
七、onDestroy :當活動銷燬的時候,觸發該方法。和 onStop 方法同樣,若是內存緊張,系統會直接結束這個活動而不會觸發該方法。
·onSaveInstanceState :系統調用該方法,容許活動保存以前的狀態,好比說在一串字符串中的光標所處的位置等。
一般狀況下,開發者不須要重寫覆蓋該方法,在默認的實現中,已經提供了自動保存活動所涉及到的用戶界面組件的全部狀態信息。xml
提到這個狀態那就是Activity棧了,和java同樣,遵循後進先出的原則對象
Activity狀態
通常認爲Activity有如下四種狀態:
活動的:當一個Activity在棧頂,它是可視的、有焦點、可接受用戶輸入的。Android試圖盡最大可能保持它活動狀態,殺死其它Activity來確保當前活動Activity有足夠的資源可以使用。當另一個Activity被激活,這個將會被暫停。
暫停:在不少狀況下,你的Activity可視可是它沒有焦點,換句話說它被暫停了。有可能緣由是一個透明或者非全屏的Activity被激活。
當被暫停,一個Activity仍會當成活動狀態,只不過是不能夠接受用戶輸入。在極特殊的狀況下,Android將會殺死一個暫停的Activity來爲活動的Activity提供充足的資源。當一個Activity變爲徹底隱藏,它將會變成中止。
中止:當一個Activity不是可視的,它「中止」了。這個Activity將仍然在內存中保存它全部的狀態和會員信息。儘管如此,當其它地方須要內存時,它將是最有可能被釋放資源的。當一個Activity中止後,一個很重要的步驟是要保存數據和當前UI狀態。一旦一個Activity退出或關閉了,它將變爲待用狀態。
待用: 在一個Activity被殺死後和被裝在前,它是待用狀態的。待用Acitivity被移除Activity棧,而且須要在顯示和可用以前從新啓動它。繼承
2、Service接口
一個Service 是一段長生命週期的,沒有用戶界面的程序,能夠用來開發如監控類程序。
Service使用步驟以下
1>繼承service類
2>AndroidManifast.xml配置清單文件中<application>節點裏對服務進行配置
<service name=".SMSService"/>
Service的啓動分兩種:context.startService()和context.bindService();
程序經過startService()和stopService()啓動和關閉Service時,Service與訪問者沒有太多關係,所以沒法進行通訊和數據交換,若是Service和訪問者之間須要進行通訊,應該調用bindService()綁定Service與訪問者,通訊結束後,在調用unBindService()解除綁定,退出Service.
生命週期
1. 使用context.startService() 啓動Service是會會經歷:
context.startService() ->onCreate()- >onStart()->Service running
context.stopService() | ->onDestroy() ->Service stop
若是Service尚未運行,則android先調用onCreate()而後調用onStart();若是Service已經運行,則只調用onStart(),因此一個Service的onStart方法可能會重複調用屢次。
stopService的時候直接onDestroy,若是是調用者本身直接退出而沒有調用stopService的話,Service會一直在後臺運行。該Service的調用者再啓動起來後能夠經過stopService關閉Service。
因此調用startService的生命週期爲:onCreate --> onStart(可屢次調用) --> onDestroy
2. 使用context.bindService()啓動Service會經歷:
context.bindService()->onCreate()->onBind()->Service running
onUnbind() -> onDestroy() ->Service stop
onBind將返回給客戶端一個IBind接口實例,IBind容許客戶端回調服務的方法,好比獲得Service運行的狀態或其餘操做。這個時候把調用者(Context,例如Activity)會和Service綁定在一塊兒,Context退出了,Srevice就會調用onUnbind->onDestroy相應退出。
因此調用bindService的生命週期爲:onCreate --> onBind(只一次,不可屢次綁定) --> onUnbind --> onDestory。
在Service每一次的開啓關閉過程當中,只有onStart可被屢次調用(經過屢次startService調用),其餘onCreate,onBind,onUnbind,onDestory在一個生命週期中只能被調用一次。
Service通訊:本地服務(Local Service)和遠程服務(Remote Service)
三. 廣播接受者BroadcastReceiver
一個broadcast receiver應該繼承BroadcastReceiver,而每個廣播是經過一個Intent對象來傳遞的。
發送廣播:
1.Context.sendBroadcast()發送的廣播,全部知足條件的BroadcastReceiver都會執行其onReceiver()方法來處理相應。
2.Context.sendOrderedBroadcast發送的有序廣播,會根據BroadcastReceiver註冊時IntentFilter的優先級順序來執行onReceiver()方法,優先
級在<intent-filter>的android:priority中聲明,也能夠在代碼中經過IntentFilter.setPriority()方法設置,數越大優先級別越高。
生命週期
只有十秒左右,若是在 onReceive() 內作超過十秒內的事情,就會報ANR(Application No Response) 程序無響應的錯誤信息
它的生命週期爲從回調onReceive()方法開始到該方法返回結果後結束
四. Content Provider內容提供者
1. android平臺提供了Content Provider使一個應用程序的指定數據集提供給其餘應用程序。這些數據能夠存儲在文件系統中、在一個SQLite數據庫、或以任何其餘合理的方式,其餘應用能夠經過ContentResolver類(見ContentProviderAccessApp例子)從該內容提供者中獲取或存入數據.(至關於在應用外包了一層殼)
2. Android系統爲這種跨應用的數據交換提供裏一個標準,ContentProvider。當用戶實現本身的ContentProvider時,須要實現以下抽象方法。
Insert(Uri, ContentValues):向ContentProvider插入數據。
Deleter(Uri,ContentValues):刪除ContentProvdier中指定數據。
Update(Uri, ContentValues, String, String[] ):更新ContentProvider中指定數據。
Query(Uri, String[], String, String[], String):從ContentProvider查詢數據。
3. ContentProvider使用URI來惟一標識其數據集,這裏的URI以content://做爲前綴,表示該數據由ContentProvider來管理。
它的好處:統一數據訪問方式