安卓App的啟動過程、安卓布局分類及布局和頁面的關系

Android App 啟動流程:

當你想要啟動一個app時,首先得點擊該app桌面圖標。那點擊圖標時到底發生了什么呢?先看個理論知識

  • .Launcher: launcher其實就是一個app,從功能上說,是對手機上其他app的一個管理和啟動,從代碼上說比其他app多了一個屬性,就是在AndroidManifest.xml文件中多了一個< category android:name="android.intent.category.HOME" />屬性,這個屬性就是在啟動系統或者按Home鍵時會過濾這個屬性,如果系統中只要一個應用具有這個屬性,就會直接跳轉到這個界面,也就是這個launcher,如果有多個,會彈出選擇框讓用戶選擇并且提示用戶是否選擇默認設置。也就是Launcher就是我們的桌面,他就是個系統的App。我們點擊的每個程序圖標就是他的一個item,會觸發onclick事件,接受時間后然后Launcher會打開我們的應用。
  • zygote: zygote意為“受精卵“。Android是基于Linux系統的,而在Linux中,所有的進程都是由init進程直接或者是間接fork出來的,zygote進程也不例外。在Android系統里面,zygote是一個進程的名字。Android是基于Linux System的,當你的手機開機的時候,Linux的內核加載完成之后就會啟動一個叫“init“的進程。在Linux System里面,所有的進程都是由init進程fork出來的,我們的zygote進程也不例外。
    我們都知道,每一個App其實都是:一個單獨的dalvik虛擬機一個單獨的進程 。 所以當系統里面的第一個zygote進程運行之后,在這之后再開啟App,就相當于開啟一個新的進程。而為了實現資源共用和更快的啟動速度,Android系統開啟新進程的方式,是通過fork第一個zygote進程實現的。所以說,除了第一個zygote進程,其他應用所在的進程都是zygote的子進程,這下你明白為什么這個進程叫“受精卵”了吧?因為就像是一個受精卵一樣,它能快速的分裂,并且產生遺傳物質一樣的細胞!
  • SystemServer: SystemServer也是一個進程,而且是由zygote進程fork出來的。 知道了SystemServer的本質,我們對它就不算太陌生了,這個進程是Android Framework里面兩大非常重要的進程之一——另外一個進程就是上面的zygote進程。為什么說SystemServer非常重要呢? 因為系統里面重要的服務都是在這個進程里面開啟的,比如ActivityManagerService、PackageManagerService、WindowManagerService等等。
  • ActivityManagerService: ActivityManagerService,簡稱AMS,服務端對象,負責系統中所有Activity的生命周期。 ActivityManagerService進行初始化的時機很明確,就是在SystemServer進程開啟的時候,就會初始化ActivityManagerService。
  • Instrumentation和ActivityThread: 每個Activity都持有Instrumentation對象的一個引用,但是整個進程只會存在一個Instrumentation對象。Instrumentation這個類里面的方法大多數和Application和Activity有關,這個類就是完成對Application(應用程序)和Activity初始化和生命周期的工具類。Instrumentation這個類很重要,對Activity生命周期方法的調用根本就離不開他,他可以說是一個大管家。ActivityThread,就是UI線程。App和AMS是通過Binder傳遞信息的,那么ActivityThread就是專門與AMS的外交工作的。

流程圖:
在這里插入圖片描述
總結:

  • Launcher進程: 你點擊的桌面app進程 整個App啟動流程的起點,負責接收用戶點擊屏幕事件,它其實就是一個Activity,里面實現了點擊事件,長按事件,觸摸等事件,可以這么理解,把Launcher想象成一個總的Activity,屏幕上各種App的Icon就是這個Activity的button,當點擊Icon時,會從Launcher跳轉到其他頁面
  • SystemServer進程: 這個進程在整個的Android進程中是非常重要的一個,地位和Zygote等同,它是屬于Application Framework層的,Android中的所有服務,例如AMS, WindowsManager, PackageManagerService等等都是由這個SystemServer fork出來的。所以它的地位可見非同一般
  • App進程: 你要啟動的App所運行的進程

