Android 深入了解 Window 、Activity、 View 三者关系,【金九银十

本文从Activity的setContentView入手,探讨Window、Activity和View三者的关系。讲解了从Activity到PhoneWindow,再到WindowManager和WindowManagerImpl的过程,详细分析了如何将布局加载到屏幕上,涉及WindowManagerGlobal、ViewRootImpl以及WMS的角色。同时提到了Android面试复习资料,包括Android开发笔记、面试宝典和源码解析。
摘要由CSDN通过智能技术生成

不知道从哪入手,咱们就从setContentView开始,比较刚创建的Android项目Activity和setContentView是必不可少的。记住看Activity的setContentView而不是AppCompatActivity的

来瞅瞅setContentView:

public void setContentView(@LayoutRes int layoutResID) {

//重点来了

getWindow().setContentView(layoutResID);

//创建并设置ActionBar,

initWindowDecorActionBar();

}

getWindow?这么快就遇到了,好简单,咱继续看。

Activity.getWindow


public Window getWindow() {

return mWindow;

}

本来以为发现大鱼了,显然 Activity 几乎什么都没做,将操作直接交给了一个 Window 来处理。getWindow 返回的是 Activity 中的全局变量 mWindow,它是 Window 窗口类型。那么它是什么时候赋值的呢?

Activity.attach()


找遍了整个Activity源码终于在 attach 方法找到了。咱们先看看代码。

final void attach(Context context, ActivityThread aThread,

Instrumentation instr, IBinder token, int ident,

Application application, Intent intent, ActivityInfo info,

CharSequence title, Activity parent, String id,

NonConfigurationInstances lastNonConfigurationInstances,

Configuration config, String referrer, IVoiceInteractor voiceInteractor,

Window window, ActivityConfigCallback activityConfigCallback, IBinder assistToken) {

attachBaseContext(context);

mFragments.attachHost(null /parent/);

//重点来了对PhoneWindow进行实例化

mWindow = new PhoneWindow(this, window, activityConfigCallback);

mWindow.setWindowControllerCallback(mWindowControllerCallback);

mWindow.setCallback(this);

mWindow.setOnWindowDismissedCallback(this);

mWindow.getLayoutInflater().setPrivateFactory(this);

//调用setWindowManager

mWindow.setWindowManager(

(WindowManager)context.getSystemService(Context.WINDOW_SERVICE),

mToken, mComponent.flattenToString(),

(info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);

}

接下来调用 setWindowManager 方法,将系统 WindowManager 传给 PhoneWindow。

Window:实际上整个 Android 系统中 Window 只有一个实现类,就是 PhoneWindow

PhoneWindow:Android-specific Window(特定窗口).

**WindowManager:**对Window进行管理,说到管理那就离不开对Window的添加、更新和删除的操作,在这里我们把它们统称为Window的操作。对于Window的操作,最终都是交由WMS来进行处理。

Window.setWindowManager

=======================

public void setWindowManager(WindowManager wm, IBinder appToken, String appName,

boolean hardwareAccelerated) {

mAppToken = appToken;

mAppName = appName;

mHa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值