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

寫給Android App開發人員看的Android底層知識(5)

     (十)Service

     Service有兩套流程,一套是啟動流程,另一套是繫結流程。我們做App開發的同學都應該知道。

     

     1)在新程序啟動Service

       我們先看Service啟動過程,假設要啟動的Service是在一個新的程序中,分為5個階段:

       1)App向AMS傳送一個啟動Service的訊息。

       2)AMS檢查啟動Service的程序是否存在,如果不存在,先把Service資訊存下來,然後建立一個新的程序。

       3)新程序啟動後,通知AMS說我可以啦。

       4)AMS把剛才儲存的Service資訊傳送給新程序

       5)新程序啟動Service

     我們仔細看一下這5個階段:

     第1階段

     

     和Activity非常像,仍然是通過AMM/AMP把要啟動的Service資訊傳送給AMS。

     第2階段

     AMS檢查Service是否在Manifest中聲明瞭,沒宣告會直接報錯。

     AMS檢查啟動Service的程序是否存在,如果不存在,先把Service資訊存下來,然後建立一個新的程序。

     在AMS中,每個Service,都使用ServiceRecord物件來儲存。

     第3階段

     Service所在的新程序啟動的過程,就和前面介紹App啟動時的過程差不多。

     新程序啟動後,也會建立新的ActivityThread,然後把ActivityThread物件通過AMP傳遞給AMS,告訴AMS,新程序啟動成功了。

     第4階段

     AMS把傳進來的ActivityThread物件改造為ApplicationThreadProxy,也就是ATP,通過ATP,把要啟動的Service資訊傳送給新程序。

     第5階段

     

     新程序通過ApplicationThread接收到AMS的資訊,和前面介紹的啟動Activity的最後一步相同,藉助於ActivityThread和H,執行Service的onCreate方法。在此期間,為Service建立了Context上下文物件,並與Service相關聯。

     需要重點關注的是ActivityThread的handleCreateService方法,

     

     你會發現,這段程式碼和前面介紹的handleLaunchActivity差不多,都是從PMS中取出包的資訊packageInfo,這是一個LoadedApk物件,然後獲取它的classloader,反射出來一個類的物件,在這裡反射的是Service。

     四大元件的邏輯都是如此,所以我們要做外掛化,可以在這裡做文章,換成外掛的classloader,載入外掛中的四大元件。

     至此,我們在一個新的程序中啟動了一個Service。

    2)啟動統一程序的Service

     如果是在當前程序啟動這個Service,那麼上面的步驟就簡化為:

       1)App向AMS傳送一個啟動Service的訊息。

       2)AMS例行檢查,比如Service是否聲明瞭,把Service在AMS這邊註冊。AMS發現要啟動的Service就是App所在的Service,就通知App啟動這個Service。

       3)App啟動Service。

     我們看到,沒有了啟動新程序的過程。

    3)在同一程序繫結Service

     如果是在當前程序繫結這個Service呢?過程是這樣的:

       1)App向AMS傳送一個繫結Service的訊息。

       2)AMS例行檢查,比如Service是否聲明瞭,把Service在AMS這邊註冊。AMS發現要啟動的Service就是App所在的Service,就先通知App啟動這個Service,然後再通知App,對Service進行繫結操作。

       3)App收到AMS第1個訊息,啟動Service,

       4)App收到AMS第2個訊息,繫結Service,並把一個Binder物件傳給AMS

       5)AMS把接收到的Binder物件,傳送給App

       6)App收到Binder物件,就可以使用了。

     你也許會問,都在一個程序,App內部直接使用Binder物件不就好了,其實吧,要考慮不在一個程序的場景,程式碼又不能寫兩份,兩套邏輯,所以就都放在一起了,即使在同一個程序,也要繞著AMS走一圈。

    第1階段:App向AMS傳送一個繫結Service的訊息。

     

     第4階段:處理第2個訊息

     

     第5階段和第6階段:

     這一步是要仔細說的,因為AMS把Binder物件傳給App,這裡沒用ATP和APT,而是用到了AIDL來實現,這個AIDL的名字是IServiceConnection。

     

     ServiceDispatcher的connect方法,最終會呼叫ServiceConneciont的onServiceConnected方法,這個方法我們就很熟悉了。App開發人員在這個方法中拿到connection,就可以做自己的事情了。

      好了,關於Service的底層知識,我們就全都介紹完了。當你再去編寫一個Service時,是否感覺對這個元件理解的更透徹了呢?

     下一篇我們聊一聊BroadcastReceiver。

相關推薦

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

[App Store Connect幫助]四、添加 App 圖標、App 預覽和屏幕快照5移除 App 預覽或屏幕快照

技術 圖片 營銷 task 首頁 prev clas class header 您可以隨時移除 App 預覽,但僅可在 App 狀態為可編輯時才能移除屏幕快照。要了解可編輯的狀態,請前往 App 狀態。 必要職能:“帳戶持有人”職能、“

java開發需要知道的linux知識

water RoCE ESS xshel watermark ref process 網上 .sh 做為一個後端開發,經常需要上服務器上看看哪裏出問題了,又報什麽錯了,所以對程序員的服務器技能提出了一定的要求,要學到專業運維那個程度肯定是不可能的,我們只用掌握常用的的些就可

0-2歲的app開發人員必讀,Android開發APP前的準備事項

開發隨著移動互聯網的興起,各行各業對移動應用的需求越來越大,從事APP開發的人也越來越多,APP開發行業可以說是方興未艾。APP開發是比較復雜的事情,涉及產品、美工設計、服務器端開發、Android/iOS開發、軟件測試和項目管理等各方面。這些方面都是相互關聯的,如果要做好一個APP,需要對上述各方面都有所了