還要涉及六個大類:

  • ActivityManagerService:(AMS)AMS是Android中最核心的服務之一,主要負責系統中四大組件的啟動、切換、調度及應用進程的管理和調度等工作,其職責與操作系統中的進程管理和調度模塊相類似,因此它在Android中非常重要,它本身也是一個Binder的實現類。
  • Instrumentation:監控應用程序和系統的交互
  • ActivityThread: 應用的入口類,通過調用main方法,開啟消息循環隊列。ActivityThread所在的線程被稱為主線程
  • ApplicationThread: ApplicationThread提供Binder通訊接口,AMS則通過代理調用此App進程的本地方法
  • ActivityManagerProxy: AMS服務在當前進程的代理類,負責與AMS通信。
  • ApplicationThreadProxy: ApplicationThread在AMS服務中的代理類,負責與ApplicationThread通信。
  • 可以說,啟動的流程就是通過這六個大類在這三個進程之間不斷通信的過程

啟動流程:

  • ①點擊桌面App圖標,Launcher進程采用Binder IPC向system_server進程發起startActivity請求;
  • ②system_server進程接收到請求后,向zygote進程發送創建進程的請求;
  • ③Zygote進程fork出新的子進程,即App進程;
  • ④App進程,通過Binder IPC向sytem_server進程發起attach Application(附加的應用程序)請求;
  • ⑤system_server進程在收到請求后,進行一系列準備工作后,再通過binder
    IPC向App進程發送schedule LaunchActivity(安排計劃發射活動)請求;
  • ⑥App進程的binder線程(ApplicationThread)在收到請求后,通過handler向主線程發送LAUNCH_ACTIVITY消息;
  • ⑦主線程在收到Message后,通過發射機制創建目標Activity,并回調Activity.onCreate()等方法。
  • ⑧到此,App便正式啟動,開始進入Activity生命周期,執行完onCreate/onStart/onResume方法,UI渲染結束后便可以看到App的主界面。

在這里插入圖片描述
補充App的啟動過程:

當Launcher進程,檢測到用戶觸摸到某個App的時候,整個軟件里面最應該被加載的第一個文件是:AndroidMnifest.xml,首先它會檢測機器的SDK版本(手機的android也是有SDK版本號的)能否承載這個App,這個在代碼里面有設置:<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" />有的時候如果機器不滿足安裝就裝不上,有的是安裝能裝上但是不能運行。再來就是去獲取app所需要的的一些權限,比如說網絡請求:<uses-permission android:name="android.permission.INTERNET"/>,還有就是一個App有那么多界面,具體要啟動哪一個要看<intent-filter>這個標簽在哪一個<activity>標簽里面,下圖代表第一個要加載的界面是:MainActivity
在這里插入圖片描述

  • (SDK(Software Development Kit 軟件開發工具),Android SDK 顧名思義,就是專門用于開發Android 應用的工具包.只有通過Android SDK 我們才可以開發運行在Android 系統中的應用,比如說創建頁面/服務等.)
  • app和linux的程序類似,需要相應的依賴庫,1個android系統默認都會集成你需要的依賴,如果沒有,就需要你的apk里里添加相應庫,andoroid本質就是一個復雜的linux系統,這么理解會更好理解。
    在這里插入圖片描述

