不依赖Activity、Dialog显示View方法

 我来答
世纪网络17
2022-06-03 · TA获得超过5924个赞
知道小有建树答主
回答量:2426
采纳率:100%
帮助的人:139万
展开全部

一、首先我们先看下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

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式