當前位置:首頁 » 操作系統 » pms源碼

pms源碼

發布時間: 2024-12-31 20:24:23

Ⅰ Android N 四大組件的工作原理

本文側重講解android N 系統中四大組件的工作原理,不同系統原理略有差別。通過分析四大組件的工作流程加深對Android Framework的理解,也為插件化開發打下基礎。

Activity
展示一個界面並和用戶交互,它扮演的是一個前台界面的角色。

Service
計算型組件,用於後台執行一系列計算任務,工作在主線程,耗時操作需要另起線程, 分為啟動狀態和綁定狀態。

BroadcastReceiver
消息型組件,主要用於不同組件或者不同應用之間的消息傳遞,它工作在系統內部,不適合執行耗時操作,操作超過5s,會出現ANR。

ContentProvider
數據共享型組件,用於向其他組件或者應用共享數據,主要執行CURD操作。

我們啟動一個activity有兩種方法,
第一種(Activity直接啟動方式):
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);

第二種(Context啟動方式)
Intent intent = new Intent(this, MainActivity.class);
getApplicationContext().startActivity(intent);

不同的啟動方式Activity的工作流程有點差別。

兩種啟動都會調用到Instrumentation類中的execStartActivity的方法,系統最終是通過ActivityThread中的performLaunchActivity完成Activity的創建和啟動。
performLaunchActivity方法主要完成以下工作:
1、通過ActivityClientRecord對象獲取啟動activity的組件信息
2、通過mInstrumentation對象的newActivity方法調用classloader完成activity的創建
3、通過r.packageInfo(LoadedApk 對象)的makeApplication方法嘗試創建Application對象
4、創建ContextImpl對象並調用Activity的attach方法完成一些數據的初始化
5、調用Activity的onCreate方法

在Activity啟動的過程中,App進程會頻繁地與AMS進程進行通信:

App進程會委託AMS進程完成Activity生命周期的管理以及任務棧的管理;這個通信過程AMS是Server端,App進程通過持有AMS的client代理IActivityManager完成通信過程;
AMS進程完成生命周期管理以及任務棧管理後,會把控制權交給App進程,讓App進程完成Activity類對象的創建,以及生命周期回調;這個通信過程也是通過Binder完成的,App所在server端的Binder對象存在於ActivityThread的內部類ApplicationThread;AMS所在client通過持有IApplicationThread的代理對象完成對於App進程的通信。

Service有兩種啟動方式,startService()和bindService(),兩種狀態可以並存:
startService流程

bindService流程

BroadcastReceiver的工作過程主要包括廣播的注冊、發送和接收:

動態注冊過程:

發送過程

靜態注冊是由PackageManagerService(PMS)在應用安裝的時候完成整個注冊過程的,除廣播以外,其他三大組件也都是在應用安裝時由PMS解析並注冊的。

每個進程的入口都是ActivityThead.main(),App的啟動流程如下:

源碼中可以看出:
應用啟動的入口為ActivityThread的main方法,main方法會創建ActivityThread實例並創建主線程消息隊列。
attach方法中遠程調用AMS的attachApplication方法,並提供ApplicationThread用於和AMS的通信。
attachApplication方法會通過bindApplication方法和H來調回ActivityThread的handleBindApplication,這個方法會先創建Application,再載入ContentProvider,然後才會回調Application的onCreate方法。

由上圖可以看出,在ContentProvider的啟動過程中伴隨著app進程的啟動。

ContentProvider的其他CURD操作如insert,delete,update跟query的流程類似。

熱點內容
linuxcmysql 發布:2025-01-03 17:01:57 瀏覽:226
python編譯實現rc4演算法 發布:2025-01-03 16:43:58 瀏覽:512
shell腳本當前時間 發布:2025-01-03 16:26:50 瀏覽:766
linux的機頂盒 發布:2025-01-03 16:19:13 瀏覽:874
shell腳本while循環語句 發布:2025-01-03 16:13:28 瀏覽:935
c在線編譯器菜鳥 發布:2025-01-03 16:12:08 瀏覽:388
聲優源碼 發布:2025-01-03 15:41:18 瀏覽:140
編程中R點 發布:2025-01-03 15:41:18 瀏覽:98
安卓手機王者榮耀定位在哪裡打開 發布:2025-01-03 15:36:27 瀏覽:610
怎麼折文件夾 發布:2025-01-03 15:20:22 瀏覽:657