UI繪制流程詳解(1)
從源碼角度分析一下三個問題
本文主要研究第一個問題
一、Android程序是如何啟動,Activity生命周期如何調用
Android程序使用Java語言實現的,而Java程序的執行需要一個主入口main方法,Android程序的main方法就存在于ActivityThread的這個類當中。從字面意義上可以知道,ActivityThread是一個線程類,也就是我們所說的主線程
在main方法中出在如下代碼
這里主要是進行了ActivityThread類的創建及綁定,點擊進入attach方法中進行查看,我們只查看核心的代碼
點擊進入getService方法
了解Binder機制的小伙伴看到這里應該很眼熟,在圖中的create方法中進行了一個跨進程的相關操作
- 獲得系統的IBinder的實現類
- 將系統(服務端)的Binder對象轉換成客戶端可以使用的接口類對象
也就是說getService這個方法所返回的對象其實就是和系統進行跨進程通信的,從對象的類名稱可知是Activity的管理類。mgr通過attachApplication方法和mAppThread進行了綁定,mAppThread的類是ApplicationThread,父類為IApplicationThread.Stub,和Binder中的Stub的作用一樣,用來接收系統(服務端)發過來的跨進程消息。而這個類中大部分方法以schedule開頭,可以找到很多比較眼熟的方法名稱,比如schedulePauseActivity,scheduleStopActivity,scheduleResumeActivity,scheduleLaunchActivity等,scheduleLaunchActivity是開始的方法,里面有兩行比較重要的代碼
ActivityClientRecord r = new ActivityClientRecord();
sendMessage(H.LAUNCH_ACTIVITY, r);
- ActivityClientRecord中封裝了Activity的對象,暫時可以把它當做Activity
- ApplicationThread中的方法中都包含了sendMessage方法,通過Handler機制將相應的Object發送到了handleMessage方法中
ActivityThreadl類中的handleMessage方法如下:
里面包含了很多Activity對應的狀態,這里我們之研究LAUNCH_ACTIVITY這個啟動的狀態。點擊進入handleLaunchActivity方法
再次進入performLaunchActivity,其他代碼不看,暫時之研究啟動的相關代碼
發現在performLaunchActivity方法中存在OnCreate相關的方法,在這里基本可以知道,會執行到Activity方法中的OnCreate方法中
到這里,關于Android程序是如何啟動,Activity生命周期如何調用的流程基本捋清。
歡迎留言,歡迎糾錯,共同進步!
智能推薦
Android高級UI之繪制流程分析
要了解繪制流程,首先我們要了解View的加載過程,我們從setContentView開始 MainActivity->Activity 我們可以看到是通過getWindow()來進行setContentView,getWindow()到底是什么呢,我們進行源碼跟蹤,定位Window 我們可以發現Window是一個抽象類,它有唯一一個子類就是PhoneWindow,因此我們setContent...
Android UI繪制流程及原理
1.前言 2.View是如何添加到屏幕窗口上的 要弄清楚UI繪制流程和原理,我們首先要了解的就是View是如何被添加到屏幕窗口上的。帶著這個問題我們來進行源碼分析,關于界面的展示,立馬浮現在腦海的就是這樣一段代碼: 通過傳入布局資源ID,setContentView方法又做了什么事情呢?經過一系列線索最終找到了的位置也就是Window的唯一實現類PhoneWindow: 注釋1處installDe...
Android UI繪制流程之測量片
經過前一片前奏的分析,我們知道從ViewRootImpl的performTraversals方法正式進入View的測量、布局、繪制流程。本文著重分析View的measure流程。直接上代碼吧 frameworks/base/core/java/android/view/ViewRootImpl.java 在performTraversals方法中找到測量相關的邏輯代碼注釋1處的performMea...
(一)UI繪制流程-源碼分析
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 本文純個人學習筆記,由于水平有限,難免有所出錯,有發現的可以交流一下。 一.setContentView(int layoutResID) 在自定義的 Activity 類中調用 setContentView()方法,會調到 安卓 SDK 的 Activity 類中的 setContentView()方法。 在 Activity 類中的加載我們...
(四)UI繪制流程-瀑布流布局
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 本文純個人學習筆記,由于水平有限,難免有所出錯,有發現的可以交流一下。 一.前言 上一篇給出了流式布局,這里再來一篇瀑布流布局練手,同時代碼稍微簡潔一些。不再利用封裝類來保存數據,直接把子 View 的四個邊沿保存在對應的 LayoutParams 中。 二、分析 1.generateLayoutParams()獲取封裝子 View 的左上右下...
猜你喜歡
王學崗高級UI一——————UI繪制流程(上)
簡書資料地址 https://www.jianshu.com/p/f55467033146 https://www.jianshu.com/p/fc717b47b322 第一app的啟動之Application的創建 程序的啟動就是應用進程(app)和系統進程(SystemServer)的通信。主要是跟系統進程中的AMS通信。應用進程中的四大組件(以Activity為例),系統進程(主要是AMS)...
一 UI繪制流程及原理(Android UI )
在了解繪制原理之前,我們首先了解一下View視圖結構 1. Android UI View視圖結構 View是如何被添加到屏幕窗口上? 1.1 平常代碼中使用如下方式添加布局xml到Activity或Fragment中 1.2 接1.1場景下,接下來在Activity中會調用如下代碼段 1.3 我們知道Window只有一個唯一子類實現:android.view.PhoneWindow 接下來我們查...
3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習
3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習 3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習 自學資源 作業內容 1、基本操作演練【建議做】 天空盒的制作: 地圖的制作: 整體效果: 2、編程實踐 項目要求: 項目結構: 代碼詳解: Actions: ISSActionCallback.cs SSAction.cs SSAction...
FlycoTabLayout 的使用
FlycoTabLayout 一個Android TabLayout庫,目前有3個TabLayout SlidingTabLayout:參照PagerSlidingTabStrip進行大量修改. 新增部分屬性 新增支持多種Indicator顯示器 新增支持未讀消息顯示 新增方法for懶癌患者 CommonTabLayout:不同于SlidingTabLayout對ViewPager依賴,它是一個不...
爬蟲項目實戰八:爬取天氣情況
爬取天氣情況 目標 項目準備 接口分析 代碼實現 效果顯示 寫入本地 目標 根據天氣接口,爬取接下來一周的天氣情況。 項目準備 軟件:Pycharm 第三方庫:requests,BeautifulSoup,csv 接口地址:http://api.k780.com:88/?app=weather.future&weaid=城市名&appkey=10003&sign=b59bc...