不依赖Activity、Dialog显示View方法
一、首先我们先看下Activity是如何显示View
平常我们在Activity的onCreate会调用setContentView(R.layout.xxx),Activity启动过程与window的源码流程可参考
Activity Window WMS的源码关系流程介绍
总结几个步骤:
1、创建Activity:ActivityThread的performLaunchActivity函数中创建Activity后,调用Activity.attach函数
2、创建PhoneWindow:Activity.attach函数中创建与之关联的PhoneWindow,PhoneWindow会创建DectorView。
3、添加视图:setContentView添加到PhoneWindow的DectorView中
4、关联PhoneWindow到WMS中:ActivityThread实行完performLaunchActivity,会handleResumeActivity,走到Activity的onResume,然后设置Activity的PhoneWindow的type类型:
PhoneWindow会创建DectorView,通过WindowManagerImpl-->WindowManagerGlobal-->ViewRootImpl-->(binder)WMS中的Session的addToDisplay函数,这样视图就会显示出来。
我们看下 l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
WindowManager.java:
从英文翻译来看,这个type是应用程序的window类型。
二、Dialog显示View:
我们顺着alertDialog.show():
其中final AlertDialog dialog = new AlertDialog(P.mContext, 0, false);
super是Dialog,接着看Dialog的构造函数:
这边会创建Dialog的PhoneWindow,我们看PhoneWindow的构造函数
父类Window的
看WindowManager.LayoutParams:
这个type的默认window类型是TYPE_APPLICATION:
这个Dialog的window就需要依赖Activity来显示了。
三、直接使用系统级的Window类型,来添加View:
这个context上下文可以是service、application的。
其中layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
这是系统级的window