寫給Android App開發人員看的Android底層知識(4)
(八)App內部的頁面跳轉
在介紹完App的啟動流程後,我們發現,其實就是啟動一個App的首頁。
接下來我們看App內部頁面的跳轉。
從ActivityA跳轉到ActivityB,其實可以把ActivityA看作是Launcher,那麼這個跳轉過程,和App的啟動過程就很像了。
有了前面的分析基礎,會發現,這個過程不需要重新啟動一個新的程序,所以可以省略App啟動過程中的一些步驟,流程簡化為:
1)ActivityA向AMS傳送一個啟動ActivityB的訊息。
2)AMS儲存ActivityB的資訊,然後通知App,你可以休眠了(onPaused)。
3)ActivityA進入休眠,然後通知AMS,我休眠了。
4)AMS發現ActivityB所在的程序就是ActivityA所在的程序,所以不需要重新啟動新的程序,所以它就會通知App,啟動ActivityB。
5)App啟動ActivityB。
不想看上述文字的,看我畫的這個圖:
整體流程我就不多說了,和上一篇文章介紹的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的世界了。
相關推薦
寫給Android App開發人員看的Android底層知識(1)
這個系列的文章一共8篇,我醞釀了很多年,參考了很多資源,查看了很多原始碼,直到今天把它寫出來,也是戰戰兢兢,生怕什麼地方寫錯了,貽笑大方 (一)引言 早在我還是Android菜鳥的時候,有很多技術我都不太明白,也都找不到答案,比如apk是怎麼安裝的,比如資源是怎
寫給Android App開發人員看的Android底層知識(8)
(十)PMS及App安裝過程 PMS,全稱PackageManagerService,是用來獲取Apk包的資訊的。 在前面分析四大元件與AMS通訊的時候,我們介紹過,AMS總是會使用PMS載入包的資訊,將其封裝在LoadedApk這個類物件
寫給Android App開發人員看的Android底層知識(7)
(十二)ContentProvider (1)ContentProvider是什麼? ContentProvider,簡稱CP。 做App開發的同學,尤其是電商類App,對CP並不熟悉,對這個概念的最大程度的瞭解,也僅僅是建立在書本上,它是Android四大元件中的一個。 做系統管理類的App,比
寫給Android App開發人員看的Android底層知識(5)
(十)Service Service有兩套流程,一套是啟動流程,另一套是繫結流程。我們做App開發的同學都應該知道。 1)在新程序啟動Service 我們先看Service啟動過程,假設要啟動的Service是在一個新的程序中,分為5個階段:
寫給Android App開發人員看的Android底層知識(4)
(八)App內部的頁面跳轉 在介紹完App的啟動流程後,我們發現,其實就是啟動一個App的首頁。 接下來我們看App內部頁面的跳轉。 從ActivityA跳轉到ActivityB,其實可以把ActivityA看作是Launcher,那麼這個跳轉過程,和Ap
寫給Android App開發人員看的Android底層知識(3)
(七)App啟動流程第2篇 書接上文,App啟動一共有七個階段,上篇文章篇幅所限,我們只看了第一階段,接下來講剩餘的六個階段,仍然是拿鬥魚App舉例子。 簡單回顧一下第一階段的流程,就是Launcher向AMS傳送一個跨程序通訊,通過AMN/AMP,告訴A
寫給Android App開發人員看的Android底層知識(2)
(五)AMS 如果站在四大元件的角度來看,AMS就是Binder中的Server。 AMS全稱是ActivityManagerService,看字面意思是管理Activity的,但其實四大元件都歸它管。估計是Android底層開發人員先寫了ActivityManagerService用來管理A
寫給Android App開發人員看的Android底層知識(6)
(十一)BroadcastReceiver BroadcastReceiver,也就是廣播,簡稱Receiver。 很多App開發人員表示,從來沒用過Receiver。其實吧,對於音樂播放類App,用Service和Receiver還是蠻多的,如果你用過QQ音樂,App退到後臺,音樂照樣播放
初次接觸Android APP開發之安裝Android studio軟體出現的問題以及解決方案(錯誤史,一把辛酸淚)
序言 筆者由於心血來潮,想玩玩Android開發。本想著用eclipes開發Android APP。但是發現網上說eclipes不是最好的選擇,所以筆者就放棄了熟悉的eclipes來開發Android APP,改用Android studio。在此之前,筆
Android應用開發:網絡工具——Volley(二)
respond sid 開發 多少 called creat miss 相等 eal 引言 在Android應用開發:網絡工具——Volley(一)中結合Cloudant服務介紹了Volley的一般使用方法,當中包括了兩種請求類型StringRequest和JsonOb
Android應用開發:網絡工具——Volley(一)
要求 com 庫文件 urn welcom 順序 之前 air tin 引言 網絡一直是我個人的盲點,前一陣子抽空學習了一下Volley網絡工具的用法,也透過源代碼進行了進一步的學習,有一些心得想分享出來。在Android開發中,成熟的網絡工具不少,And
Android安全/開發基礎--8--Java本地介面(JNI)
8-1、JNI概述 JNI的本意是Java Native Interface(Java本地介面),是為了方便Java和C/C++等原生代碼所封裝的一層介面,使用JNI技術可以對Java層遮蔽不同作業系統平臺之間的差異,從而實現Java本身的平臺無關特性。JNI和
Android應用開發以及設計思想深度剖析(1)
本文內容,主題是透過應用程式來分析Android系統的設計原理與構架。我們先會簡單介紹一下Android裡的應用程式程式設計,然後以這些應用程 序在執行環境上的需求來分析出,為什麼我們的Android系統需要今天這樣的設計方案,這樣的設計會有怎樣的意義, Android究竟
一個android專案開發遇到的各種小問題(一)
1、map格式字串如何解析? 藉助json,先將字串轉化為json格式,再取值 JSONObject object = new JSONObject(posMap); clientIden = object.getString("iden"); ---------
【安卓-自定義佈局】安卓App開發思路 一步一個腳印(十)實現內嵌在app中的webview 騰訊開源X5 高效安全
實現內嵌在app中的webview 採用騰訊開源X5 高效安全 webview在app的使用中,十分頻繁,原生的webview載入速度相對來說很慢,而且很費流量。騰訊開源了x5的webview
【安卓-自定義佈局】安卓App開發思路 一步一個腳印(九)實現自定義滾動的新聞條目上下滾動-仿蘑菇街
實現自定義滾動的新聞條目上下滾動-仿蘑菇街 這種上下滾動的自定義佈局,就像是公告那種上下的翻滾,一般為文字的滾動,很明顯,就是自定義佈局,一般是線性佈局。這裡提到的安卓原生的控制元件自然是
遊戲開發中必備的數學知識(三)——矩陣的基本變換
基本變換 使用Direct3D程式設計的時候,我們使用4×4的矩陣表示一個變換。其思路如下: 設定一個4×4的矩陣中元素的值,使其表示某一個具體變換,然後我們將某一點的座標或者某向量的分量放入一個1×4的行向量v中,乘積vX就是成為了一個新的經過變換的向量v。 此時,我們之所以使用4×4
java開發需要知道的linux知識(一)
water RoCE ESS xshel watermark ref process 網上 .sh 做為一個後端開發,經常需要上服務器上看看哪裏出問題了,又報什麽錯了,所以對程序員的服務器技能提出了一定的要求,要學到專業運維那個程度肯定是不可能的,我們只用掌握常用的的些就可
0-2歲的app開發人員必讀,Android開發APP前的準備事項
開發隨著移動互聯網的興起,各行各業對移動應用的需求越來越大,從事APP開發的人也越來越多,APP開發行業可以說是方興未艾。APP開發是比較復雜的事情,涉及產品、美工設計、服務器端開發、Android/iOS開發、軟件測試和項目管理等各方面。這些方面都是相互關聯的,如果要做好一個APP,需要對上述各方面都有所了
寫給Web開發人員看的Nginx介紹
譯者注:不知道其他開發者是否和我一樣,參與或者寫了很多Web專案,但是卻沒有真正的去完整的部署應用,很多時候都是交給ops即運維的同學幫忙來做。而作為一個有節操的開發者,我認為了解一些伺服器方面的知識是很有必要的,讀了這篇文章之後,自己對nginx也有了一個初步的認識,對