Android 開發(fā)的四大組件分別是:活動(dòng)(activity)让网,用于表現(xiàn)功能;服務(wù)(service)溃睹,后臺(tái)運(yùn)行服務(wù)因篇,不提供界面呈現(xiàn);廣播接受者(Broadcast Receive)竞滓,勇于接收廣播;內(nèi)容提供者(Content Provider)汽烦,支持多個(gè)應(yīng)用中存儲(chǔ)和讀取數(shù)據(jù)莉御,相當(dāng)于數(shù)據(jù)庫。
一牍颈、活動(dòng)(activity)
定義:
Activity是Android的四大組件之一琅关。是用戶操作的可視化界面;它為用戶提供了一個(gè)完成操作指令的窗口画机。當(dāng)我們創(chuàng)建完畢Activity之后新症,需要調(diào)用
setContentView()
方法來完成界面的顯示;以此來為用戶提供交互的入口荚醒。在Android App 中只要能看見的幾乎都要依托于Activity隆嗅,所以Activity是在開發(fā)中使用最頻繁的一種組件。
(1)一個(gè)Activity通常就是一個(gè)單獨(dú)的屏幕(窗口)泡躯。
(2)Activity之間通過Intent進(jìn)行通信。
(3)android應(yīng)用中每一個(gè)Activity都必須要在AndroidManifest.xml配置文件中聲明精续,否則系統(tǒng)將不識(shí)別也不執(zhí)行該Activity粹懒。在android stdio會(huì)自動(dòng)生成凫乖,但eclipse需要自己手動(dòng)添加。
(4)Activity的生命周期:
在Android中會(huì)維持一個(gè)Activity Stack(Activity棧)帽芽,當(dāng)一個(gè)新的Activity創(chuàng)建時(shí)导街,它就會(huì)放到棧頂,這個(gè)Activity就處于運(yùn)行狀態(tài)搬瑰。當(dāng)再有一個(gè)新的Activity被創(chuàng)建后,會(huì)重新壓人棧頂泽论,而之前的Activity則會(huì)在這個(gè)新的Activity底下,就像槍梭壓入子彈一樣缚够。而且之前的Activity就會(huì)進(jìn)入后臺(tái)鹦赎。
一個(gè)Activity實(shí)質(zhì)上有四種狀態(tài):
a、運(yùn)行中(Running/Active):這時(shí)Activity位于棧頂毯辅,是可見的煞额,并且可以用戶交互。
b胀莹、暫停(Paused):當(dāng)Activity失去焦點(diǎn)婚温,不能跟用戶交互了,但依然可見,就處于暫停狀態(tài)篱竭。當(dāng)一個(gè)新的非全屏的Activity或者一個(gè)透明的Activity放置在棧頂步绸,Activity就處于暫停狀態(tài);這個(gè)時(shí)候Activity的各種數(shù)據(jù)還被保持著吕喘;只有在系統(tǒng)內(nèi)存在極低的狀態(tài)下刑桑,系統(tǒng)才會(huì)自動(dòng)的去銷毀Activity。
c闻察、停止(Stoped):當(dāng)一個(gè)Activity被另一個(gè)Activity完全覆蓋琢锋,或者點(diǎn)擊HOME鍵退入了后臺(tái),這時(shí)候Activity處于停止?fàn)顟B(tài)钮热。這里有些是跟暫停狀態(tài)相似的:這個(gè)時(shí)候Activity的各種數(shù)據(jù)還被保持著烛芬;當(dāng)系統(tǒng)的別的地方需要用到內(nèi)容時(shí),系統(tǒng)會(huì)自動(dòng)的去銷毀Activity仆潮。
d遣臼、銷毀(Detroyed):當(dāng)我們點(diǎn)擊返回鍵或者系統(tǒng)在內(nèi)存不夠用的情況下就會(huì)把Activity從棧里移除銷毀,被系統(tǒng)回收鹏浅,這時(shí)候屏歹,Activity處于銷毀狀態(tài)。
二季希、服務(wù)(Service)
定義:
Service(服務(wù))是安卓中的四大組件之一,它通常用作在后臺(tái)處理耗時(shí)的邏輯博敬,與Activity一樣峰尝,它存在自己的生命周期,也需要在AndroidManifest.xml配置相關(guān)信息囚枪。Service是一個(gè)專門在后臺(tái)處理長時(shí)間任務(wù)的Android組件劳淆,它沒有UI默赂。它有兩種啟動(dòng)方式缆八,startService和bindService。
這兩種啟動(dòng)方式的區(qū)別:
startService只是啟動(dòng)Service奈辰,啟動(dòng)它的組件(如Activity)和Service并沒有關(guān)聯(lián),只有當(dāng)Service調(diào)用stopSelf或者其他組件調(diào)用stopService服務(wù)才會(huì)終止吊趾。
bindService方法啟動(dòng)Service瑟啃,其他組件可以通過回調(diào)獲取Service的代理對(duì)象和Service交互蛹屿,而這兩方也進(jìn)行了綁定,當(dāng)啟動(dòng)方銷毀時(shí)错负,Service也會(huì)自動(dòng)進(jìn)行unBind操作犹撒,當(dāng)發(fā)現(xiàn)所有綁定都進(jìn)行了unBind時(shí)才會(huì)銷毀Service。
服務(wù)(Service)是Android中實(shí)現(xiàn)程序后臺(tái)運(yùn)行的解決方案崭庸,它非常適合去執(zhí)行那些不需要和用戶交互而且還要求長期運(yùn)行的任務(wù)。服務(wù)的運(yùn)行不依賴于任何用戶界面执赡,即使程序被切換到后臺(tái)函筋,或者用戶打開了另外一個(gè)應(yīng)用程序,服務(wù)仍然能夠保持正常運(yùn)行首懈。
不過需要注意的是谨敛,服務(wù)并不是運(yùn)行在一個(gè)獨(dú)立的進(jìn)程當(dāng)中的,而是依賴于創(chuàng)建服務(wù)時(shí)所在的應(yīng)用程序進(jìn)程最仑。與某個(gè)應(yīng)用程序進(jìn)程被殺掉時(shí)炊甲,所有依賴于該進(jìn)程的服務(wù)也會(huì)停止運(yùn)行。另外.也不要被服務(wù)的后臺(tái)概念所迷惑吟吝,實(shí)際上服務(wù)并不會(huì)自動(dòng)開啟線程颈娜,所有的代碼都是默認(rèn)運(yùn)行在主線程當(dāng)中的。也就是說炕贵,我們需要在服務(wù)的內(nèi)部手動(dòng)創(chuàng)建子線程野崇,并在這里執(zhí)行具體的任務(wù),否則就有可能出現(xiàn)主線程被阻塞住的情況鳖轰。
(1)service用于在后臺(tái)完成用戶指定的操作扶镀。service分為兩種:
a、started(啟動(dòng)):當(dāng)應(yīng)用程序組件(如activity)調(diào)用startService()方法啟動(dòng)服務(wù)時(shí)昆雀,服務(wù)處于started狀態(tài)。
b揩懒、bound(綁定):當(dāng)應(yīng)用程序組件調(diào)用bindService()方法綁定到服務(wù)時(shí)挽封,服務(wù)處于bound狀態(tài)。
(2)startService()與bindService()區(qū)別:
a辅愿、started service(啟動(dòng)服務(wù))是由其他組件調(diào)用startService()方法啟動(dòng)的智亮,這導(dǎo)致服務(wù)的onStartCommand()方法被調(diào)用。當(dāng)服務(wù)是started狀態(tài)時(shí)点待,其生命周期與啟動(dòng)它的組件無關(guān)阔蛉,并且可以在后臺(tái)無限期運(yùn)行,即使啟動(dòng)服務(wù)的組件已經(jīng)被銷毀亦鳞。因此馍忽,服務(wù)需要在完成任務(wù)后調(diào)用stopSelf()方法停止棒坏,或者由其他組件調(diào)用stopService()方法停止燕差。
b、使用bindService()方法啟用服務(wù)坝冕,調(diào)用者與服務(wù)綁定在了一起徒探,調(diào)用者一旦退出喂窟,服務(wù)也就終止测暗,大有“不求同時(shí)生,必須同時(shí)死”的特點(diǎn)磨澡。
(3)開發(fā)人員需要在應(yīng)用程序配置文件中聲明全部的service碗啄,使用<service></service>標(biāo)簽。
(4)Service通常位于后臺(tái)運(yùn)行稳摄,它一般不需要與用戶交互稚字,因此Service組件沒有圖形用戶界面。Service組件需要繼承Service基類厦酬。Service組件通常用于為其他組件提供后臺(tái)服務(wù)或監(jiān)控其他組件的運(yùn)行狀態(tài)胆描。
三、廣播接受者(Broadcast Receive)
定義:
在Android中仗阅,廣播是一種廣泛運(yùn)用的在應(yīng)用程序之間傳輸信息的機(jī)制昌讲。而廣播接收器是對(duì)發(fā)送出來的廣播進(jìn)行過濾接受并響應(yīng)的一類組件〖踉耄可以使用廣播接收器來讓應(yīng)用對(duì)一個(gè)外部時(shí)間做出響應(yīng)短绸。例如车吹,當(dāng)電話呼入這個(gè)外部事件到來時(shí),可以利用廣播接收器進(jìn)行處理醋闭。當(dāng)下載一個(gè)程序成功完成時(shí)礼搁,仍然可以利用廣播接收器進(jìn)行處理。廣播接收器不NotificationManager來通知用戶這些事情發(fā)生了目尖。廣播接收器既可以在AndroidManifest.xml中注冊(cè)馒吴,也可以在運(yùn)行時(shí)的代碼中使用Context.registerReceive()進(jìn)行注冊(cè)。只要是注冊(cè)了瑟曲,當(dāng)事件來臨時(shí)饮戳,即使程序沒有啟動(dòng),系統(tǒng)也在需要的時(shí)候啟動(dòng)程序洞拨。各種應(yīng)用還可以通過使用Context.sendBroadcast()將它們自己的Intent廣播給其他應(yīng)用程序扯罐。
(1)你的應(yīng)用可以使用它對(duì)外部事件進(jìn)行過濾,只對(duì)感興趣的外部事件(如當(dāng)電話呼入時(shí)烦衣,或者數(shù)據(jù)網(wǎng)絡(luò)可用時(shí))進(jìn)行接收并做出響應(yīng)歹河。廣播接收器沒有用戶界面。然而花吟,它們可以啟動(dòng)一個(gè)activity或serice來響應(yīng)它們收到的信息秸歧,或者用NotificationManager來通知用戶。通知可以用很多種方式來吸引用戶的注意力衅澈,例如閃動(dòng)背燈键菱、震動(dòng)、播放聲音等今布。一般來說是在狀態(tài)欄上放一個(gè)持久的圖標(biāo)经备,用戶可以打開它并獲取消息。
(2)廣播接收者的注冊(cè)有兩種方法部默,分別是程序動(dòng)態(tài)注冊(cè)(在運(yùn)行時(shí)的代碼中使用Context.registerReceive()進(jìn)行注冊(cè))和AndroidManifest文件中進(jìn)行靜態(tài)注冊(cè)侵蒙。
(3)動(dòng)態(tài)注冊(cè)廣播接收器特點(diǎn)是當(dāng)用來注冊(cè)的Activity關(guān)掉后,廣播也就失效了傅蹂。靜態(tài)注冊(cè)無需擔(dān)憂廣播接收器是否被關(guān)閉纷闺,只要設(shè)備是開啟狀態(tài),廣播接收器也是打開著的贬派。也就是說哪怕app本身未啟動(dòng)急但,該app訂閱的廣播在觸發(fā)時(shí)也會(huì)對(duì)它起作用。
四搞乏、內(nèi)容提供者(Content Provider)
定義:
android平臺(tái)提供了Content Provider使一個(gè)應(yīng)用程序的指定數(shù)據(jù)集提供給其他應(yīng)用程序波桩。其他應(yīng)用可以通過ContentResolver類從該內(nèi)容提供者中獲取或存入數(shù)據(jù)。
(1)只有需要在多個(gè)應(yīng)用程序間共享數(shù)據(jù)是才需要內(nèi)容提供者请敦。例如镐躲,通訊錄數(shù)據(jù)被多個(gè)應(yīng)用程序使用储玫,且必須存儲(chǔ)在一個(gè)內(nèi)容提供者中。它的好處是統(tǒng)一數(shù)據(jù)訪問方式萤皂。
(2)ContentProvider實(shí)現(xiàn)數(shù)據(jù)共享撒穷。ContentProvider用于保存和獲取數(shù)據(jù),并使其對(duì)所有應(yīng)用程序可見裆熙。這是不同應(yīng)用程序間共享數(shù)據(jù)的唯一方式端礼,因?yàn)閍ndroid沒有提供所有應(yīng)用共同訪問的公共存儲(chǔ)區(qū)。
(3)開發(fā)人員不會(huì)直接使用ContentProvider類的對(duì)象入录,大多數(shù)是通過ContentResolver對(duì)象實(shí)現(xiàn)對(duì)ContentProvider的操作蛤奥。
(4)ContentProvider使用URI來唯一標(biāo)識(shí)其數(shù)據(jù)集,這里的URI以content://作為前綴僚稿,表示該數(shù)據(jù)由ContentProvider來管理凡桥。