天天看點

Android的四大元件

Activity

流程:onCreate() onStart() onResume()   onPause() onStop() onDestroy()

生命周期 :onCrate 不可見不可互動、 onStart 可見不可互動 、 onResume 可見可互動 、 onPause 可見不可互動 、onStop  不可見不可互動 、 onDestory 銷毀了 、   onRestart 從不可見到可見 ;

Android的四大元件

activity的啟動模式,有4種:

(1)standard模式(預設模式),每當啟動一個新的活動,它就會在傳回棧中入棧,并處于棧頂的位置。

(2)singleTop模式,在活動啟動時,如果發現傳回棧的棧頂已經是該活動了,則認為可以直接使用它,不會再建立新的活動執行個體。

(3)singleTask模式,每次啟動新活動時,就會在傳回棧中檢測是否存在該活動的執行個體,如果發現已經存在則直接使用該執行個體,并把在這個活動之上的所有活動統統出棧,如果沒有發現就建立一個新的活動執行個體。在該模式下,活動在整個應用程式的上下文中隻會存在一個執行個體。

(4)singleInstance模式,該模式下,會啟動另一個新的傳回棧,當某個活動需要共享給其他應用程式時,就使用這個新的傳回棧中的活動。該模式下,解決了共享活動執行個體的問題。這裡貼一張郭霖的圖。

Android的四大元件

Service 

Android的四大元件

流程1,調用 startService() 進入 started狀态:onCreate() onStartCommand() onDestroy()    

流程2,調用 bindService() 進入 bound狀态:onCreate() onBind() onUnbind() onDestroy()

如果同時調用了 startService() 和 bindService(),則需要同時調用 StopService() 和 unbindService() 方法,onDestroy()才會執行。

startService()與bindService()差別:

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

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

Content Provider

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

(2)ContentProvider實作資料共享。ContentProvider用于儲存和擷取資料,并使其對所有應用程式可見。

(3)ContentProvider不僅可以用于程序間通信,還可以用于程序内通信。

(4)還可以實作資料的存儲。

用法參見:https://www.jianshu.com/p/ea8bc4aaf057

Broadcast

(1)廣播接收者的注冊有兩種方法,分别是程式動态注冊和AndroidManifest檔案中進行靜态注冊。

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

總結

(1)4大元件的注冊

4大基本元件都需要注冊才能使用,每個Activity、Service、Content Provider都需要在AndroidManifest檔案中進行配置。AndroidManifest檔案中未進行聲明的activity、服務以及内容提供者将不為系統所見,進而也就不可用。而broadcast

 receiver廣播接收者的注冊分靜态注冊(在AndroidManifest檔案中進行配置)和通過代碼動态建立并以調用Context.registerReceiver() 的方式注冊至系統。需要注意的是在AndroidManifest檔案中進行配置的廣播接收者會随系統的啟動而一直處于活躍狀态,隻要接收到感興趣的廣播就會觸發(即使程式未運作)。

(2)4大元件的激活

内容提供者的激活:當接收到Content Resolver 發出的請求後,内容提供者被激活。而其它三種元件activity、Service 和Broadcast 接收器被一種叫做 intent 的異步消息所激活。

(3)4大元件的關閉

内容提供者僅在響應Content Resolver提出請求的時候激活。而一個廣播接收器僅在響應廣播資訊的時候激活。是以,沒有必要去顯式的關閉這些元件。Activity關閉:可以通過調用它的finish()方法來關閉一個activity。服務關閉:對于通過startService()方法啟動的服務要調用Context.stopService()方法關閉服務,使用bindService()方法啟動的服務要調用Contex.unbindService()方法關閉服務。

(4)android中的任務(activity棧)

    (a)任務其實就是activity的棧,它由一個或多個Activity組成,共同完成一個完整的使用者體驗。棧底的是啟動整個任務的Activity,棧頂的是目前運作的使用者可以互動的Activity,當一個activity啟動另外一個的時候,新的activity就被壓入棧,并成為目前運作的activity。而前一個activity仍保持在棧之中。當使用者按下BACK鍵的時候,目前activity出棧,而前一個恢複為目前運作的activity。棧中儲存的其實是對象。

    (b)任務中的所有activity是作為一個整體進行移動的。整個的任務(即activity棧)可以移到前台,或退至背景。

    (c)Android系統是一個多任務(Multi-Task)的作業系統,可以在用手機聽音樂的同時,也執行其他多個程式。每多執行一個應用程式,就會多耗費一些系統記憶體,當同時執行的程式過多,或是關閉的程式沒有正确釋放掉記憶體,系統就會覺得越來越慢,甚至不穩定。為了解決這個問題,Android引入了一個新的機制,即生命周期(Life Cycle)。