Android的Activity檢視層級分析
Activity檢視層級圖
Activity的初始化
Activity的初始化是從從Activity的setContentView(),原始碼為
public void setContentView(View view) {
getWindow().setContentView(view);
initWindowDecorActionBar();
}
public void setContentView(@LayoutRes int layoutResID) {
getWindow().setContentView(layoutResID);
initWindowDecorActionBar();
}
public void setContentView(View view, ViewGroup.LayoutParams params) {
getWindow().setContentView(view, params);
initWindowDecorActionBar();
}
三種過載方法,都有呼叫initWindowDecorActionBar()為顯示Decor和ActionBar
private void initWindowDecorActionBar() {
//window是抽象類,所以找其實現類phoneWindow
Window window = getWindow();
//初始化decorview
window.getDecorView();
if (isChild() || !window.hasFeature(Window.FEATURE_ACTION_BAR) || mActionBar != null) {
return;
}
//新建actionbar
mActionBar = new WindowDecorActionBar(this);
mActionBar.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp);
//設定actionbar的圖示
mWindow.setDefaultIcon(mActivityInfo.getIconResource());
mWindow.setDefaultLogo(mActivityInfo.getLogoResource());
}
PhoneWindow的實現類
public void setContentView(int layoutResID) {
// Note: FEATURE_CONTENT_TRANSITIONS may be set in the process of installing the window
// decor, when theme attributes and the like are crystalized. Do not check the feature
// before this happens.
if (mContentParent == null) {
//初始化decor
installDecor();
} else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
mContentParent.removeAllViews();
}
if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID,
getContext());
transitionTo(newScene);
} else {
mLayoutInflater.inflate(layoutResID, mContentParent);
}
mContentParent.requestApplyInsets();
final Callback cb = getCallback();
if (cb != null && !isDestroyed()) {
cb.onContentChanged();
}
}
初始化DecorView程式碼
private void installDecor() {
if (mDecor == null) {
mDecor = generateDecor();
mDecor.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
mDecor.setIsRootNamespace(true);
if (!mInvalidatePanelMenuPosted && mInvalidatePanelMenuFeatures != 0) {
mDecor.postOnAnimation(mInvalidatePanelMenuRunnable);
}
}
if (mContentParent == null) {
mContentParent = generateLayout(mDecor);
// Set up decor part of UI to ignore fitsSystemWindows if appropriate.
mDecor.makeOptionalFitsSystemWindows();
final DecorContentParent decorContentParent = (DecorContentParent) mDecor.findViewById(
R.id.decor_content_parent);
if (decorContentParent != null) {
mDecorContentParent = decorContentParent;
mDecorContentParent.setWindowCallback(getCallback());
if (mDecorContentParent.getTitle() == null) {
mDecorContentParent.setWindowTitle(mTitle);
}
最後Activity的檢視層級為
再做一次反向操作,從DecorView中Remove。一步一步來看看取消了什麼。
getDecorView(activity)..removeViewAt(decor.getChildCount() - 1)
public void removeViewAt(int index) {
//檢視這個方法
removeViewInternal(index, getChildAt(index));
requestLayout();
invalidate(true);
}
public View getChildAt(int index) {
if (index < 0 || index >= mChildrenCount) {
return null;
}
return mChildren[index];
}
Ctrl+U 分別計算mChildren[0],mChildren[1],mChildren[2]的getleft,getright,gettop,getbottom的值。
mChildren[2]是最上方的狀態條的檢視。
mChildren[1]是最底部的導航條的檢視。
mChildren[0]是背景整個檢視。
注:國產手機不一定能看到。
參考文章:http://blog.csdn.net/mr_liabill/article/details/49534851
可通過對Activity檢視層級的研究,將浮窗靈活運用。
http://www.jianshu.com/p/b4c23dee9206
http://www.jianshu.com/p/50fbec2baeb4
相關推薦
Android的Activity檢視層級分析
Activity檢視層級圖 Activity的初始化 Activity的初始化是從從Activity的setContentView(),原始碼為 public void setContentView(View view) {
Python——異常層級分析
ali com alt too 直接 數值 意義 roc brush 1、大部分的內置異常都是Exception的子類2、Exception本身是從BaseException類繼承過來的3、因此所有的異常都是必須從BaseException類進行擴展4、Exception是
檢視、分析memcache使用狀態
先連線上memcache,假設memcache服務在本機上,並監聽在預設埠11211上。 telnet連線到memcached: telnet 127.0.0.1 11211 訪問量上升,資料庫壓力大,怎麼辦?好辦法是在中間擋一層快取!這個快取要求高效,不能比資料庫慢,否則
task_struct 結構如何檢視及分析
cd / find -name sched.h vim usr/src/kernels/3.10.0862.6.3.el7.x86_64/include/linux/sched.h https://www.cnblogs.com/zxc2man/p/664
程式碼遍歷當前window獲取檢視層級結構
一,選擇捕獲檢視層級的時機; 我選擇在觸控到螢幕的時候捕獲; 二,開始遍歷; - (NSMutableArray *)pageStructure:(UIView *)sView { NSMutableArray *arr =
記憶體洩露-Android Studio 生成Dump 的 HPROF 檔案檢視和分析工具
0. 文章參考 1. HPROF 檔案 作用 HPROF檢視工具會列出類、類的例項和例項的引用樹,以此來幫助你跟蹤記憶體的使用情況,找出記憶體洩漏的地方。 2. dump Hprof file Android Studio 到匯出 HPROF
AlexNet層級分析(涉及:卷積核操作下下層網路特徵圖size計算;對通道和卷積核尺寸及通道前層feature map和卷積核的運算關係的解釋)
先盜一圖,摘自ImageNet Classification with Deep Convolutional Neural Networks(Hinton)注:看到這個結構,可以得到以下結論(以2、3層為例)1、第三層有128*2=256個通道,第二層有48*2=96個通道。
Java 記憶體檢視與分析
1:gc日誌輸出 在jvm啟動引數中加入 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimestamps -XX:+PrintGCApplicationStopedTime,jvm將會按照這些引數順序輸出gc概要資訊,
android HierarchyViewer檢視檢視層級關係
今天看到一篇文章,講的是UI過度繪製,裡面有提到很多方法,比較不錯。想想確實有時候我們在做開發時候,發現UI效能怎麼那邊差,也沒有做什麼複雜的操作。那為什麼會效能很差呢。也找不到好的辦法來分析。但
InnoDB引擎的資料庫狀態檢視(分析行鎖)
通過檢查InnoDB_row_lock狀態變數來分析系統上的行鎖的爭奪情況show status like 'innodb_row_lock%';對於各個狀態說明如下:Innodb_row_lock_current_waits:當前正在等待鎖的數量;Innodb_row_lo
iOS Crash崩潰異常教你檢視和分析
要學會看crash崩潰和報告 一個應用程式並不總會一直執行的很好,它總會有出現crash崩潰的情況。如果在應用程式中接入了一些第三方的crash收集工具或者自建crash收集報告平臺的話將會很好的幫助開發者去分析和解決應用程式在線上執行的問題,當出現的崩潰問題
java web 層級分析
DAO層DAO層主要是做資料庫持久層的工作,負責與資料庫進行聯絡的一些任務都封裝在這裡。DAO層的設計首先是設計DAO層的介面,然後在spring的配置檔案中定義此介面的實現類,然後就可以在模組中呼叫此介面來進行資料業務的處理,而不用關係此介面具體的實現類是哪個類,顯得介面非
Java記憶體Dump檔案檢視和分析工具介紹
1.IBM Memory Analyzer 1)下載地址: https://www6.software.ibm.com/sdfdl/1v2/regs2/awadmin/heapanalyzer/Xa.2/Xb.NoLhAb4A5Mgi2gFYiaC87ef6mY6etlyz
【Android】浮動視窗層級分析
轉載自:http://www.liuguangli.win/archives/category/uncategorized/android 最近在專案中遇到了這樣的需求:需要在特定的其他應用之上懸浮自己的UI互動(拖動、輸入等複雜的UI互動),和九遊的浮窗類似,不過我們
Django之CBV檢視原始碼分析(工作原理)
1.首先我們先在urls.py定義CBV的路由匹配。 FBV的路由匹配: 2.然後,在views.py建立一名為MyReg的類: 注意:該類必須繼續View類,且方法名必須與請求方式相同(後面會詳解) 3.回到第一步的路由匹配可以看到MyReg.as_view(),直接呼叫了as_view函式。那
Navicat Premium 常用功能講解,分析sql,處理鎖表,檢視資料庫執行
Navicat Premium 常用功能講解 Navicat Premium 常用功能講解 1.快捷鍵 1.1. F8 快速回到當前物件列表 1.2. Ctrl + q 開啟查詢介面 1.3. Ctrl + d 快速修改當前的表結構 1.4.
iOS開發:第一個iOS程式分析——AppDelegate.h檔案和檢視View、檢視控制器ViewController
在上一篇文章iOS開發:第一個iOS程式分析——代理,生命週期函式中主要介紹了iOS使用Objective-C開發的兩個主要檔案main.m和AppDelegate.m和控制程式生命週期的函式,接下來將介紹另外兩個檔案:AppDelegate.h檔案、UIViewController.m檔案和i
Springboot使用Jsp模板檢視開發web應用(含問題分析)
最近有個springcloud專案,所有服務返回的資訊是json字串,現在需要對專案進行改造,使用jsp頁面返回服務呼叫結果。開發工具為Idea。 先來看一下專案結構(只展示涉及到的部分,如果你的專案中沒有對應資料夾,需要新建資料夾): ├── src │ ├── main │
0017-Spark的HistoryServer不能檢視到所有歷史作業分析
溫馨提示:要看高清無碼套圖,請使用手機開啟並單擊圖片放大檢視。 1.問題描述 Spark的HistoryServer能正常檢視之前的歷史作業日誌,但新提交的作業在執行完成後未能在HistoryServer頁面檢視。 2.問題復現 1.分別使用root和ec2-user使用者執行作業 2
Oracle 編譯儲存過程報錯: 表或檢視不存在問題分析與解決
今天遇到一個問題,自己寫了一個很簡單的儲存過程,編譯的時候,報錯: 表或檢視不存在; 但是:表確實是存在,單獨拿出來查詢,一點問題也沒有。 經過幾番查詢,找到了問題所在: 查詢表的許可權不夠; 解決方案: