DecorView 的創建

来源:http://www.cnblogs.com/leekx/archive/2017/11/09/7812060.html
-Advertisement-
Play Games

在Activity 的啟動過程中,調用ActivityThread 的handleResumeActivity 方法時,先得到一個與Activity 關聯的PhoneWindow 對象,然後通過PhoneWindow 來獲取DecorView。 PhoneWindow.java DecorView ...


在Activity 的啟動過程中,調用ActivityThread 的handleResumeActivity 方法時,先得到一個與Activity 關聯的PhoneWindow 對象,然後通過PhoneWindow 來獲取DecorView。

PhoneWindow.java

public final View getDecorView() {
  if (mDecor == null) {
    installDecor();
  }
  return mDecor;            
}

private void installDecor() {
  if (mDecor == null) {
    // 生成DecorView
    mDecor = generateDecor();
    mDecor.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
    mDecor.setIsRootNamespace(true);
  }
  if (mContentParent == null) {
    // 根據Window 樣式確定DecorView 中的佈局內容,mContentParent 就是DecorView 的第一個子View,也是我們寫的Activity onCreate()中setContentView() 的父View
    mContentParent = generateLayout(mDecor);
    final DecorContentParent decorContentParent = (DecorContentParent)        mDecor.findViewById(R.id.decor_content_parent);
  }
  ...
}

 

DecorView 是PhoneWindow 的一個內部類,繼承FrameLayout,generateDecor() 也是像平時我們自定義View 是new 一個DecorView,只不過多了一個featureId 參數,該參數如果是-1,表示這個View 是一個DecorView

protected DecorView generateDecor() {
  return new DecorView(getContext(), -1);
}

private final class DecorView extends FrameLayout {
  public DecorView(Context context, int featureId) {
    super(context);
    mFeatureId = featureId;
  }
}

 

 因此,DecorView 中的佈局是怎樣的,主要是由generateLayout(mDecor) 決定的

protected ViewGroup generateLayout(DecorView decor) {
  // 獲取Window 的樣式
  TypedArray a = getWindowStyle();
   ...
  final WindowManager windowService = (WindowManager) getContext().getSysteService(Context.WINDOW_SERVICE);
  if (windowService != null) {
    final Display display = windowService.getDefaultDisplay();
    ...  
  }
  final Context context = getContext();
  final int targetSdk = context.getApplicationInfo().targetSdkVersion();
  ...
  WindowManager.LayoutParams params = getAttributes();
  // Inflate the window decor
  int layoutResource;
  int features = getLocalFeatures();
  if (){
    // 判讀features 中是否包含FEATURE_SWIPE_TO_DISMISS
    
  } else if() {
    // 如果features 包含自定義的Title
    layoutResource = R.layout.screen_custom_title;
  } else {
    // 如果window 屬性沒有任何裝飾(沒有TitleBar,沒有ActionBar 等)
    layoutResource = R.layout.screen_simple;
  }
  mDecor.startChanging();
  // 可以看到DecorView 也是通過inflate 載入佈局的,系統framework 預設的佈局資源位於frameworks\base\core\res\res\layout 目錄下
  View in = mLayoutInflater.inflate(layoutResource, null);
  decor.addView(in, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
  mContentRoot = (ViewGroup) in;
  ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);
  if (contentParent == null) {  
    // 拋出異常
  }
  ...
  mDecor.finishChanging();
  return contentParent;
}

 

由此得出,DecorView 是根據不同的window 屬性通過inflate() 方法載入位於frameworks\base\core\res\res\layout 目錄下對應的佈局資源生成的。至於LayoutInflate.inflate() 方法是如何載入佈局文件並解析生成View 的,將在下篇文章中分析。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 你有兩年以上的前端開發經驗嗎?你會用 Sass 和 Autoprefixer 等高級的CSS輔助技能嗎?你的 JavaScript 知識是否融匯貫通,你是否喜歡使用 Gulp , npm 和 jQuery ?如果是這樣,根據 Ashley Nolan 的前端問卷調查,你是一個典型的前端開發工程師。 ...
  • relative/static: 包含塊為最近的塊級框,表單元格或行內塊祖先框的內容邊界構成 absolute: 包含塊為最近的最近的、position不是static的祖先元素 fixed: 包含塊為視窗,結合top | left | right | bottom,left等初始值為auto ...
  • 個人博客記錄:2017-11-09 png 32位無損壓縮演算法形成的圖片,主要用於logo小圖標和一些點綴的小圖像。放大縮小不會失真,質量好 jpeg,jpg 壓縮比例較高(可達到100:1,即壓縮一百倍),放大縮小失真。適用於比較大的圖片,省流量 gif 動態圖,(你懂得),適用於動畫效果。 ...
  • 效果圖展示: 原理很簡單,主要運用transform這個樣式,通過斜切和旋轉達成 html: css: 怎樣,是不是很簡單 ...
  • 在Web前端頁面實現圓角效果,CSS3幫你輕鬆實現,一個人人皆知的屬性 圓角邊框的繪製是Web頁面和Web應用程式中經常用來美化頁面效果的手法之一。今天,小編為大家介紹CSS3提供的可以將矩形變為圓角矩形的一個屬性 技術等級:中級 | 適合有一定的CSS基礎的人士閱讀。 希望收藏了這篇文章的你同時也 ...
  • 前言 需要用到圖形繪製,沒有找到完整的圖形繪製實現,所以自己實現了一個 - - 一、實現的功能 1、基於oop思想構建,支持坐標點、線條(由坐標點組成,包含方向)、多邊形(由多個坐標點組成)、圓形(包含圓心坐標點和半徑)等實體 2、原生JavaScript實現,不依賴任何第三方js庫和插件 3、多圖 ...
  • 我們平時在同域中請求頁面什麼的時候不會有這種情況,這種情況大多發生在移動端的跨域請求中發生的。 解決方法就是在服務端中加一層過濾HTTP請求的類型,把OPTION等不用的類型過濾掉。就是當請求為非 HTTP中的 GET 和 POST的時候就不執行下麵的代碼,這樣就可以只執行一次請求了。 在ASP.N ...
  • vue.js 一個簡單快捷的JS框架 vue.js 一個簡單快捷的JS框架 vue.js擁有簡單小巧的核心,漸進式技術棧,代碼簡單易學。 雙向綁定 什麼是雙向綁定? 雙向綁定 什麼是雙向綁定? Vue框架 很核心的功能就是雙向的數據綁定 ,雙向是指 HTML標簽數據綁定到Vue對象,另外反方向的數據 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...