错误的窗口令牌,您无法在创建 Activity 之前或在广播接收器中隐藏异常之后显示对话框

Posted

技术标签:

【中文标题】错误的窗口令牌,您无法在创建 Activity 之前或在广播接收器中隐藏异常之后显示对话框【英文标题】:Bad window token, you cannot show a dialog before an Activity is created or after it's hidden exception in broadcastreceiver 【发布时间】:2017-12-22 21:03:13 【问题描述】:

我正在 onReceive 方法中创建材质对话框。

@Override
public void onReceive(Context context, Intent intent)


new MaterialDialog.Builder(context)
                            .title(sender).content(m).positiveText("C").negativeText("Cl").onPositive(new MaterialDialog.SingleButtonCallback() 
                        @Override
                        public void onClick(@NonNull MaterialDialog materialDialog, @NonNull DialogAction dialogAction) 
                            copyToClipboard(m);
                        
                    ).onNegative(new MaterialDialog.SingleButtonCallback() 
                        @Override
                        public void onClick(@NonNull MaterialDialog materialDialog, @NonNull DialogAction dialogAction) 

                        
                    ).show();
 

我得到以下异常

 Caused by: com.afollestad.materialdialogs.MaterialDialog$DialogException: Bad window token, you cannot show a dialog before an Activity is created or after it's hidden.

【问题讨论】:

这里也添加你自己的Receive方法的代码。对话框应始终显示在 UI 线程上。 On Receive 通常在 BG 线程中 这段代码你在哪里写的,我的意思是在活动或片段的哪里? 问题已编辑 【参考方案1】:

您不能直接从广播接收器打开对话框,因为它是一个以 UI 为中心的活动。最好的方法是设计一个具有透明背景的自定义活动,将其注册为广播接收器,然后在那里显示警报对话框。

参考Link

【讨论】:

以上是关于错误的窗口令牌,您无法在创建 Activity 之前或在广播接收器中隐藏异常之后显示对话框的主要内容,如果未能解决你的问题,请参考以下文章

对话框抛出“无法添加窗口 - 令牌 null 不适用于应用程序”,getApplication() 作为上下文

为啥我收到错误“无法生成令牌。使用 Nodemailer 时检查您的身份验证选项?

403 错误 - 模态窗口中的 CSRF 令牌

无法获取设备的推送令牌。检查您的 FCM 配置是不是有效

Git push无法正常运行错误“您必须使用个人访问令牌或SSH密钥”

无法验证提供的 CSRF 令牌,因为找不到您的会话