1. 程式人生 > >寫給Android App開發人員看的Android底層知識(4)

寫給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也有了一個初步的認識,對