(八)App內部的頁面跳轉app
在介紹完App的啓動流程後,咱們發現,其實就是啓動一個App的首頁。對象
接下來咱們看App內部頁面的跳轉。blog
從ActivityA跳轉到ActivityB,其實能夠把ActivityA看做是Launcher,那麼這個跳轉過程,和App的啓動過程就很像了。生命週期
有了前面的分析基礎,會發現,這個過程不須要從新啓動一個新的進程,因此能夠省略App啓動過程當中的一些步驟,流程簡化爲:進程
1)ActivityA向AMS發送一個啓動ActivityB的消息。內存
2)AMS保存ActivityB的信息,而後通知App,你能夠休眠了(onPaused)。get
3)ActivityA進入休眠,而後通知AMS,我休眠了。源碼
4)AMS發現ActivityB所在的進程就是ActivityA所在的進程,因此不須要從新啓動新的進程,因此它就會通知App,啓動ActivityB。it
5)App啓動ActivityB。io
不想看上述文字的,看我畫的這個圖:
總體流程我就很少說了,和上一篇文章介紹的App啓動流程是基本一致的。
以上的分析,僅限於ActivityA和ActivityB在相同的進程中,若是在Manifest中指定這兩個Activity不在同一個進程中,那麼就又是另外一套流程了,可是總體流程大同小異。
(九)Context家族史
Activity和Service都有Context,這三個類,還有Application,實際上是親戚一家子。
Activity由於有了一層Theme,因此中間有個ContextThemeWrapper,至關於它是Service和Application的侄子。
ContextWrapper只是一個包裝類,沒有任何具體的實現,真正的邏輯都在ContextImpl裏面。
一個應用包含的Context個數:Service個數+Activity個數+1(Application類自己對應一個Context對象)。
應用程序中包含多個ContextImpl對象,而其內部變量mPackageInfo指向同一個PackageInfo對象。
- - - - - - - - - - - - - 華麗的分割線,如下是例子- - - - - - - - - - - - - - - - - - - -
咱們就拿Activity舉例子,看看Activity和Context的聯繫和區別。
咱們知道,跳轉到一個新的Activity要這麼寫:
咱們還知道,也能夠在Activity中使用getApplicationContext方法獲取Context上下文信息,而後使用Context 的startActivity方法,啓動一個新的Activity:
這兩者的區別是什麼?咱們畫個圖,就看明白了:
由於Context的startActivity方法,我看了在ContextImpl中的源碼實現,仍然是從ActivityThread中取出Instrumentation,而後執行execStartActivity方法,這和使用Activity的startActivity方法的流程是同樣的。
還記得咱們前面分析的App啓動流程麼?在第五階段,建立App進程的時候,先建立的ActivityThread,再建立的Application。Application的生命週期是跟着整個App走的。
而getApplicationContext獲得的Context,就是從ActivityThread中取出來的Application對象,因此這個Context上下文,使用時要小心,容易引發內存泄露。
下一篇文章,咱們就要邁進Service的世界了。