1. 程式人生 > >《老羅的Android之旅》閱讀筆記——Activity啟動過程

《老羅的Android之旅》閱讀筆記——Activity啟動過程

ActivityManagerService啟動Activity的過程大致如下圖所示:

在這個圖中,ActivityManagerService和ActivityStack位於同一個程序中,而ApplicationThread和ActivityThread位於另一個程序中。其中,ActivityManagerService是負責管理Activity的生命週期的,ActivityManagerService還藉助ActivityStack是來把所有的Activity按照後進先出的順序放在一個堆疊中;對於每一個應用程式來說,都有一個ActivityThread來表示應用程式的主程序,而每一個ActivityThread都包含有一個ApplicationThread例項,它是一個Binder物件,負責和其它程序進行通訊。

  • 預設Activity的啟動過程

 MainActivity的啟動過程如下圖所示:

主要分為以下五個階段:

       一. Step1 - Step 11:Launcher通過Binder程序間通訊機制通知ActivityManagerService,它要啟動一個Activity;

       二. Step 12 - Step 16:ActivityManagerService通過Binder程序間通訊機制通知Launcher進入Paused狀態;

       三. Step 17 - Step 24:Launcher通過Binder程序間通訊機制通知ActivityManagerService,它已經準備就緒進入Paused狀態,於是ActivityManagerService就建立一個新的程序,用來啟動一個ActivityThread例項,即將要啟動的Activity就是在這個ActivityThread例項中執行;

       四. Step 25 - Step 27:ActivityThread通過Binder程序間通訊機制將一個ApplicationThread型別的Binder物件傳遞給ActivityManagerService,以便以後ActivityManagerService能夠通過這個Binder物件和它進行通訊;

       五. Step 28 - Step 35:ActivityManagerService通過Binder程序間通訊機制通知ActivityThread,現在一切準備就緒,它可以真正執行Activity的啟動操作了。

  • 非預設Activity的啟動過程

和預設Activity的啟動過程相比,這裡在應用程式內部啟動新的Activity的過程少了中間建立新的程序這一步,因為新的Activity是在已有的程序和任務中執行的,無須建立新的程序和任務。

  • Activity的"singleTask"之謎

一個Activity序列在Android應用程式中就稱之為任務,它是從使用者體驗的角度出發,把一組相關的Activity組織在一起而抽象出來的概念。

以"singleTask"方式啟動的Activity,全域性只有唯一個例項存在,如果下次再啟動這個Activity時,系統發現已經存在這樣的Activity例項,就會呼叫這個Activity例項的onNewIntent成員函式,從而把它啟用起來。

設定了"singleTask"啟動模式的Activity的特點:

        1. 設定了"singleTask"啟動模式的Activity,它在啟動的時候,會先在系統中查詢屬性值affinity等於它的屬性值taskAffinity的任務存在;如果存在這樣的任務,它就會在這個任務中啟動,否則就會在新任務中啟動。因此,如果我們想要設定了"singleTask"啟動模式的Activity在新的任務中啟動,就要為它設定一個獨立的taskAffinity屬性值。

        2. 如果設定了"singleTask"啟動模式的Activity不是在新的任務中啟動時,它會在已有的任務中檢視是否已經存在相應的Activity例項,如果存在,就會把位於這個Activity例項上面的Activity全部結束掉,即最終這個Activity例項會位於任務的堆疊頂端中。

  • 在新的程序中啟動Activity的方法和過程

決定一個Activity是在新的程序中啟動還是在原有的程序中啟動的因素有兩個:

一、是看這個Activity的process屬性的值,

二、是這個Activity所在的應用程式的uid。

相關推薦

Android閱讀筆記——Activity啟動過程

ActivityManagerService啟動Activity的過程大致如下圖所示: 在這個圖中,ActivityManagerService和ActivityStack位於同一個程序中,而ApplicationThread和ActivityThread位於另一個程序

AndroidA面試題②Activity啟動過程簡要介紹和學習計劃

        在Android系統中,Activity和Service是應用程式的核心元件,它們以鬆藕合的方式組合在一起構成了一個完整的應用程式,這得益於應用程式框架層提供了一套完整的機制來協助應用程式啟動這些Activity和Service,以及提供Binder機制幫助它

Android閱讀筆記——IPC機制Binder

Android系統Binder機制中的四個元件Client、Server、Service Manager和Binder驅動程式的關係: Service Manager成為Binder守護程序的過程原始碼路徑:frameworks/base/cmds/servicema

Android閱讀筆記——Launcher和Zygote的啟動過程

Launcher啟動過程            系統中的應用程式安裝好了以後, SystemServer元件接下來就通過ActivityManagerService來啟動Home應用程式Launcher了, Launcher在啟動的時候便會通過PackageManagerS

Android閱讀筆記——廣播(Broadcast)機制

使用廣播的兩個步驟: 1. 廣播的接收者需要通過呼叫registerReceiver函式告訴系統,它對什麼樣的廣播有興趣,即指定IntentFilter,並且向系統註冊廣播接收器,即指定BroadcastReceiver  2. 廣播的傳送者通過呼叫sendBroadc

Android閱讀筆記——SurfaceFlinger服務

