BroadcastReceiver的OnReceive函数中启动对话框

文章详细介绍了在Android应用中,如何在接收广播后启动对话框来提示用户,包括使用Activity、主题设置对话框模式以及借鉴系统提示对话框的实现方法。重点强调了避免在OnReceive中进行长时间操作,推荐使用新线程处理AlertDialog,并讨论了不同方法的优缺点及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

处理怎样在接收广播后启动对话框用来提示用户,开始看到OnReceive存在context,因此new AlertDialog,但是在show时出错,怀疑是OnReceive中不能进行过长时间的操作,因此新开一个Thread去处理AlertDialog,但是还是会抛异常:

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
总结三种方式如下:

1,启动一个Activity,背景设为透明,Activity中启动对话框。
2,将Activity本身通过主题设置样式为对话框的,将Activity显示为对话框模式:

android:theme="@android:style/Theme.Dialog"
这2种方法要维护Activity,结束后finish掉Activity,并在启动Intent时需要加上Intent.FLAG_ACTIVITY_NEW_TASK标志。
3,参照系统关机提示对话框,实现“对话框”,代码如下:

wm = (WindowManager) getApplicationContext().getSystemService("window");
WindowManager.LayoutParams para = new WindowManager.LayoutParams();
para.height = -1;
para.width = -1;
para.format = 1;
/* wmParams.type=LayoutParams.TYPE_PHONE;   //设置window type
wmParams.format=PixelFormat.RGBA_8888;   //设置图片格式,效果为背景透明
wmParams.gravity=Gravity.LEFT|Gravity.TOP;   //调整悬浮窗口至左上角,便于调整坐标*/
para.flags = LayoutParams.FLAG_FULLSCREEN | LayoutParams.FLAG_LAYOUT_IN_SCREEN;
para.type = LayoutParams.TYPE_SYSTEM_ALERT;
mView = LayoutInflater.from(context).inflate(R.layout.layout_dialog, null);
wm.addView(mView, para);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值