美文网首页
在广播接收器中调起Dialog

在广播接收器中调起Dialog

作者: 飞行的魔术师 | 来源:发表于2017-03-15 21:37 被阅读125次

最近有一个需求,在后台接收到广播后需要弹出一个Dialog,然后进行设置。但当我使用receiver自带的context创建Dialog时程序却直接崩溃了。报的如下错误:

[20:37:48:712]E/AndroidRuntime( 5073): java.lang.RuntimeException: Unable to start receiver com.konka.kksystemui.funtion.SystemUIReceiver: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
[20:37:48:712]E/AndroidRuntime( 5073):        at android.app.ActivityThread.handleReceiver(ActivityThread.java:2426)
[20:37:48:713]E/AndroidRuntime( 5073):        at android.app.ActivityThread.access$1700(ActivityThread.java:135)
[20:37:48:713]E/AndroidRuntime( 5073):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1272)
[20:37:48:713]E/AndroidRuntime( 5073):        at android.os.Handler.dispatchMessage(Handler.java:102)
[20:37:48:713]E/AndroidRuntime( 5073):        at android.os.Looper.loop(Looper.java:136)
[20:37:48:713]E/AndroidRuntime( 5073):        at android.app.ActivityThread.main(ActivityThread.java:5017)
[20:37:48:713]E/AndroidRuntime( 5073):        at java.lang.reflect.Method.invokeNative(Native Method)
[20:37:48:714]E/AndroidRuntime( 5073):        at java.lang.reflect.Method.invoke(Method.java:515)
[20:37:48:714]E/AndroidRuntime( 5073):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:742)
[20:37:48:714]E/AndroidRuntime( 5073):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
[20:37:48:714]E/AndroidRuntime( 5073):        at dalvik.system.NativeStart.main(Native Method)
[20:37:48:714]E/AndroidRuntime( 5073): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
[20:37:48:715]E/AndroidRuntime( 5073):        at android.view.ViewRootImpl.setView(ViewRootImpl.java:540)
[20:37:48:715]E/AndroidRuntime( 5073):        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:259)
[20:37:48:715]E/AndroidRuntime( 5073):        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
[20:37:48:715]E/AndroidRuntime( 5073):        at android.app.Dialog.show(Dialog.java:286)
[20:37:48:715]E/AndroidRuntime( 5073):        at com.konka.android.kkui.lib.KKDialog$Builder.show(KKDialog.java:435)
[20:37:48:716]E/AndroidRuntime( 5073):        at com.konka.kksystemui.funtion.SystemUIReceiver.onReceive(SystemUIReceiver.java:40)
[20:37:48:716]E/AndroidRuntime( 5073):        at android.app.ActivityThread.handleReceiver(ActivityThread.java:2419)
[20:37:48:720]E/AndroidRuntime( 5073):        ... 10 more

从 log 可以看出,该问题是调起 Dialog 的是一个不正确的 Token ,也不是 Application 对应的 token ,顾名思义,我便使用了 context.getApplicationContext()进行创建,发现仍然报了以上错误。无奈之下,多方查找后发现还需要将该Dialog声明为系统级别,这样弹出的就是一个系统级别的对话框,于是将Type设置为WindowManager.LayoutParams.TYPE_SYSTEM_ALERT便可以正确调起Dialog。

具体方法如下:
mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

相关文章

  • 在广播接收器中调起Dialog

    最近有一个需求,在后台接收到广播后需要弹出一个Dialog,然后进行设置。但当我使用receiver自带的cont...

  • Android 广播

    广播接收器 是Android的四大组件之一,可见广播在Android中的重要性; 1. 什么是广播? 广播(Bro...

  • 关于Broadcast

    前言 广播分类 标准广播:异步收发,所有的广播接收器几乎可以同时收到广播。有序广播:同步收发,当上一个广播接收器处...

  • Android 广播

    【Android 广播】 BroadcastReceiver简介 BroadcastReceiver(广播接收器)...

  • Android Receiver广播特性,Receiver总结

    广播分为两大类 标准广播,所有广播接收器同时收到有序广播,所有广播接收器按顺序收到,可在中途拦截 广播有两种注册方...

  • BroadCastReceiver

    1.广播接收器会自动调用 onReceive 方法2.广播接收器运行在UI线程(主线程) 使用方式 静态注册在我们...

  • Android广播接收器(三)

    本地广播 前面两篇文章Android广播接收器(一)和Android广播接收器(二)讲的都属于全局广播,即发出的广...

  • 在BottomSheetDialogFragment中同时弹出软

    在editText中加入如下代码即可 这样让EditText无法获取软键盘,在弹出的dialog中调起软键盘即可,...

  • 广播及广播接收器

    静态注册广播接收器 动态注册广播接收器 onResume()中注册【注册完成后会首先收到一条广播】 onPause...

  • BroadcastReceiver 总结

    manifest中静态注册广播接收器 动态注册广播 发送广播 Local Broadcast 1第一种方式 1.注...

网友评论

      本文标题:在广播接收器中调起Dialog

      本文链接:https://www.haomeiwen.com/subject/jqprnttx.html