Android應用程式請求SurfaceFlinger服務渲染自己的UI可以分為三步曲: 首先是建立一個到SurfaceFlinger服務的連線, 接著再通過這個連線來建立一個Surface, 最後請求SurfaceFlinger服務渲染該Surface。 根據Surfa

Android——Android應用程式的Activity啟動過程簡要介紹和學習計劃

在Android系統中,Activity和Service是應用程式的核心元件,它們以鬆藕合的方式組合在一起構成了一個完整的應用程式,這得益於應用程式框架層提供了一套完整的機制來協助應用程式啟動這些Activity和Service,以及提供Binder機制幫助它們相

Android 導讀PPT

     Android系統使用的Linux核心包含了一些專用驅動,例如Logger、Binder、Ashmem、Wakelock、Low-Memory Killer和Alarm等,這些Android專用驅動構成了Android執行時的基石。Android執行時從下到上又包括了HAL層、應用程式框架層和應用程

在《Android》系列開始,遇到讀取不到hello裝置內容的可以看一下這裡

com_android_server_HelloService.cpp的hello_getVal()在編譯的時候一直報錯: error: invalid conversion from 'int*' to 'int' 在模擬器中讀取時hard/

專訪昇陽:Android

「編者按」CSDN人氣博主羅昇陽將攜他的《Android系統原始碼情景分析》一書做客CSDN社群問答欄目,擔任第九期的嘉賓,屆時會接受廣大網友的提問,歡迎各位網友前來與羅昇陽老師一起探討Android系統。他一直致力於從原始碼角度來研究Android系統,詮釋現代化移動作業系統的實現原理。以下為採訪正文:

Android外掛化技術 1 開篇 - 實現啟動外掛與呼叫外掛中的Activity和Service

前言 Android技術如今已很成熟了,元件化、外掛化、熱修復等等框架層出不窮,如果只停留在單純的會用框架上,技術永遠得不到成長,只有懂得其原理,能夠婉婉道來,能夠自己手動寫出,技術才會得到成長,與其焦慮未來,不如把握現在。本篇將手寫教大家寫出外掛化框架,外掛化技術是Android高階工程師必備的技術之一,

構建閱讀筆記

.cn htm logs com .com cnblogs log html http 1.http://www.cnblogs.com/a1264393659/p/5610786.html 2.http://www.cnblogs.com/a1264393659/p/56

構建閱讀筆記03

比較 文字 不存在 沒有 時間 開發程序 失去 人在 想法 在團隊的合作中,代碼的規範性很重要,其可以分為兩個部分,一個是代碼行為規範,主要是文字的規定,二是代碼設計規範。牽涉到程序設計,模塊之間的關系,設計模式等方面的通用原則。如果一個人的代碼沒有任何的規範性

構建閱讀筆記01

style 提高自己 結合 bsp 思想 宋體 玩具 spa nbsp 構建之法閱讀筆記01 在網上找到《構建之法》這本書的電子版,經過幾天的閱讀瀏覽,對於這本書,我覺得有很多的優點,但是更多的有一種感覺,這本書更註重的對編程者的思想的啟發。書裏提供了很多的實例以及模型或者

浪潮閱讀筆記01

微軟公司 發展 應該 協議 新的 bsp 用戶 自己 微軟 浪潮之巔閱讀筆記01 這本書是一本IT行業歷史書,從一百年前算起,AT&T 公司、IBM 公司、蘋果公司、英特爾公司、微軟公司、思科公司、雅虎公司和Google公司都先後被幸運地推到了浪尖。雖然,它們來自不

構建閱讀筆記02

了解 不同 開發流程 功能設計 軟件工程 好的 學習 階段 3.3 構建之法閱讀筆記02

構建閱讀筆記04

總結 求和 應該 核心 最有 交流 工作量 開發 分支 敏捷開發原則:1.盡早並持續地交付有價值的軟件以滿足顧客需求。2.敏捷流程歡迎需求的變化,並利用這種變化來提高用戶的競爭優勢 3.經常發布可用的軟件,發布間隔可以從幾周到幾個月,能短則短 4.業務人員和開發

構建閱讀筆記05

產品 交互 一個 閱讀 自己 設計 問題 決定 應該   典型用戶不再是一個抽象的概念,而應該是一個活生生的人。一個典型用戶描述了一組用戶的典型技巧、能力、需要、想法、工作習慣和工作環境。在設計軟件的過程中,我們往往會以自己使用產品的習慣對軟件行業的熟悉程度出發設計,忘記

構建閱讀筆記04

規模 對待 構建 思路 階段 學會 力量 適合 功能模塊 構建之法閱讀筆記04 發布日期:2017.6.16 通過結對合作,令我意識到了編寫程序不僅僅要自己能明白,也要便與他人查看和理解自己的程序。 4.1大節提到的代碼規範,我們編寫代碼時要註重代碼風格規

浪潮閱讀筆記06

數字處理 雅虎 斯坦福 系統 超過 初創 最有 過渡 高端 浪潮之巔閱讀筆記06 發布日期:2017.6.16 第一章 帝國的余輝(AT&T) 貪婪,短視是帝國 (AT&T) 轟然倒塌的根源。 第二章 藍色巨人( IBM ) 保守的改革者。 專註