Activity詳解


Activity 是一個應用組件,用戶可與其提供的屏幕進行交互,以執行撥打電話、拍攝照片、發送電子郵件或查看地圖等操做。 每一個 Activity 都會得到一個用於繪製其用戶界面的窗口。窗口一般會充滿屏幕,但也可小於屏幕並浮動在其餘窗口之上。android

目錄

-生命週期服務器

-啓動模式app

-onNewIntent異步

-Intent Filter源碼分析

-onConfigurationChanged佈局

-數據保存與恢復測試

-URL Scheme字體

-startActivityForResult動畫

-源碼分析線程

生命週期

在介紹Activity生命週期以前,咱們先來了解一下Activity的四種基本狀態:

Active/Running: Activity處於活動狀態,此時Activity處於棧頂,是可見狀態,可與用戶進行交互。

Paused: 當Activity失去焦點時,或被一個新的非全屏的Activity,或被一個透明的Activity放置在棧頂時,Activity就轉化爲Paused狀態。但咱們須要明白,此時Activity只是失去了與用戶交互的能力,其全部的狀態信息及其成員變量都還存在,只有在系統內存緊張的狀況下,纔有可能被系統回收掉。

Stopped: 當一個Activity被另外一個Activity徹底覆蓋時,被覆蓋的Activity就會進入Stopped狀態,此時它再也不可見,可是跟Paused狀態同樣保持着其全部狀態信息及其成員變量。

Killed: 當Activity被系統回收掉時,Activity就處於Killed狀態。 Activity會在以上四種形態中相互切換,至於如何切換,這因用戶的操做不一樣而異。瞭解了Activity的4種形態後,咱們就來聊聊Activity的生命週期。

Activity生命週期

onCreate

Activity被建立時的第一個方法,表示正在被建立,一些初始化工做在這裏(加載佈局資源,初始化所須要的數據等),若是有耗時任務需開異步線程去完成。

onStart

Activity正在被啓動,在這個狀態下Activity還在加載其餘資源,正在向咱們展現,用戶還沒法看到,不能交互

onResume

Activity建立完成,用戶可看見界面,可交互

onPause

Activity正在暫停,正常狀況下接着會執行onStop()。這時能夠作數據的存儲、動畫中止的操做,可是不能太耗時,要否則影響新Activity的建立

onStop

Activity即將中止,這時能夠作一些回收工做,同樣不能太耗時

onDestory

Activity即將被銷燬,能夠作一些工做和資源的回收(Service、BroadCastReceiver、Map、Bitmap回收等)

onRestart

Activity正在從新啓動,通常時當前Activity從不可見到可見狀態時會執行這個方法,例如:用戶按下Home鍵(鎖屏)或者打開新Activity再返回這個Activity

思考問題:(實際操做打印生命週期執行順序)

1.啓動AActivity 2.AActivity建立完成,按Home鍵回到主屏 3.按Home鍵再主屏,再次點擊App回到AActivity 4.AActivity去打開BActivity 5.在BActivity點擊Back鍵回退 6.熄屏、亮屏 7.系統配置改變(橫豎屏切換) 8.內存不足致使低優先級的Activity被殺死

啓動模式

standard

Standard模式是Android的默認啓動模式,你不在配置文件中作任何設置,那麼這個Activity就是standard模式,這種模式下,Activity能夠有多個實例,每次啓動Activity,不管任務棧中是否已經有這個Activity的實例,系統都會建立一個新的Activity實例

singleTop

SingleTop模式和standard模式很是類似,主要區別就是當一個singleTop模式的Activity已經位於任務棧的棧頂,再去啓動它時,不會再建立新的實例,若是不位於棧頂,就會建立新的實例,如今把配置文件中FirstActivity的啓動模式改成SingleTop,咱們的應用只有一個Activity,FirstActivity天然處於任務棧的棧頂。

SingleTask

SingleTask模式的Activity在同一個Task內只有一個實例,若是Activity已經位於棧頂,系統不會建立新的Activity實例,和singleTop模式同樣。但Activity已經存在但不位於棧頂時,系統就會把該Activity移到棧頂,並把它上面的activity出棧。修改上面的程序,新建一個SecondActivity,將FirstActivity設置爲singleTask啓動模式,並讓它啓動SecondActivity,再讓SecondActivity來啓動FirstActivity。

singleInstance

singleInstance模式也是單例的,但和singleTask不一樣,singleTask只是任務棧內單例,系統裏是能夠有多個singleTask Activity實例的,而singleInstance Activity在整個系統裏只有一個實例,啓動一singleInstanceActivity時,系統會建立一個新的任務棧,而且這個任務棧只有他一個Activity。

SingleInstance模式並不經常使用,若是咱們把一個Activity設置爲singleInstance模式,你會發現它啓動時會慢一些,切換效果很差,影響用戶體驗。它每每用於多個應用之間,例如一個電視launcher裏的Activity,經過遙控器某個鍵在任何狀況能夠啓動,這個Activity就能夠設置爲singleInstance模式,當在某應用中按鍵啓動這個Activity,處理完後按返回鍵,就會回到以前啓動它的應用,不影響用戶體驗。

