天天看點

Android四大元件之Activity、Service

一、Activity      activity在應用是一個界面,它加載布局檔案顯示各種UI元素。并且各個Activity可以互相跳轉。 1、Activity生命周期 oncreate:在activity第一次被建立時候調用,在此完成Activity的初始化操作(設定布局,初始化視圖,綁定事件) onStart:在onCreate之後調用,此時處于不可見狀态。 onResume:在activity變為可見時調用。執行完onresume之後,Activity就會請求AMS渲染它所管理的視圖。此時的Activity一定位于傳回棧的棧頂,并處于運作狀态。 onPause:Activity從可見到不可見時調用。通常将一些耗時CpU操作釋放掉,以及儲存一些關鍵資料。 onStop:Activity在完全不可見時調用。它與onPause函數主要差別在于,如果新啟動的Activity是一個對話框的Activity,那麼onPause函數會得到執行,而onStop函數不執行。 onsDestroy:在銷毀之前調用,之後為銷毀狀态。 onRestart:Activity被重新啟動時調用,也就是由停止狀态變為運作狀态之前調用。

Android四大元件之Activity、Service

2、Activity的構成 Activity之下有一個PhoneWindow,這個PhoneWindow是window的實作類,然後window之下包含一個DecorView,DecorView實際上是頁面的頂級視圖,它從一些系統布局中加載。并且在運作時将開發人員設定給Activity的布局資源添加到系統布局的mContentParent中。這樣使用者布局就被添加到系統布局中。

Android四大元件之Activity、Service

DecorView 包含三部分(actionbar、标題欄區域、開發者設定的布局區域)

Android四大元件之Activity、Service

3、Activity的4種啟動模式(standard,singleTop,singleTask,singleInstance)    每個應用程式都是由一個或者多個Activity組成。android内部使用通過回退棧來管理activity執行個體。對于android來說,目前顯示的Activity就在棧頂,當點選後退鍵或者點選應用上傳回按鈕,系統會将棧頂Activity出棧,此時下一個Activity就會變為棧頂顯示到裝置。     一些特殊情況我們可能需要對activity執行個體做一些處理,例如,為了避免重複建立Activity,我們要求一個activity隻有一個執行個體。 (1)standard(标準啟動模式) 預設啟動模式。可被多次執行個體化 (2)singleTop 隻有activity在棧頂時,才不重新建立,并且調用原來activity的onIntent函數,其他與standard一樣 (3)singleTask 此啟動模式,任務棧中隻能有一個改activity的執行個體。 如果任務棧中還沒有該activity,建立一個執行個體放在棧頂。 如果已經存在,系統會銷毀處在該activity 上的所有activity,最終讓該activity 處于棧頂,同時回調onnewIntent()函數。 (4)singleInstance 此模式的activity會在一個獨立的任務中開啟,并且這個新的任務中有且隻有這一個執行個體,也就是說被該執行個體啟動的其他activity會自動運作于另一個任務棧中。當再次啟動該Activity執行個體時,會重用已存在的任務和執行個體。并且會調用該執行個體的onNewIntent函數。      和singleTask不同的是,同一時刻在系統中隻會存在一個這樣執行個體,而singleTask模式的activity是可以有多個執行個體的,隻要這些activity在不同的任務棧中即可。

二、Service service是android中實作程式背景運作的解決方案,它合适執行哪些不需要長期執行,并且要求長期運作的任務。預設不在子線程,同時執行在UI線程。除非開啟到子線程執行。   service運作部依賴界面,即使程式切換到背景,或者打開其他程式,service仍可以保持正常運作。當應用程式被殺掉時,所有依賴于該程序的service也會停止。 1、普通service service生命周期: oncreate onStartComand onDestory

一旦調用startService,服務啟動起來,建立時首先會oncreate函數,然後回調onstartCommand函數。服務啟動一直保持運作狀态,直到stopService或stopSelf函數被調用。  每次調用startService,onstartcommand就會執行一次,但實際每個服務隻存一個執行個體。無論調用多少次startService函數,隻要調用一次stop服務就停止。 2、intentService 将請求執行在子線程中,使用者隻需要複寫onhandleIntent函數,并且在該函數完成自己的耗時操作即可。任務執行完畢會調用stopSelf自我銷毀 适合短暫任務 3、運作在前台的service service 預設是背景的,是以它優先級相對比較低。當記憶體不足時,它可能會被回收掉,可以将運作在前台。前台服務不僅不會被回收,還會在通知欄顯示一條消息下拉狀态可以看到詳細資訊。 startForeground