您的位置:首页 > 移动开发 > Android开发

Broadcast的onReceive方法中弹出AlertDialog

2016-11-16 20:36 746 查看

问题阐述

根据《第一行代码》中使用广播做一个强制下线的功能。在任何一个界面上点击button,就发送强制下线的广播。同时程序使用静态注册广播接收器,接收器中会弹出一个对话框,让用户无法进行任何其他操作,必须点击对话框中的确定按钮,然后回到登陆界面。根据书中代码编译运行后,在弹出AlterDialog时,程序会崩溃。错误信息如下:



问题分析

最后总结出来的原因是:出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog)。

有人推荐:dialog要依附于一个activity,你可以选择动态的创建广播,然后在构造方法中 传入activity,或者在广播中回调Activity打dialog。

我个人只试过动态创建广播,确实可行。

相关链接:

郭霖对Context的阐述:

http://blog.csdn.net/guolin_blog/article/details/47028975

和这篇介绍Context的blog:

http://www.jianshu.com/p/94e0f9ab3f1d

综合上面的结论,使用静态注册广播,只能弹出System Alert类型的Dialog。但google在 6.0加入了运行时权限的概念,需要在java代码中进行动态申请。为了防止旧的应用程序崩溃,只对targetSDK为23及以上的程序使用新的权限机制。

相应的解决方法有如下几种。

第一种方式是:targetSDK设为23以下就可以规避问题。

第二种方式是:设置里面给了这个调试应用【允许悬浮窗】 但是得手动的打开(我是没有找到这个悬浮窗到底在哪里)。

第三种方式是:使用无需权限显示悬浮窗。参考链接:

Android无需权限显示悬浮窗:

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1017/3589.html

问题解决

这里使用第三种,简单方便。

1 修改广播接收类中的import包



import android.support.v7.app.AlertDialog;


修改为:

import android.app.AlertDialog;


2 修改AlertDialog的弹窗类型为:TYPE_TOAST



alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);


修改为:

alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);


这样编译运行就可以正常弹出AlertDialog了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