onNewIntent

避免Activity之間的跳轉傳值屢次實體化

onNewIntent何時被執行

若是在 AndroidManifest.xml 中,將 Activity 的 launchMode 設置成了 "singleTop" 模式,或者在調用 startActivity(Intent) 時,設置了 FLAG_ACTIVITY_SINGLE_TOP 標識,那麼,當該 Activity 再次被啓動時,若是它依然存在於 Activity 棧中,而且恰好處於棧的最頂層時,那麼它將不會被從新建立,而是直接使用原來的實例,此時,onNewIntent(Intent) 將會被調用,後續生命週期中的其它方法,就可使用 onNewIntent(Intent) 傳遞過來的新的 Intent 參數了。(也就是說,其它方法可使用更新後的 Intent 參數)

調用順序以下: onNewIntent() -> onRestart() -> onStart() -> onResume()

須要特別注意的是, 若是在 onNewIntent(Intent) 中,不調用 setIntent(Intent) 方法對 Intent 進行更新的話,那麼以後在調用 getIntent() 方法時獲得的依然是最初的值。

IntentFilter

意圖過濾器,Activity之間經過intent實現通訊,intent-filter就是用來註冊Activity,Service和Broadcast Receiver 使Android知道那個應用程序(或組件)能用來響應intent請求使其能夠在一片數據上執行那個動做。爲了註冊一個應用程序組件爲intent處理者,在其組件的manifest節點中添加一個intent-fillter標籤。

1.動做測試(action)

一個intent對象只能指定一個action,而一條元素至少應該包含一個,不然任何Intent請求都不能和該匹配;

一個intent對象的action必須和intent-filter中的某一個actiong匹配,才能經過;

若是intent對象不指定action且intent-filter的action列表不爲空,則經過;

2.類別測試(category)

簡單的說就是種類匹配Intent-Filter必須包含全部在解析的Intent中定義的種類。一個沒有特定種類的Intent Filter只能與沒有種類的Intent匹配,對於 IntentFilter中多餘的聲明並不會致使匹配失敗。有一個重要的點就是若是intent 是implicit intent(隱式意圖),android默認給加上一個CATEGORY_DEFAULT,這樣的話若是intent filter中沒有android.intent.category.DEFAULT這個category的話,匹配測試就會失敗,換句話說就是必須加上這個category。

3:數據測試(data)

data有兩部分構成,一個是數據類型,另外一個是URI。每一個URI包括四個屬性參數(scheme,host, port, path),形如:scheme://host:port/path, 其中,用setData()設定的Inteat請求的URI數據類型和scheme必須與IntentFilter中所指定的一致。若IntentFilter中還指定了authority或path,它們也須要相匹配纔會經過測試。 Intent filter和Intent相互配合,實現了Android系統四大組件之間的信使功能。

URL_Scheme就用到了data,將在後面闡述-URL Scheme

onConfigurationChanged

在一些特殊的狀況中,你可能但願當一種或者多種配置改變時避免從新啓動你的activity。你能夠經過在manifest中設置android:configChanges屬性來實現這點。 你能夠在這裏聲明activity能夠處理的任何配置改變,當這些配置改變時不會從新啓動activity,而會調用activity的 onConfigurationChanged(Resources.Configuration)方法。若是改變的配置中包含了你所沒法處理的配置(在android:configChanges並未聲明), 你的activity仍然要被從新啓動,而onConfigurationChanged(Resources.Configuration)將不會被調用。

其次:android:configChanges=""中能夠用的值:keyboard|mcc|mnc|locale|touchscreen|keyboardHidden|navigation|orientation…… Configuration 類中包含了不少種信息,例如系統字體大小,orientation,輸入設備類型等等. 好比:android:configChanges="orientation|keyboard|keyboardHidden"

數據保存與恢復

系統配置改變時,會用到Activity中數據保存與恢復(onSaveInstanceState和onRestoreInstanceState)

URL_Scheme

scheme是一種頁面內跳轉協議,是一種很是好的實現機制,經過定義本身的scheme協議,能夠很是方便跳轉app中的各個頁面;經過scheme協議,服務器能夠定製化告訴App跳轉那個頁面,能夠經過通知欄消息定製化跳轉頁面,能夠經過H5頁面跳轉頁面等。

一個完整的Scheme的協議格式由 scheme、userInfo、host、port、path、query和fragment 組成。結構以下:

scheme://userInfo@host:port/path?query#fragment

startActivityForResult

Activity在finish的時候須要向上一個Activity傳值的時候,咱們就可使用startActivityForResult。好比打開相冊選取照片,拍照,關閉頁面須要返回一個參數給打開咱們的頁面。

使用startActivityForResult(Intent intent, int requestCode)方法打開新的Activity,新Activity關閉前須要向前面的Activity返回數據須要使用系統提供的setResult(int resultCode, Intent data),前面的Activity中經過onActivityResult(int requestCode, int resultCode, Intent data)方法接受回傳值

源碼分析

後續文章將講解,盡情期待

相關文章
相關標籤/搜索