正文
context
.
getSystemService
(
Context
.
WINDOW_SERVICE
),
mToken
,
mComponent
.
flattenToString
(),
(
info
.
flags
&
ActivityInfo
.
FLAG_HARDWARE_ACCELERATED
)
!=
0
);
.....
}
在attach()中,新建一个Window实例作为自己的成员变量,它的类型为PhoneWindow,这是抽象类Window的一个子类。然后设置mWindow的WindowManager。
Window,Activity和DecorView
DecorView是FrameLayout的子类,它可以被认为是Android视图树的根节点视图。DecorView作为顶级View,一般情况下它内部包含一个竖直方向的LinearLayout,在这个LinearLayout里面有上下两个部分(具体情况和Android版本及主体有关),上面的是标题栏,下面的是内容栏。在Activity中通过setContentView所设置的布局文件其实就是被加到内容栏之中的,而内容栏的id是content,在代码中可以通过ViewGroup content = (ViewGroup)findViewById(R.android.id.content)来得到content对应的layout。
Window中有几个视图相关的比较重要的成员变量如下所示:
-
mDecor:DecorView的实例,标示Window内部的顶级视图
-
mContentParent:setContetView所设置的布局文件就加到这个视图中
-
mContentRoot:是DecorView的唯一子视图,内部包含mContentParent,标题栏和状态栏。
Activity中不仅持有一个Window实例,还有一个类型为View的mDecor实例。这个实例和Window中的mDecor实例有什么关系呢?它又是什么时候被创建的呢?
二者其实指向同一个对象,这个对象是在Activity调用setContentView时创建的。我们都知道Activity的setContentView实际上是调用了Window的setContentView方法。
@Override
public
void
setContentView
(
int
layoutResID
)
{
if
(
mContentParent
==
null
)
{
//[window]如何没有DecorView,那么就新建一个
installDecor
();
//[window]
}
else
if
(
!
hasFeature
(
FEATURE_CONTENT_TRANSITIONS
))
{
mContentParent
.
removeAllViews
();
}
....
//[window]第二步,将layout添加到mContentParent
mLayoutInflater
.
inflate
(
layoutResID
,
mContentParent
);
.....
}
代码很清楚的显示了布局文件的视图是添加到mContentParent中,而且Window通过installDecor来新建DecorView。
//[window]创建一个decorView
private
void
installDecor
()
{
if
(
mDecor
==
null
)
{