如果這時候創建另外一個界面:
在這里插入圖片描述
在這里插入圖片描述在這里插入圖片描述創建完成后,可以看到R.java里面(存放控件、界面等等的ID)多了activity_other的ID,并且res下面多了activity_other.xml這個布局文件。然后將這個布局界面設置為啟動的第一個界面:
在這里插入圖片描述
然后再介紹.java`文件里面的代碼:

activity是一個界面,我們創建的MainActivity是繼承自activity,所以MainActivity還是一個界面,這個界面有一些生成周期, onCreate是代表這個界面被創建,通過AndroidMainfest.xml確認了這個界面會不會被加載,如果這個界面被加載然后這個onCreate入口會自動的被操作系統拿來執行,其實就像之前寫的main函數,是一個入口,之后的一些列開發,會在這個函數里面進行。super.onCreate(savedInstanceState)會調用父類的onCreate去創建一個空白的界面,去做一些頁面初始化(由系統去做)。
setContentView(R.layout.activity_main)表示將這個java文件和activity_main這個布局文件關聯起來。是通過ID的方式讓java文件和xml文件進行關聯。
在這里插入圖片描述

  • R.java里面存放了activity_main界面的ID:

在這里插入圖片描述
Android六大基本布局:

Android六大基本布局分別是:線性布局LinearLayout、表格布局TableLayout、相對布局RelativeLayout、層布局FrameLayout、絕對布局AbsoluteLayout、網格布局GridLayout。其中,表格布局是線性布局的子類。網格布局是Android4.0新增的,在手機程序設計中,絕對布局基本上不用,用得相對較多的是線性布局和相對布局。

學習基本布局要理解兩個比較基礎概念的圖:

  • Android布局管理器的類圖:
    在這里插入圖片描述上面這個類圖只是說了六大基本布局的關系,其實ViewGroup還有其他一些布局管理器。這里要理解一點就是布局也是布局管理器,因為布局里面還可以添加布局。

  • Android布局的XML關系圖:
    在這里插入圖片描述
    第二個圖說的是:布局管理器里面既可以添加多個布局管理器又可以添加多個控件,而控件里面不能再添加布局或控件了。
    在這里插入圖片描述
    在這里插入圖片描述在這里插入圖片描述

界面顯示一張圖片:

在這里插入圖片描述

參考博文: 安卓App的啟動過程

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272073.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272073.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272073.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux文件默認權限和umask筆記

關于Linux文件默認權限的問題&#xff0c;可以實際先嘗試一下如下命令&#xff1a;root用戶登錄[rootlocalhost test]# touch file1[rootlocalhost test]# ls-l file1-rw-r--r-- 1 root root 0 May 5 08:28 file1 #輸出結果 對應的數字權限 644[rootlocalhost test]# touch fi…

Android相對布局(RelativeLayout)常用屬性、練習使用按鍵、文本框等控件、線性布局(LinearLayout)屬性

RelativeLayout中子控件常用屬性&#xff1a; 子控件默認是從父控件的左上角開始排列的 相對于父控件 android:layout_alignParentTop"true" 和父控件的頂部對齊android:layout_alignParentBottom"true" 和父控件的底部對齊android:layout_alignPar…

Seata AT模式

基本思路 先決條件 支持本地ACID事務的關系數據庫。通過JDBC訪問數據庫的Java應用程序。 整體機制 從兩個階段提交協議的演變&#xff1a; 階段1&#xff1a;在同一本地事務中提交業務數據和回滾日志&#xff0c;然后釋放本地鎖和連接資源。階段2&#xff1a; 對于提交情況…

自媒體各大平臺收益對比_哪些自媒體平臺沒有新手期,適合小白擼收益?

2-26把我設置為星標&#xff0c;不錯過每一次的干貨&#xff5e;各大自媒體平臺的新手期總是讓小白們望而卻步&#xff0c;特別是百家號審核非常嚴格&#xff0c;如果沒思路、沒人指導&#xff0c;過新手有難度。不過&#xff0c;還是有很多平臺對新手寶寶很友好&#xff0c;沒…

Linux關于文件的權限筆記

1、調整文件的權限命令&#xff1a;chmodLinux的每個文件都定義了文件的擁有者&#xff1a;u(user)、擁有組&#xff1a;g&#xff08;group&#xff09;、其他人&#xff1a;o&#xff08;others&#xff09;權限&#xff0c;對應的權限用rwx的組合來定義。使用chmod命令&…

presentViewController和pushViewController

iPhone開發中從一個視圖跳到另一個視圖有三種方法&#xff1a;1、self.view addSubView:view 、self.window addSubView,需要注意的是&#xff0c;這個方法只是把頁面加在當前頁面。此時在用self.navigationControler.pushViewController和 pushViewController 是不行的。要想使…

啟動rrt什么意思_python學習第144課--創建虛擬機、設置虛擬機參數以及啟動虛擬機...

【每天幾分鐘&#xff0c;從零入門python編程的世界&#xff01;】上節我們介紹了下載虛擬機以及centOS的相關事項&#xff0c;現在我們創建虛擬機。●創建虛擬機安裝好virtualbox之后&#xff0c;我們點擊Oracle VM VirtualBox打開管理器&#xff0c;界面如下圖&#xff1a;你…

Android按鍵響應的幾種方式、安卓頁面的跳轉、頁面跳轉傳參、頁面自動跳轉、Activity(頁面)的生命周期

按鍵響應的第一種方式&#xff1a; 在XML文件里面設置按鍵的onClick綁定函數。就像下面的代碼&#xff0c;給Button設置onClick屬性&#xff0c;在按鍵被按下的時候&#xff0c;會調用java文件里面的onClickbtton1這個函數&#xff0c;因為現已將它和這個按鈕進行了綁定。利用…

pycharm體驗

查看python版本 退出 exit()

Linux文本檢索命令grep筆記

grep是在linux系統中基于行文本非常實用檢索工具&#xff0c;通過該命令可以將匹配到的結果信息輸出到終端控制臺。語法格式&#xff1a;grep [-ivnc] 需要匹配的內容 文件名常用參數說明&#xff1a;-i 檢索的時候不區分大小寫-c 檢索到的匹配行數-n 檢索到的匹配行顯式具體的…

-生成樹的相關問題

瓶頸生成樹 無向圖G的一顆瓶頸生成樹(bottleneck spanning tree)。T是這樣的一顆生成樹&#xff0c;它最大的邊權值在G的所有生成樹中是最小的。瓶頸生成樹的值為T中最大權值邊的權。 即生成樹中最長邊最短的樹。 無向圖的最小生成樹一定是瓶頸生成樹&#xff0c;但瓶頸生成樹不…

成立出版社的條件_創始人親述:法國鴻飛文化出版社的誕生故事和做書心得

鴻飛文化出版社2007年在法國創立&#xff0c;專門出版由中國作家和法國插畫師共同創作的圖畫書。創始人葉俊良引用蘇東坡的詩句“人生到處知何似&#xff0c;應似飛鴻踏雪泥。泥上偶然留指爪&#xff0c;鴻飛那復計東西。”為出版社取名&#xff0c;希望通過這些“印跡”為讀者…

python單行注釋和多行注釋

# 后面加一個空格&#xff0c;下面就不會有波浪線了 點擊小燈泡下的第一行&#xff0c;可以調整注釋格式 多行注釋

Linux文件查詢筆記

1、數據庫查找命令&#xff1a;locateLinux也可以通過locate命令查找文件&#xff0c;locate命令主要是依據一個數據庫文件來執行文件的查找&#xff0c;默認情況下Linux每天會默認檢索系統中的所有文件&#xff0c;然后把檢索的文件信息記錄到數據庫文件中。因為運行locate命令…

柱坐標系下的ns方程_麥克斯韋方程組小結

一、▽ 算子、點積、叉積l▽ 算子叫“del”算子&#xff0c;即<< span"">?/?x,?/?y,?/?z>,可以理解為一個符號向量&#xff0c;向量里的元素是偏微分運算符號&#xff0c;沒有任何具體意義&#xff0c;只是一個表示方法。ln維向量的內積定義如下&a…

Java高級補充(Socket服務端、客戶端)、Handler類、安卓Socket傳數據、WebView

Socket服務端簡單地API&#xff1a; 主要用到以下幾個API&#xff1a;ServerSocket用來設置端口號、accept用來和服務端連接、getInputStream用來獲取輸入流、read用來讀取輸入流里面的數據&#xff0c;存放在提前開辟好的緩沖區里面。 import java.io.IOException; import j…

向anna學習系統結構和測試流程

今天上午主要是anne簡單介紹系統的功能和公司的測試流程。通過她的講解對于系統的大概流程有了概念。但是具體的問題估計還得到實際的操作中去。可能是這一塊的而功能比較老了&#xff0c;所以相關的文檔也是沒有及時更新的。看起來比較蠻煩&#xff0c;等我全部弄清楚了有時間…

Linux進程終止命令kill或killall?筆記

在linux命令下&#xff0c;如果需要終止某個進程&#xff0c;可以使用kill或者killall等命令來實現。終止命令的原理都是向linux內核發送一個系統操作的信號以及某個進程的ID&#xff0c;然后系統內核會根據指定的進程ID進行相應的處理。kill命令典型的用法&#xff1a;首先使用…

貝葉斯分析好壞_貝葉斯統計 | 第五章第一部分 決策基本概念

逃不掉線上期中考。。。。。。。。。開攝像頭屏錄拍照上傳。。。。。。20號考貝葉斯&#xff0c;18號考多元&#xff0c;時間序列考試時間還未知。。。。。。。但筆記還是要記的。不過貝葉斯已經跟上進度了&#xff0c;之后會按課程進度來更新貝葉斯的內容。今天開始會更新時間…