- Android Framework 之 Window / Win
- Android Framework 之 Window / Win
- Android Framework 之 Window / Win
- Android Framework 之 Window / Win
- Android Framework 之 Window / Win
- Android Framework 之 Window / Win
- Android Framework 之 Window / Win
- Android Window / WindowManager 小
- 日更挑战-Android Window、Activity、Dec
- Android UI-测量-布局-绘制-机制
基于Android 12
Android 在线源码搜索网址:http://aosp.opersys.com/xref/android-12.0.0_r2/
Q1: WindowManager 的主要三个操作(addView/updateViewLayout/RemoveView) 是在哪里完成的
A1:
addView/updateViewLayout/RemoveView, 都是 ViewManager 接口里 定义的。
ViewManager 直接子类 WindowManager(接口), 以及 WindowManager 的子类 WindowManagerImpl 均没有实现。
而是在 WindowManagerGlobal 中实现的.
说明: WindowManagerImpl 仅是转发请求给 WindowManagerGlobal
//WindowManagerImpl.java
package android.view;
public final class WindowManagerImpl implements WindowManager {
@UnsupportedAppUsage
private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();
@Override
public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
applyTokens(params);
mGlobal.addView(view, params, mContext.getDisplayNoVerify(), mParentWindow,
mContext.getUserId());
}
@Override
public void updateViewLayout(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
applyTokens(params);
mGlobal.updateViewLayout(view, params);
}
@Override
public void removeView(View view) {
mGlobal.removeView(view, false);
}
}
Q2: Window 怎么获取到 WindowManager 实例对象的?
A2:
通过 Context.getSystemService(Context.WINDOW_SERVICE)
源码分析
package android.view;
public abstract class Window {
public void setWindowManager(WindowManager wm, IBinder appToken, String appName,
boolean hardwareAccelerated) {
mAppToken = appToken;
mAppName = appName;
mHardwareAccelerated = hardwareAccelerated;
if (wm == null) {
wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
}
mWindowManager = ((WindowManagerImpl)wm).createLocalWindowManager(this);
}
}
而 Context.getSystemService 获取到的系统服务, 是在 SystemServiceRegistry.java 的静态代码块中 创建并注册的.
package android.app;
@SystemApi
public final class SystemServiceRegistry {
static {
...
registerService(Context.WINDOW_SERVICE, WindowManager.class,
new CachedServiceFetcher<WindowManager>() {
@Override
public WindowManager createService(ContextImpl ctx) {
return new WindowManagerImpl(ctx);
}});
可以看出,Window 客户端获取到的实例是 WindowManagerImpl (由A1可知,真正实现是WindowManagerGlobal )
Q3: 所有客户端(Window)获取到 的WindowManager 对象实例都是 同一个吗?
A3: 局部变量是, 全局变量不是.
由A2 可知,每个 Window 持有 WindowManager 实例对象,并且是通过 getSystemService 获取的 WindowManagerImpl。
因此, 局部变量 wm 是同一个 WindowManagerImpl 实例对象。
然后, 通过 WindowManagerImpl 的内部方法 createLocalWindowManager 创建一个 新的实例对象。
因此,全局变量 mWindowManager 是 封装了 局部变量 wm 的本地对象.
//WindowManagerImpl.java
package android.view;
public final class WindowManagerImpl implements WindowManager {
public WindowManagerImpl createLocalWindowManager(Window parentWindow) {
return new WindowManagerImpl(mContext, parentWindow, mWindowContextToken);
}
因此, Window 的管理者是 WindowManager, 每个 Window 对应一个 WindowManager 对象.
网友评论