1.PhoneWindow
DecorView存在于PhoneWindow类中, 这两个成员变量是属于包含关系,mDecor包含mContentParent
private DecorView mDecor;
private ViewGroup mContentParent;
setContentView 调用 installDecor ,installDecor调用generateDecor 后调用 generateLayout,来产生上面两个变量
mDecor和Layout,Layout里面包含了mContentParent
下面的代码证明了系统的默认window的资源文件的名称和位置,可以去framework找到。
// Inflate the window decor.
int layoutResource;
int features = getLocalFeatures();
// System.out.println("Features: 0x" + Integer.toHexString(features));
if ((features & ((1 << FEATURE_LEFT_ICON) | (1 << FEATURE_RIGHT_ICON))) != 0) {
if (mIsFloating) {
layoutResource = com.android.internal.R.layout.dialog_title_icons;
} else {
layoutResource = com.android.internal.R.layout.screen_title_icons;
}
// System.out.println("Title Icons!");
} else if ((features & ((1 << FEATURE_PROGRESS) | (1 << FEATURE_INDETERMINATE_PROGRESS))) != 0) {
// Special case for a window with only a progress bar (and title).
// XXX Need to have a no-title version of embedded windows.
layoutResource = com.android.internal.R.layout.screen_progress;
// System.out.println("Progress!");
} else if ((features & (1 << FEATURE_CUSTOM_TITLE)) != 0) {
// Special case for a window with a custom title.
// If the window is floating, we need a dialog layout
if (mIsFloating) {
layoutResource = com.android.internal.R.layout.dialog_custom_title;
} else {
layoutResource = com.android.internal.R.layout.screen_custom_title;
}
} else if ((features & (1 << FEATURE_NO_TITLE)) == 0) {
// If no other features and not embedded, only need a title.
// If the window is floating, we need a dialog layout
if (mIsFloating) {
layoutResource = com.android.internal.R.layout.dialog_title;
} else {
layoutResource = com.android.internal.R.layout.screen_title;
}
// System.out.println("Title!");
} else {
// Embedded, so no decoration is needed.
layoutResource = com.android.internal.R.layout.screen_simple;
// System.out.println("Simple!");
}
mDecor除了mContentParent之外,还有以下的View
private TextView mTitleView;
private ImageView mLeftIconView;
private ImageView mRightIconView;
private ProgressBar mCircularProgressBar;
private ProgressBar mHorizontalProgressBar;
除了VIew之外,还有一个背景
private Drawable mBackgroundDrawable;
另外还有这几个特殊的东西
private DrawableFeatureState[] mDrawables;
private PanelFeatureState[] mPanels;
private PanelFeatureState mPreparedPanel;
这几个对应的是各种对话框
public static final int FEATURE_OPTIONS_PANEL = 0;
public static final int FEATURE_CONTEXT_MENU = 6;
PhoneWindow用自己的话说,到底是什么?
这些所有的东西构成了一个Window。
现在可以定义一个Window了,Window就是一些View的集合。有tile,有Dialog有contentview,还有两个icon,还有背景,还有两种ProgressBar
下面的代码在ActivityThread的handleResumeActivity方法中
r.window = r.activity.getWindow();
View decor = r.window.getDecorView();
decor.setVisibility(View.INVISIBLE);
ViewManager wm = a.getWindowManager();
WindowManager.LayoutParams l = r.window.getAttributes();
a.mDecor = decor;
l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
l.softInputMode |= forwardBit;
if (a.mVisibleFromClient) {
a.mWindowAdded = true;
wm.addView(decor, l);
}
PhoneWindow的decorView被安装到了WindowManager中。
下面的代码说明了另外一个问题,就是PhoneWindow如何创建的问题Activity的attach方法中
很搞笑的是Window并不是由WindowManager创建的,而是由PolicyManager创建的。
mWindow = PolicyManager.makeNewWindow(this);
下面的代码说明了另外一个,DecorView的创建问题:就是Activity的setContentView方法 ,
public void setContentView(int layoutResID) {
getWindow().setContentView(layoutResID);
}
@Override
public void setContentView(View view, ViewGroup.LayoutParams params) {
if (mContentParent == null) {
installDecor();
} else {
mContentParent.removeAllViews();
}
mContentParent.addView(view, params);
final Callback cb = getCallback();
if (cb != null) {
cb.onContentChanged();
}
}
2.WindowManager:
继承于ViewManager,里面有三个重要的数组:
private View[] mViews;
private ViewRoot[] mRoots;
private WindowManager.LayoutParams[] mParams;
根据数组下标进行映射,构成了一个 三项MAP。
mRoots实际上是一个handler,这个handler通过callback给Activity发送键盘和鼠标事件。
WindowManagerImpl用自己的话说,到底是什么:
WindowManagerImpl实际上并没有管理Window,管理的是Window与WindowManagerService的对话,mRoots正是这些对话的一个缩影。从继承关系来看,ViewRoot不是一个View,而是实现了ViewParent的Handler,包含一个Surface来绘图。
ViewRoot是一个真正的根。
1.创建一个Surface
2.提供两个对话IWindow和IWindowSession
3.提供Handler对事件进行处理。
分享到:
相关推荐
在Android中,每个Activity都与一个Window对应,它是一个抽象层,负责处理显示内容和用户交互。我们可以通过设置Window的属性来改变应用的视觉效果,例如背景颜色、透明度等。 要实现夜间模式,我们需要做以下几步...
在Android开发中,"悬浮Activity"通常指的是一个可以悬浮在其他应用之上,类似Dialog样式但功能更为丰富的Activity。这样的设计可以提供用户一种便捷的方式访问或操作应用,而无需完全退出当前正在使用的应用。悬浮...
我们知道Android的每一个Activity都有个WindowManager窗体管理器,同样,构建在某个Activity之上的对话框、PopupWindow也有相应的WindowManager窗体管理器。因为对话框、PopupWindown不能脱离Activity而单独存在着,...
LocalActivityManager类是管理activity的,然后通过startActivity(String id, Intent intent)这个方法获取Window获取当前Window对象,再然后调用getDecorView()方法获取当前activity对应的view,这样就可以使用...
在Android系统中,WindowManager服务负责管理所有应用的窗口,而Activity实际上就是一种特殊的Window。默认情况下,Activity会全屏显示,但我们可以通过修改Activity的属性和使用自定义布局来改变这一行为。 1. ...
`Activity`是Android四大组件之一,它代表了一个屏幕界面。每一个Activity都有自己的生命周期,由一系列回调方法组成,这些方法会在特定的时间点被调用。 - **newActivity**: 在`ActivityThread`内部调用,用于创建...
在Android框架的核心部分,`Window`类位于`frameworks\base\core\java\android\view\Window.java`文件中。该文件连同注释一起约有一千多行代码,其中涵盖了`Window`类的基本属性和核心功能。 #### 三、Window类的...
在Android系统中,`Window`类扮演着极其重要的角色,它是应用程序与用户交互的主要界面之一。本文将深入探讨Android中的`Window`类及其相关特性,帮助开发者更好地理解其工作原理以及如何在实际应用中使用。 #### ...
10. Android组件通信:WindowView可能涉及到Activity、Fragment、Service等组件间的通信,如Intent的使用,BroadcastReceiver的注册与接收,以及使用FragmentTransaction进行Fragment的管理。 总之,WindowView的...
**Translucence Window**(半透明窗口)是Android 5.0(Lollipop)引入的新特性,它允许Activity的背景变得半透明,从而实现过渡效果和沉浸式体验。通过设置Window的属性,如FLAG_TRANSLUCENT_STATUS和FLAG_...
这涉及到Android的窗口动画(Window Animation)和场景过渡(Transition)。在本篇文章中,我们将深入探讨如何实现这一功能。 首先,Android中的窗口动画是指当Activity进入或退出屏幕时显示的视觉效果。这可以通过...
本文将深入探讨Activity的实现框架,以及与之相关的Context、Window、View等关键概念。 首先,Activity是Android四大组件之一,它承载了用户界面并处理用户交互。一个Android应用可以包含多个Activity,每个...
每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象,用来描述一个具体的应用程序窗口。每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象,用来...
本压缩包提供的资料是关于如何在Android系统中实现夜间模式的一种方法,即通过在窗口(Window)上添加一层半透明的View来达到效果。下面将详细阐述这一实现方式。 首先,理解Android窗口(Window)的概念至关重要。...
在Android开发中,实现一个可悬浮且能拖动的Activity是一项常见的需求,比如我们常见的悬浮歌词、悬浮小窗口等。这个“Android参考源码-悬浮Activity并可拖动(访悬浮歌词).zip”文件应该包含了实现此类功能的示例...
在Android系统中,Window并非直接与用户界面的View元素等价,而是作为承载View的容器。本文将深入探讨Android中Window添加View的底层原理,包括Window和WindowManager的概念、交互方式以及添加View的关键步骤。 ...
<activity android:name=".TargetActivity"> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </activity> ``` 接着,我们需要在主...
1. 获取Activity的WindowManager服务:`WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);` 2. 使用WindowManager获取Display对象:`Display display = windowManager....
在Android开发中,实现“在所有应用上显示View”通常涉及到系统级插件化或Overlay技术,这是一种高级的Android编程技巧,它允许开发者在任何已安装的应用之上添加自定义的UI元素。这样的功能常见于一些浮动小部件、...