- 浏览: 22521 次
- 性别:
- 来自: 北京
最新评论
page9
在这里我们分析一下DisplayManager的getDisplay函数的实现:
1 public Display getDisplay(int displayId) {
2 synchronized (mLock) {
3 return getOrCreateDisplayLocked(displayId, false /*assumeValid*/);
4 }
5 }
第2行(DisplayManager->getDisplay)居然用一个锁, 不怕卡顿么?为什么要保护呢?
第3行(DisplayManager->getDisplay)会调用getOrCreateDisplayLocked函数, getOrCreateDisplayLocked函数的定义如下:
1 private Display getOrCreateDisplayLocked(int displayId, boolean assumeValid) {
2 Display display = mDisplays.get(displayId);
3 if (display == null) {
4 display = mGlobal.getCompatibleDisplay(displayId,
5 mContext.getCompatibilityInfo(displayId));
6 if (display != null) {
7 mDisplays.put(displayId, display);
8 }
9 } else if (!assumeValid && !display.isValid()) {
10 display = null;
11 }
12 return display;
13 }
第2行(DisplayManager->getOrCreateDisplayLocked)会尝试在cache里获取.
第4行(DisplayManager->getOrCreateDisplayLocked)会调用DisplayManagerGlobal的getCompatibleDisplay函数,
其中传入的第二个参数通过调用ContextImpl的getCompatibilityInfo函数得到的, getCompatibilityInfo函数的定义如下:
@Override
public CompatibilityInfoHolder getCompatibilityInfo(int displayId) {
return displayId == Display.DEFAULT_DISPLAY ? mPackageInfo.mCompatibilityInfo : null;
}
关于DisplayManagerGlobal的getCompatibleDisplay函数的详细分析可以参考page10文件.
第12行(DisplayManager->getOrCreateDisplayLocked)返回该Display对象.
page10
DisplayManagerGlobal的getCompatibleDisplay函数的定义如下:
1 public Display getCompatibleDisplay(int displayId, CompatibilityInfoHolder cih) {
2 DisplayInfo displayInfo = getDisplayInfo(displayId);
3 if (displayInfo == null) {
4 return null;
5 }
6 return new Display(this, displayId, displayInfo, cih);
7 }
第2行(DisplayManagerGlobal->getCompatibleDisplay)会调用getDisplayInfo函数来获得当前显示设备的DisplayInfo.
getDisplayInfo函数的定义如下:
public DisplayInfo getDisplayInfo(int displayId) {
try {
synchronized (mLock) {
DisplayInfo info;
if (USE_CACHE) {
info = mDisplayInfoCache.get(displayId);
if (info != null) {
return info;
}
}
info = mDm.getDisplayInfo(displayId);
if (info == null) {
return null;
}
if (USE_CACHE) {
mDisplayInfoCache.put(displayId, info);
}
registerCallbackIfNeededLocked();
if (DEBUG) {
Log.d(TAG, "getDisplayInfo: displayId=" + displayId + ", info=" + info);
}
return info;
}
} catch (RemoteException ex) {
Log.e(TAG, "Could not get display information from display manager.", ex);
return null;
}
}
getDisplayInfo函数的主要逻辑就是通过DisplayManager服务通过Binder来获得DisplayInfo信息, 并返回该DisplayInfo对象.
第6行(DisplayManagerGlobal->getCompatibleDisplay)会用刚刚得到的DisplayInfo对象构造一个Display, 我们来看看Display的构造函数是如何定义的:
public Display(DisplayManagerGlobal global,
int displayId, DisplayInfo displayInfo /*not null*/,
CompatibilityInfoHolder compatibilityInfo) {
mGlobal = global;
mDisplayId = displayId;
mDisplayInfo = displayInfo;
mCompatibilityInfo = compatibilityInfo;
mIsValid = true;
// Cache properties that cannot change as long as the display is valid.
mLayerStack = displayInfo.layerStack;
mFlags = displayInfo.flags;
mType = displayInfo.type;
mAddress = displayInfo.address;
}
构造函数除了初始化成员变量之外, 什么也没做啊.
page11
这里我们分析一下PhoneWindow的setContainer函数的实现:
public final void setContainer(Window container) {
super.setContainer(container);
}
因为PhoneWindow继承自Window, 所以会调用Window的setContainer函数, Window的setContainer函数的定义如下:
public void setContainer(Window container) {
mContainer = container;
if (container != null) {
// Embedded screens never have a title.
mFeatures |= 1<<FEATURE_NO_TITLE;
mLocalFeatures |= 1<<FEATURE_NO_TITLE;
container.mHasChildren = true;
}
}
Window的setContainer函数的主要逻辑就是将container的mHasChildren设置为true
在这里我们分析一下DisplayManager的getDisplay函数的实现:
1 public Display getDisplay(int displayId) {
2 synchronized (mLock) {
3 return getOrCreateDisplayLocked(displayId, false /*assumeValid*/);
4 }
5 }
第2行(DisplayManager->getDisplay)居然用一个锁, 不怕卡顿么?为什么要保护呢?
第3行(DisplayManager->getDisplay)会调用getOrCreateDisplayLocked函数, getOrCreateDisplayLocked函数的定义如下:
1 private Display getOrCreateDisplayLocked(int displayId, boolean assumeValid) {
2 Display display = mDisplays.get(displayId);
3 if (display == null) {
4 display = mGlobal.getCompatibleDisplay(displayId,
5 mContext.getCompatibilityInfo(displayId));
6 if (display != null) {
7 mDisplays.put(displayId, display);
8 }
9 } else if (!assumeValid && !display.isValid()) {
10 display = null;
11 }
12 return display;
13 }
第2行(DisplayManager->getOrCreateDisplayLocked)会尝试在cache里获取.
第4行(DisplayManager->getOrCreateDisplayLocked)会调用DisplayManagerGlobal的getCompatibleDisplay函数,
其中传入的第二个参数通过调用ContextImpl的getCompatibilityInfo函数得到的, getCompatibilityInfo函数的定义如下:
@Override
public CompatibilityInfoHolder getCompatibilityInfo(int displayId) {
return displayId == Display.DEFAULT_DISPLAY ? mPackageInfo.mCompatibilityInfo : null;
}
关于DisplayManagerGlobal的getCompatibleDisplay函数的详细分析可以参考page10文件.
第12行(DisplayManager->getOrCreateDisplayLocked)返回该Display对象.
page10
DisplayManagerGlobal的getCompatibleDisplay函数的定义如下:
1 public Display getCompatibleDisplay(int displayId, CompatibilityInfoHolder cih) {
2 DisplayInfo displayInfo = getDisplayInfo(displayId);
3 if (displayInfo == null) {
4 return null;
5 }
6 return new Display(this, displayId, displayInfo, cih);
7 }
第2行(DisplayManagerGlobal->getCompatibleDisplay)会调用getDisplayInfo函数来获得当前显示设备的DisplayInfo.
getDisplayInfo函数的定义如下:
public DisplayInfo getDisplayInfo(int displayId) {
try {
synchronized (mLock) {
DisplayInfo info;
if (USE_CACHE) {
info = mDisplayInfoCache.get(displayId);
if (info != null) {
return info;
}
}
info = mDm.getDisplayInfo(displayId);
if (info == null) {
return null;
}
if (USE_CACHE) {
mDisplayInfoCache.put(displayId, info);
}
registerCallbackIfNeededLocked();
if (DEBUG) {
Log.d(TAG, "getDisplayInfo: displayId=" + displayId + ", info=" + info);
}
return info;
}
} catch (RemoteException ex) {
Log.e(TAG, "Could not get display information from display manager.", ex);
return null;
}
}
getDisplayInfo函数的主要逻辑就是通过DisplayManager服务通过Binder来获得DisplayInfo信息, 并返回该DisplayInfo对象.
第6行(DisplayManagerGlobal->getCompatibleDisplay)会用刚刚得到的DisplayInfo对象构造一个Display, 我们来看看Display的构造函数是如何定义的:
public Display(DisplayManagerGlobal global,
int displayId, DisplayInfo displayInfo /*not null*/,
CompatibilityInfoHolder compatibilityInfo) {
mGlobal = global;
mDisplayId = displayId;
mDisplayInfo = displayInfo;
mCompatibilityInfo = compatibilityInfo;
mIsValid = true;
// Cache properties that cannot change as long as the display is valid.
mLayerStack = displayInfo.layerStack;
mFlags = displayInfo.flags;
mType = displayInfo.type;
mAddress = displayInfo.address;
}
构造函数除了初始化成员变量之外, 什么也没做啊.
page11
这里我们分析一下PhoneWindow的setContainer函数的实现:
public final void setContainer(Window container) {
super.setContainer(container);
}
因为PhoneWindow继承自Window, 所以会调用Window的setContainer函数, Window的setContainer函数的定义如下:
public void setContainer(Window container) {
mContainer = container;
if (container != null) {
// Embedded screens never have a title.
mFeatures |= 1<<FEATURE_NO_TITLE;
mLocalFeatures |= 1<<FEATURE_NO_TITLE;
container.mHasChildren = true;
}
}
Window的setContainer函数的主要逻辑就是将container的mHasChildren设置为true
发表评论
-
Activity与WindowManagerService连接的过程(三)
2018-04-16 16:27 584page11 WindowManagerService ... -
Activity与WindowManagerService连接的过程(二)
2018-04-16 16:36 706page6 WindowManagerGlobal的getW ... -
Activity与WindowManagerService连接的过程(一)
2018-04-16 16:21 955page1 Activity组件在 ... -
Activity的ViewRoot的创建过程(三)
2017-11-06 14:25 707page7 在这篇文章里, 我们分析一下W类的构造过程. W ... -
Activity的ViewRoot的创建过程(二)
2017-11-06 14:29 869page4 我们看一下ViewRootImpl对象的创 ... -
Activity的ViewRoot的创建过程(一)
2017-11-06 14:27 1026page1 当一个Activity第一次激活的时候会为该Ac ... -
Activity的Window和WindowManager的创建过程(二)
2017-07-05 11:31 499page5 在这篇文章中, 我们分析一下ContextImp ... -
Activity的Window和WindowManager的创建过程(一)
2017-07-05 11:27 575page1 我们开始分析一下Activity的Window和 ... -
Acitivy创建Context的过程(二)
2017-06-21 14:11 452page4 在这里我们分析一下ContextImpl的ini ... -
Acitivy创建Context的过程(一)
2017-06-21 14:15 586page1 从本篇文章开始,我们分析一下Activity创建 ... -
应用程序进程与SurfaceFlinger的连接过程
2017-06-21 11:49 1025我们从SurfaceComposerClient对象的创建开始 ... -
Android源码之SurfaceFlinger的启动(三)
2017-04-20 11:09 1003page11 我们来看一下SurfaceFlinger ... -
Android源码之SurfaceFlinger的启动(二)
2017-04-18 15:15 813page6 我们看一下Thread的run函数的实现: ... -
Android源码之SurfaceFlinger的启动(一)
2017-04-17 10:07 908page1 在Android系统中, 显示系统在底层是通过S ... -
Android源码之Zygote
2015-12-15 11:45 481当ActivityManagerService启动一个应用程序 ... -
Android源码之Binder(五)
2015-12-04 09:19 1415Service组件在启动时,需要将自己注册到Service M ... -
Android源码之Binder(四)
2015-12-04 09:18 1803case BINDER_SET_MAX_THREADS: ... -
Android源码之Binder(三)
2015-12-04 09:17 881{ int ret; struct binder_pr ... -
Android源码之Binder(二)
2015-12-04 09:15 502分析完Binder驱动程序的打开和内存分配的过程之后,我们看一 ... -
Android源码之Binder(一)
2015-12-04 09:12 962在Android系统中,进程间通信使用的是Binder机制。B ...
相关推荐
Window是一个抽象类,具体实现是 PhoneWindow 。不管是 Activity 、 Dialog 、 Toast 它们的视图都是附加在Window上的,因此Window实际上是View的直接管理者。
创建一个Window,需要通过WindowManager即可完成,WindowManager是外界访问Window的入口,Window具体实现位于WindowManagerService中,WindowManager和WindowManagerService的交互是一个IPC的过程。Android中,所有...
最近有学生做毕业设计,想使用悬浮窗这种效果,其实很简单,我们可以通过系统服务WindowManager来实现此功能,本章我们来试验一下在当前Activity之上创建一个悬浮的view。 第一步:认识WindowManager 这个接口用于与 ...
一个WindowManager悬浮窗,悬浮显示歌词效果。WindowManager背景设置为了透明色,显示的WindowManager关闭启动它的Activity回到主界面仍然有效。仅供参考............
8.3.1 Activity的Window创建过程 304 8.3.2 Dialog的Window创建过程 308 8.3.3 Toast的Window创建过程 311 第9章 四大组件的工作过程 316 9.1 四大组件的运行状态 316 9.2 Activity的工作过程 318 9.3 Service...
Activity,Window,DecorView,ViewRootImpl,WindowManager,WindowManagerImpl,WindowManagerGlobal,WindowManagerService相关类图
8.3.1 Activity的Window创建过程 / 304 8.3.2 Dialog的Window创建过程 / 308 8.3.3 Toast的Window创建过程 / 311 第9章 四大组件的工作过程 / 316 9.1 四大组件的运行状态 / 316 9.2 Activity的工作过程...
设置Dialog首先通过getWindow()方法获取它的窗口,然后通过getAttributes()方法获得window的WindowManager.LayoutParams lp, lp有个公共属性windowAnimations, 只要把要实现的animation的id赋值给它就可以了。...
《Android进阶解密》源码 源码目录介绍 目录 简介 ...第1章介绍Android系统架构、系统源码目录和如何阅读源码,带领大家走进Android...第7章介绍WindowManager,包括WindowManager的关联类、Window的属性和Window
我们知道Android的每一个Activity都有个WindowManager窗体管理器,同样,构建在某个Activity之上的对话框、PopupWindow也有相应的WindowManager窗体管理器。因为对话框、PopupWindown不能脱离Activity而单独存在着,...
Activity设置全屏和无标题栏,要用到andorid.view.Window和Android.view.WindowManager。 Window.FEATURE_NO_TITLE表示无标题栏。 WindowManager.LayoutParams.FLAG_FULLSCREEN表示全屏。 具体用法如下: 1、设置...
前言 当我们在手机上使用360安全卫士时,手机屏幕上时刻都会出现一个小浮动窗口,点击该浮动窗口可...通过Context.getSystemService(Context.WINDOW_SERVICE)可以获得 WindowManager对象。 每一个WindowManager对象
Windows Manager是一款窗口管理终端,可以远程连接到Linux的X桌面进行管理,...Window&&WindowManager介绍 分析demo之前,先要整理总结一下相关的知识。先看看Window类,Window是一个抽象类,位于代码树frameworks\u0
注意:PopupWindow组件的使用问题,PopupWindow是一个阻塞对话框,如果你直接在Activity创建的方法中显示它,则会报错:android.view.WindowManager$BadTokenException:Unable to add window -- token null is not ...
这种方法就可以在Activity运行过程中,动态地改变全屏与否。 六、音量调节: 音量调节的方法其实很简单,不过有人问到,我就在这里顺便说下: AudioManager am = (AudioManager) mContext.getSystemService...
前言 你会发现QQ视频的时候,就算手机回到...Window整体分三种类型:应用Window、子Window、系统Window。 应用Window:对应一个Activity 子Window:不能单独存在,它需要附属在特定的父Window中,比如常见的一些Dial
每个Activity都有一个Window对象,这个对象是PhoneWindow类型的。 每个Window对象里面都维护着一个WindowManager对象。 Activity里面添加一个View是通过WindowManager的addView()方法实现的 相关关键类 ...