天天看點

Android四大元件

Android 開發的四大元件分别是:活動(activity),用于表現功能;服務(service),背景運作服務,不提供界面呈現;廣播接受者(Broadcast Receive),勇于接收廣播;内容提供者(Content Provider),支援多個應用中存儲和讀取資料,相當于資料庫。

1.活動(activity)

(1)定義:Activity是Android的四大元件之一。是使用者操作的可視化界面;它為使用者提供了一個完成操作指令的視窗。當我們建立完畢Activity之後,需要調用​

​setContentView()​

​方法來完成界面的顯示;以此來為使用者提供互動的入口。在Android App 中隻要能看見的幾乎都要依托于Activity,是以Activity是在開發中使用最頻繁的一種元件。

(2)一個Activity通常就是一個單獨的螢幕(視窗)。

(3)Activity之間通過Intent進行通信。

(4)android應用中每一個Activity都必須要在AndroidManifest.xml配置檔案中聲明,否則系統将不識别也不執行該Activity。在android stdio會自動生成,但eclipse需要自己手動添加

(5)Activity的生命周期

      在Android中會維持一個Activity Stack(Activity棧),當一個新的Activity建立時,它就會放到棧頂,這個Activity就處于運作狀态。當再有一個新的Activity被建立後,會重新壓人棧頂,而之前的Activity則會在這個新的Activity底下,就像槍梭壓入子彈一樣。而且之前的Activity就會進入背景。

一個Activity實質上有四種狀态:

a.運作中(Running/Active):這時Activity位于棧頂,是可見的,并且可以使用者互動。

b.暫停(Paused):當Activity失去焦點,不能跟使用者互動了,但依然可見,就處于暫停狀态。當一個新的非全屏的Activity或者一個透明的Activity放置在棧頂,Activity就處于暫停狀态;這個時候Activity的各種資料還被保持着;隻有在系統記憶體在極低的狀态下,系統才會自動的去銷毀Activity。

c.停止(Stoped):當一個Activity被另一個Activity完全覆寫,或者點選HOME鍵退入了背景,這時候Activity處于停止狀态。這裡有些是跟暫停狀态相似的:這個時候Activity的各種資料還被保持着;當系統的别的地方需要用到内容時,系統會自動的去銷毀Activity。

d.銷毀(Detroyed):當我們點選傳回鍵或者系統在記憶體不夠用的情況下就會把Activity從棧裡移除銷毀,被系統回收,這時候,Activity處于銷毀狀态。

Android四大元件

2.服務(Service)

 service(服務)是安卓中的四大元件之一,它通常用作在背景處理耗時的邏輯,與Activity一樣,它存在自己的生命周期,也需要在AndroidManifest.xml配置相關資訊。

Android四大元件

服務(Service)是Android中實作程式背景運作的解決方案,它非常适合去執行那些不需要和使用者互動而且還要求長期運作的任務。服務的運作不依賴于任何使用者界面,即使程式被切換到背景,或者使用者打開了另外一個應用程式,服務仍然能夠保持正常運作。

不過需要注意的是,服務并不是運作在一個獨立的程序當中的,而是依賴于建立服務時所在的應用程式程序。與某個應用程式程序被殺掉時,所有依賴于該程序的服務也會停止運作。另外.也不要被服務的背景概念所迷惑,實際上服務并不會自動開啟線程,所有的代碼都是預設運作在主線程當中的。也就是說,我們需要在服務的内部手動建立子線程,并在這裡執行具體的任務,否則就有可能出現主線程被阻塞住的情況。

(1)service用于在背景完成使用者指定的操作。service分為兩種:

(a)started(啟動):當應用程式元件(如activity)調用startService()方法啟動服務時,服務處于started狀态。

(b)bound(綁定):當應用程式元件調用bindService()方法綁定到服務時,服務處于bound狀态。

(2)startService()與bindService()差別:

(a)started service(啟動服務)是由其他元件調用startService()方法啟動的,這導緻服務的onStartCommand()方法被調用。當服務是started狀态時,其生命周期與啟動它的元件無關,并且可以在背景無限期運作,即使啟動服務的元件已經被銷毀。是以,服務需要在完成任務後調用stopSelf()方法停止,或者由其他元件調用stopService()方法停止。

(b)使用bindService()方法啟用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止,大有“不求同時生,必須同時死”的特點。

(3)開發人員需要在應用程式配置檔案中聲明全部的service,使用<service></service>标簽。

(4)Service通常位于背景運作,它一般不需要與使用者互動,是以Service元件沒有圖形使用者界面。Service元件需要繼承Service基類。Service元件通常用于為其他元件提供背景服務或監控其他元件的運作狀态。

定義

Service是一個專門在背景處理長時間任務的Android元件,它沒有UI。它有兩種啟動方式,startService和bindService。

 這兩種啟動方式的差別:

startService隻是啟動Service,啟動它的元件(如Activity)和Service并沒有關聯,隻有當Service調用stopSelf或者其他元件調用stopService服務才會終止。

bindService方法啟動Service,其他元件可以通過回調擷取Service的代理對象和Service互動,而這兩方也進行了綁定,當啟動方銷毀時,Service也會自動進行unBind操作,當發現所有綁定都進行了unBind時才會銷毀Service。

Service的onCreate回調函數可以做耗時的操作嗎?

不可以, Service的onCreate是在主線程(ActivityThread)中調用的,耗時操作會阻塞UI

如果需要做耗時的操作,你會怎麼做?

線程和Handler方式

是否知道IntentService,在什麼場景下使用IntentService?

 IntentService相比父類Service而言,最大特點是其回調函數onHandleIntent中可以直接進行耗時操作,不必再開線程。其原理是IntentService的成員變量 Handler在初始化時已屬于工作線程,之後handleMessage,包括onHandleIntent等函數都運作在工作線程中。

如果對IntentService的了解僅限于此,會有種IntentService很雞肋的觀點,因為在Service中開線程進行耗時操作也不麻煩。我當初也是這個觀點,是以很少用IntentService。

    但是IntentService還有一個特點,就是多次調用onHandleIntent函數(也就是有多個耗時任務要執行),多個耗時任務會按順序依次執行。原理是其内置的Handler關聯了任務隊列,Handler通過looper取任務執行是順序執行的。

    這個特點就能解決多個耗時任務需要順序依次執行的問題。而如果僅用service,開多個線程去執行耗時操作,就很難管理。

3.廣播接受者(Broadcast Receive)

在Android中,廣播是一種廣泛運用的在應用程式之間傳輸資訊的機制。而廣播接收器是對發送出來的廣播進行過濾接受并響應的一類元件。可以使用廣播接收器來讓應用對一個外部時間做出響應。例如,當電話呼入這個外部事件到來時,可以利用廣播接收器進行處理。當下載下傳一個程式成功完成時,仍然可以利用廣播接收器進行處理。廣播接收器不NotificationManager來通知使用者這些事情發生了。廣播接收器既可以在AndroidManifest.xml中注冊,也可以在運作時的代碼中使用Context.registerReceive()進行注冊。隻要是注冊了,當事件來臨時,即使程式沒有啟動,系統也在需要的時候啟動程式。各種應用還可以通過使用Context.sendBroadcast()将它們自己的Intent廣播給其他應用程式。

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

(2)廣播接收者的注冊有兩種方法,分别是程式動态注冊(在運作時的代碼中使用Context.registerReceive()進行注冊)和AndroidManifest檔案中進行靜态注冊。

(3)動态注冊廣播接收器特點是當用來注冊的Activity關掉後,廣播也就失效了。靜态注冊無需擔憂廣播接收器是否被關閉,隻要裝置是開啟狀态,廣播接收器也是打開着的。也就是說哪怕app本身未啟動,該app訂閱的廣播在觸發時也會對它起作用。

4.内容提供者(Content Provider)

(1)android平台提供了Content Provider使一個應用程式的指定資料集提供給其他應用程式。其他應用可以通過ContentResolver類從該内容提供者中擷取或存入資料。

(2)隻有需要在多個應用程式間共享資料是才需要内容提供者。例如,通訊錄資料被多個應用程式使用,且必須存儲在一個内容提供者中。它的好處是統一資料通路方式。

(3)ContentProvider實作資料共享。ContentProvider用于儲存和擷取資料,并使其對所有應用程式可見。這是不同應用程式間共享資料的唯一方式,因為android沒有提供所有應用共同通路的公共存儲區。

(4)開發人員不會直接使用ContentProvider類的對象,大多數是通過ContentResolver對象實作對ContentProvider的操作。

(5)ContentProvider使用URI來唯一辨別其資料集,這裡的URI以content://作為字首,表示該資料由ContentProvider來管理。