Android调用AlertDialog的dismiss方法无响应问题求助
问题根源
你代码的核心问题是变量作用域冲突导致操作的不是同一个ShowAlert实例:
- 你在CallReceiver类顶部已经声明了全局成员变量
ShowAlert alertDisplay = new ShowAlert(); - 但在onReceive方法里又重复声明了同名局部变量
ShowAlert alertDisplay = new ShowAlert();
响铃时调用alertDisplay.display()创建弹窗的是局部实例,后续通话状态变更时调用alertDisplay.dismissAlert()的是全局实例,全局实例的alert属性从未初始化,一直为null,所以dismiss逻辑直接跳过,弹窗不会消失。
修复步骤
- 首先删除onReceive方法里重复的局部变量声明行:
// 删掉这行冗余代码 EDITED, NOW AS A PRIVATE VARIABLE ShowAlert alertDisplay = new ShowAlert();
- 为了避免BroadcastReceiver多次触发导致实例不一致的问题,建议把ShowAlert的实例改为静态全局持有:
public class CallReceiver extends BroadcastReceiver { // 改成静态全局,保证所有广播触发的回调操作的是同一个实例 private static ShowAlert alertDisplay = new ShowAlert(); @Override public void onReceive(final Context context, Intent intent) { // 保留原有逻辑即可,不用再重复声明alertDisplay ... } }
- 补充dismiss时的校验逻辑(部分系统版本下非UI线程操作弹窗不会生效也不会报错,同时避免内存泄漏),修改ShowAlert的dismissAlert方法:
public void dismissAlert(){ if(alert != null && alert.isShowing()){ // 保证在UI线程执行销毁操作 alert.getWindow().getDecorView().post(() -> alert.dismiss()); alert = null; // 手动置空避免内存泄漏 } }
补充优化建议
- Android 6.0及以上版本需要动态申请
SYSTEM_ALERT_WINDOW权限,只在Manifest声明不会生效,需要在MainActivity里引导用户到设置页开启悬浮窗权限 - 每次调用display方法前先调用一次dismissAlert,避免多次触发广播创建多个弹窗
- 建议在display方法里先判断alert是否已存在,避免重复创建实例
内容的提问来源于stack exchange,提问作者TheFede98
相关产品推荐
相关产品推荐

