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了。
相关文章推荐
- 【Android常用】Broadcast的onReceive方法中弹出AlertDialog
- BroadcastReceiver广播接收者(四)——本地广播LocalBroadcastManager以及在onReceive()中弹出Dialog
- 关于Android的BroadcastReceiver的onReceive方法中回调结果给Activity的问题
- BroadcastReceiver广播接收者(四)——本地广播LocalBroadcastManager以及在onReceive()中弹出Dialog
- 第一次安装Android studio时候弹出unable to access android sdk add-on list解决方法
- Broadcast的onReceive是在UI线程里面调用吗?
- 通过百度地图定位api(4.1以下)获取附近poi,onReceivePoi()方法无响应问题
- AlertDialog在Api<17调用onDismissListener()方法
- android broadcast 的onreceive
- AlertDialog自己定义View的使用方法+怎样改变弹出框的大小
- BroadcastReceiver onReceive()没有被调用
- 安装android studio时候弹出unable to access android sdk add-on list解决方法
- 第一次安装android studio时候弹出unable to access android sdk add-on list解决方法
- 从一个A应用发广播,在另一个应用B的广播接收者的onReceive()方法中接收此广播并启动这个应用里的activity
- 安装android studio时候弹出unable to access android sdk add-on list解决方法
- 第一次安装android studio时候弹出unable to access android sdk add-on list解决方法
- Android AsyncTask 在onPreExecute方法中弹出加载框
- AlertDialog的onCreateDialog与onPrepareDialog使用方法
- 关于AlertDialog里面的EditText无法弹出软键盘的解决方法
- android在Service,BroadCast onReceiver()中弹出Dialog对话框