DialogFragment 与 android.view.WindowManager$BadTokenException

光互连技术统一标准:从核心原理到开发者实践指南 光互连技术作为下一代高速数据传输的核心,通过光波替代电信号,解决了传统电互连在带宽、功耗和传输距离上的瓶颈。其原理基于光波导和波分复用技术,实现了超高带宽、低损耗和抗电磁干扰的优势,为数据中心、云计算和人工智能算力提供了关键支撑。在技术价值层面,光互连不仅提升了系统性能,还通过标准化降低了产业链成本。应用场景涵盖从长距离骨干网到芯片级互连的多个层次,其中CPO(共封装光学)和硅光技术是解决功耗和带宽挑战的前沿方向。当前,行业正推动统一标准以打破生态割裂,本文聚焦光互连的核心概念、技术挑战及实践要点,为开发者 阅读详情

在项目中,有一个场景是某个 Activity 中会触发一个 BottomSheetDialogFragment,并在某些情况下会常驻显示不消失。

然后就在线上遇到了一类 crash:

android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@c7a2c02 is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:992)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:390)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
at android.app.Dialog.show(Dialog.java:379)
at androidx.fragment.app.DialogFragment.onStart(DialogFragment.java:486)

目前推测的原因是:应用被重建(由应用启动运行时间很短推测,目测是应用退到了后台,被回收之后又被恢复)导致 Activity 被销毁重建,老的 DialogFragment 被恢复,但其绑定的还是被销毁前的 Activity Context(仅推测,还没有研究过源码),从而在恢复的时候被调用到 DialogFragment.onStart(),最终出现了上述问题。

目前解决的方法是,在 DialogFragment show 的时候绑定 tag,然后每次页面初始化的时候,先通过 FragmentManager#findFragmentByTag(tag) 来判断是否已经存在,如果存在则先移除老的。

fun removeOldObjIfExist(fragmentManager: FragmentManager) {
    val old = fragmentManager.findFragmentByTag(SHOW_TAG) ?: return
    fragmentManager.beginTransaction()
            .remove(old)
            .commitAllowingStateLoss()
}
Android Kotlin弹窗开发:从AlertDialog到生产级DialogFragment AlertDialog是Android中最基础的轻量级UI控制器,其本质是依赖Context、受FragmentManager管理、响应配置变更的生命周期敏感组件。在Kotlin环境下,它与空安全、协程作用域、作用域函数深度耦合,稍有不慎即引发BadTokenException、内存泄漏或无障碍审核失败。本文围绕DialogFragment这一官方推荐方案,系统解析生命周期绑定、协程取消机制、Material主题适配及无障碍支持四大核心原理,覆盖ConfirmDialog、LoginDialog、Loadi 阅读详情

相关推荐

Android ProgressDialog废弃原因与现代替代方案

ProgressBar是Android官方推荐的标准化进度指示组件,用于在异步任务中提供可视化反馈;Dialog则是轻量可控的模态容器,二者组合可构建生命周期安全、主题兼容、可定制的加载提示。其核心原理在于解耦UI渲染与业务逻辑,通过ViewModel或弱引用管理状态,规避Activity重建导致的BadTokenException。技术价值体现在稳定性提升、内存泄漏防控及Material Design/You主题无缝适配。典型应用场景包括网络请求加载、文件上传进度、后台任务状态反馈等。本文深入剖析Prog

weixin_30736301的博客 556

Fragment 使用 Dialog 报错Unable to add window -- token null is not for an application

