美文网首页
Android Framework 之 Window / Win

Android Framework 之 Window / Win

作者: 行走中的3卡 | 来源:发表于2022-11-20 20:47 被阅读0次

基于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 对象.

相关文章

网友评论

      本文标题:Android Framework 之 Window / Win

      本文链接:https://www.haomeiwen.com/subject/igcpxdtx.html