Android Framework 之 Window / Win
2022-11-22 本文已影响0人
行走中的3卡
Dialog 创建 Window 的过程是在 构造函数里,
对比 Activity 的是在 attach 函数里. 对比一起分析,效果更佳.
Android Framework 之 Window / WindowManager (4) - Activity的 Window 创建过程 源码分析
1. 创建 Window
Dialog 构造函数
//Dialog.java
package android.app;
public class Dialog implements DialogInterface, Window.Callback... {
Dialog(@UiContext @NonNull Context context, @StyleRes int themeResId,
boolean createContextThemeWrapper) {
....
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
final Window w = new PhoneWindow(mContext);
mWindow = w;
w.setCallback(this);
...
w.setWindowManager(mWindowManager, null, null);
可以看出,和 Activity 创建 Window 的逻辑类似,
通过 Context 获取 WindowManager 对象, 创建 PhoneWindow 对象,
设置回调, 设置 WindowManager 等.
2. 设置内容视图 setContentView
同样,使用 setContentView 设置 内容, 可以传入 布局id/view、参数等
public void setContentView(@LayoutRes int layoutResID) {
mWindow.setContentView(layoutResID);
}
public void setContentView(@NonNull View view) {
mWindow.setContentView(view);
}
public void setContentView(@NonNull View view, @Nullable ViewGroup.LayoutParams params) {
mWindow.setContentView(view, params);
}
之后,还是通过 Window 的 setContentView 进行设置, 和 Activity的类似.
3. 将 DecorView 添加到 Window 中
这里和Activity 需要在 ActivityThread.handleResumeActivity 添加 不一样
Dialog 是通过 调用 show() 添加的.
public void show() {
if (mShowing) {
if (mDecor != null) {
....
mDecor.setVisibility(View.VISIBLE);
}
return;
}
...
mDecor = mWindow.getDecorView();
...
mWindowManager.addView(mDecor, l);
mShowing = true;
sendShowMessage();
}
分析
(1) 先判断是否正在显示,如果是 并且 mDecor 不为空,则直接设置visible
(2) 没有在显示,则调用 WindowManager.addView 执行添加 操作,此刻才会显示内容.
普通 Dialog 需要使用 Activity Context 创建.
系统 Dialog, 需要设置对应 WindowType