[Android]从源码的角度理解为什么Dialog不能在Application中展示

本文从源码角度深入探讨为何Dialog不能在Android Application中展示。通过分析`WindowManagerService#addWindow`方法,揭示了当Dialog的Window类型与APP_TOKEN不匹配时抛出异常的原因。讲解了WindowToken的创建过程,以及Activity启动时如何生成AppWindowToken,并探讨了在Application和Activity中启动Dialog时WindowManager的处理差异。
摘要由CSDN通过智能技术生成

throw new RuntimeException(
"Unable to add window – unknown error code " + res);
}

}
}
}

在这个方法中,我们找到了抛出异常的地方,当res的值为WindowManagerGlobal.ADD_BAD_APP_TOKEN或则WindowManagerGlobal.ADD_BAD_SUBWINDOW_TOKEN时,会抛出文章开头处的错误。 这个res是IWindowSession#addToDisplay方法的返回值。IWindowSession是一个Binder接口,负责View
RootImpl和WindowManagerService的通信,在ViewRootImpl对象创建时获取。在这里IWindowSession#addToDisplay最终会调用WindowManagerService#addWindow方法:

// com.android.server.wm.WindowManagerService
public int addWindow(Session session, IWindow client, int seq,
WindowManager.LayoutParams attrs, int viewVisibility, int displayId,
Rect outContentInsets, Rect outStableInsets, Rect outOutsets,
InputChannel outInputChannel) {

synchronized(mWindowMap) {

if (type >= FIRST_SUB_WINDOW && type <= LAST_SUB_WINDOW) {
parentWindow = windowForClientLocked(null, attrs.token, false);
if (parentWindow == null) {
Slog.w(TAG_WM, "Attempted to add window with token that is not a window: "

  • attrs.token + “. Aborting.”);
    return WindowManagerGlobal.ADD_BAD_SUBWINDOW_TOKEN;
    }
    if (parentWindow.mAttrs.type >= FIRST_SUB_WINDOW
    && parentWindow.mAttrs.type <= LAST_SUB_WINDOW) {
    Slog.w(TAG_WM, "Attempted to add window with token that is a sub-window: "
  • attrs.token
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值