在fragment里面获取上下文 习惯了用getActivity().getApplicationContext()错误代码:private void showChoiceUpdata(){ new AlertDialog.Builder(getActivity().getApplicationContext()) .setTitle("检测有新版本") ...

shsh_0415的博客 879

Android原生动画工程化实践:XML与Property Animation深度优化

Android动画是UI响应性与用户体验的核心技术,其本质涉及View绘制机制、属性变更原理及系统渲染管线协同。View Animation通过修改绘制参数实现轻量级动效,适合装饰性场景;Property Animation则直接操作对象属性,保障交互一致性,是用户可操作组件的首选方案。二者在内存占用、兼容性与性能上存在显著差异,需结合设备能力(如低端机降级策略)、系统版本(Android 5.0+硬件加速行为变化)和生命周期管理(防泄漏、防ANR)进行工程化选型。XML动画作为可版本化、可复用的资源资产,

weixin_34405557的博客 382

android 常驻通知,android实现常驻通知栏遇到的问题及解决办法

实现常驻通知栏时遇到的问题:无论如何就是不显示通知,查看日志发现貌似报错了:2020-06-28 14:11:34.923 6387-6387/xxx E/CrashReport: android.app.RemoteServiceException: Bad notification posted from package xxx: Couldn't inflate contentViewsan...

weixin_39926588的博客 760

Android AlertDialog 深度解析:Context、主题、协程与无障碍实战指南

AlertDialog 表面是轻量级弹窗组件,实则是 Android UI 生命周期管理的关键枢纽。其核心依赖 Context 绑定机制,决定 Dialog 是否随 Activity 销毁而自动释放;主题继承链控制 Material Design 2/3 下的深色适配、圆角与按钮样式;Kotlin 协程需绑定 lifecycleScope 避免 onDestroy 后 NPE;Accessibility 支持则关乎 TalkBack 焦点顺序与 contentDescription 合规性。这些底层原理共同

weixin_34015336的博客 460

嘉立创封装图下载后必做的3步优化(附批量删除机械层技巧)

本文针对从嘉立创下载的封装图,系统讲解了三步核心优化流程,以解决其直接使用时的常见问题。重点介绍了如何高效批量删除冗余的机械层,避免制造错误;并详细说明了规范丝印层间距、统一焊盘命名等关键步骤,帮助工程师将第三方封装转化为可靠、合规的设计资源,从而提升PCB设计效率与文件质量。

weixin_29227585的博客 431

Dialog and WindowManager$BadTokenException

在Android的开发中,Dialog的使用已经非常的频繁,在使用过程中,我们需要留意一些细节,不然就会导致诸如下面的错误发生。 那今天我们就来分析一下,在开发中,导致这种错误的常见的操作。Dialog的创建需要一个上下文Context,内部需要根据这个Context创建一个PhoneWindow。 当我们在一个Activity中使用Dialog时,Context通常就是所属的这个Activity对象。如果报错,也就是这个Activity上下文出现了问题。你要保证Activity是正常活动状态才行。

bdmh的专栏 999

AVEVA PDMS 二次开发之PML实战:从宏到自定义窗体的效率提升

本文详细介绍了AVEVA PDMS二次开发中PML语言的应用,从基础宏编写到高级窗体开发,全面提升工程设计效率。通过实战案例展示如何利用PML实现批量操作、流程自动化和交互优化,帮助工程师快速掌握这一强大工具。

weixin_42549451的博客 338

Android 后台线程弹对话框导致程序崩溃(is not valid; is your activity running)

异常:android.view.WindowManager$BadTokenException: Unable to add window — token android.os.BinderProxy@438e7108 is not valid; is your activity running?     因为使用了AsyncTask 异步线程在线程完成以后的onPostExecute方法里

lr4321的专栏 2563

企业微信获取code,URL详解

“https://open.weixin.qq.com/connect/oauth2/authorize?”+ “appid=”企业ID “&redirect_uri=”重定向路径+ “&agentid=”小程序AgentId+ “&response_type=code&scope=snsapi_userinfo&state=123&conn...

weixin_44804985的博客 8732

保姆级教程:在RK3588开发板上配置USB-C PD充电(基于HUSB311芯片与DTS详解)

本文详细介绍了在RK3588开发板上配置USB-C PD充电的完整流程,重点解析了HUSB311芯片的硬件原理与DTS安全配置。通过实战案例和调试技巧,帮助开发者避免常见错误,实现稳定可靠的Type-C PD快充功能,适用于从基础开发板到工业设备的多场景需求。

weixin_42552315的博客 520

Android中showDialog()报错is your activity running?

判断一下Activity是否在finishing就好了,否则万一Activity销毁了,这个Dialog没有所依附的对象,就会有下面的异常抛出 android.view.WindowManager$BadTokenException: Unable to add window — token android.os.BinderProxy@447a6748 is not valid; is you...

Easyhood的博客 2615

添加odbc数据源时的一些问题和解决办法

pl/sql

Mr_Syh的博客 9641

android.view.WindowManager$BadTokenException & Android – Displaying Dialogs From Background Threads

android.view.WindowManager$BadTokenException & Android – Displaying Dialogs From Background Threads     使用线程子在后台处理一些繁重的和耗时的操作是非常标准的。后台线程结束后通常你可能会使用对话框提示或通知用户。     对话框是在主线程中产生的,因此你可以在子线程对应的Handle

coder0408的专栏 514

【用ArcGIS制作一张好看的中国月度气温图

要最后选中那个事先调整好的那个数据框,这样其他两个数据框才能和其大小一致。

J_Giser的博客 1017

SOME/IP协议详解「4.1·经典AutoSAR下的SOME/IP架构」

SOME/IP协议详解「4.1·经典AutoSAR下的SOME/IP架构」 点击返回雪云飞星的SOME/IP协议详解「总目录」 SOME/IP协议详解「4.1·经典AutoSAR下的SOME/IP架构」1 CP的SOME/IP架构概览2 业务报文通信流3 服务发现通信和控制流 1 CP的SOME/IP架构概览 2 业务报文通信流 3 服务发现通信和控制流 点击返回雪云飞星的SOME/IP协议详解「总目录」 ...

雪云飞星的博客 6065

android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProx...

今天遇到了这个问题,小纠结了一下,发现是由于在alertDialog.show()时出的问题,原因在于当前Activity是否存在,如果当前Activity不存在,就会报出异常。有两种解决方法:1是在alertDialog.show()时tye{...}catch{...}。2是:做个判断,判断activity是否存在:if(activity.this.isFinishing())。 try {

wokuaidaojia的专栏 1480

【SigmaStudio】自定义算法组件之XML编写规范(一)

SigmaStudio生成自定义算法组件时,需要XML和DLB文件,本文主要记录XML文件的编码规范

liang_song的博客 1139

关于可能会触发android.view.WindowManager$BadTokenException异常的情况

在Android应用开发过程中,通常会使用对话框Dialog作为消息提示,这时候最常报的异常就是BadTokenException异常了,下面总结一下这种异常发生的原因。 1、Context不对,当使用Application.getContext()或者getApplicationContext()或者getBaseContext()就会报此错误 2一个Activity发生窗体泄漏了,也就是我

zzy19920816的专栏 489

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Top 5 Crashes on Android App

1. java.lang.NullPointerException 预防办法,只能开发小心,必须使用android lint等静态工具查验,onResume出现的最多,因为应用放到后台后,丢失一些内存,一些引用等很正常,解决办法是在onPause中添加像一个本地的cache或数据库,再用onResume就可以了。 一些由于寻找其他数据,比如activity,sensor data,ca

7huaping的专栏 318

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android DialogFragment 全解析:生命周期、状态管理与工程实践

DialogFragment 是 Android 官方提供的模态对话框解决方案,本质是将 Dialog 的 UI 行为封装在 Fragment 生命周期容器中。其核心原理在于利用 FragmentManager 统一调度生命周期、保障事务原子性,并天然支持配置变更恢复与导航栈管理。相比 AlertDialog.Builder 等瞬时弹窗方案,DialogFragment 提供 ViewModel 集成、SavedStateHandle 持久化、Navigation Component 原生兼容等技术价值,显

weixin_33842304的博客 383

DialogFragment本质:Android界面生命周期的守门人

DialogFragment不是简单的弹窗组件,而是Android Fragment架构中实现界面状态可靠管理的核心机制。它通过深度绑定Activity/Fragment生命周期,解决AlertDialog游离于FragmentManager之外导致的配置变更崩溃、内存泄漏和返回键处理异常等典型问题。其技术价值在于提供事务安全的UI展示契约、支持Navigation Component路由化复用,并天然兼容ViewModel、ViewBinding等现代架构组件。典型应用场景包括登录框、风险提示、表单确认等

weixin_33834137的博客 414

Android AlertDialog深度实践:从基础使用到高级封装与性能优化

在Android应用开发中,对话框是用户交互的核心组件之一,用于信息提示、确认操作和选项选择。其实现原理基于Builder设计模式,通过链式调用配置标题、内容和按钮等元素,实现构建与表示的分离。这一机制的技术价值在于提供了灵活、可组合的API,同时确保了代码的清晰度。在实际工程实践中,AlertDialog广泛应用于权限请求、操作确认、列表选择等场景。然而,要使其从“能弹出来”变为“弹得专业、弹得稳定”,开发者必须深入理解其生命周期管理、内存泄漏防范以及样式定制等高级主题。本文聚焦于AlertDialog的

cqwmy840702的博客 447

Fragment中获取Activity的Context

Fragment中获取Activity的Context时只需要this.getActivity()即可. 而不是许多人说的this.getActivity().getApplicationContext(),如果用后者传入AlterDialog肯定会报错(android.view.WindowManager$BadTokenException:Unabletoaddwindow--...

weixin_30426957的博客 203

Unable to add window崩溃分析

显示Dialog时,我们通常会将Activity实例传给Dialog,然后调用Dialog的show方法显示。但在一些情况下,比如说先通过异步网络请求请求数据,等拿到数据后再调用Dialog的show方法显示Dialog来告诉用户已经拿到数据了,但是,我们偶尔会发现发生这样的程序崩溃: android.view.WindowManager$BadTokenException: Unable to

商明超的专栏 2万+

BadTokenException: is your activity running?

android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy is not valid; is your activity running? 静态的Activity类型的Context作为参数传入Dialog,APP退出,Dialog调用dismiss()后,Context没有置null。再次进入APP,Dialog的参数Context,还是APP退出前的Activi..

lyl0530的博客 528
上一篇: 自定义 View 实现扫描效果
下一篇: About “Zero Copy“
OneDeveloper
博客等级 码龄9年 61粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值