Android中如何判断当前Activity是否在界面上显示(使用广播在当前显示界面弹窗)

本文介绍了在Android项目中遇到的一个需求:当服务器发送请求时弹出对话框。作者首先尝试在BaseActivity中注册广播接收器,但遇到了重复弹窗的问题。之后改为使用静态注册广播,却发现导致系统崩溃。最后,通过在每个需要弹窗的Activity中单独注册广播,并在内部广播接收器中判断当前Activity是否在前台,成功解决了问题。提供了具体的代码实现来展示解决方案。

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

1.背景

在项目中遇到一个这样的需求:当服务器发来请求弹窗信号后,要在当前界面弹出一个对话框。

2.遇到的问题

1)重复弹窗

做法:

​ 定义1个BaseActivity,然后所有的Activity都继承于BaseActivity,当收到服务器请求弹窗信号后,发送请求弹出对话框的广播;然后在BaseActivity中注册该条广播,并在广播接收器的onReceive()方法中去弹出对话框

问题现象:重复弹窗

​ 当由AActivity跳转到BActivity后,此时发出请求弹出广播,这时BActivity会弹出对话框,返回到AActivity后,会再次弹窗。

2)无法弹出,系统奔溃

做法:

​ 由于BaseActivity的做法会导致重复弹窗,分析到是由于广播接收器重复注册导致的,因此想采用广播静态注册的方式,结果在创建的广播类中,无法弹窗,系统奔溃

3.需求最终解决方案

​ 在每一个需要弹窗的Activity中去注册该条广播,然后Activity的内部类广播接收器中去处理:1)判断当前Activity是否在界面显示,2)如果在界面显示,则弹窗

具体代码

  • 1.MyApplication中发送广播
//发送广播
Intent intent = new Intent();
intent.setAction("com.craneapp.testRequest");
sendBroadcast(intent);
  • 2.Activity的onCreate()中注册广播
//注册广播
TestRequestReceiver requestReceiver = new TestRequestReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.craneapp.testRequest");
registerReceiver(requestReceiver,intentFilter);
  • 3.Activity中的内部广播
//Activity中的内部广播
class TestRequestReceiver extends BroadcastReceiver
    {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction() == "com.craneapp.testRequest")
            {
                //当前Activity是否正在显示
                boolean isTopActivity = CommonUtil.isForeground(application,MainActivity.class.getName());
                if (isTopActivity)
                {
                    //弹出对话框
                    CommonUtil.showTestDialog(application,MainActivity.this);
                }
            }
        }
    }
  • 工具类中判断当前Activity是否在界面上显示
	/**
     * 判断某个界面是否在前台
     *
     * @param context Activity的getAppliction()获取
     * @param className Activity名称 由类名.class.getName()获取
     *
     */
	public static boolean isForeground(Context context, String className) {
        if (context == null || TextUtils.isEmpty(className)) {
            return false;
        }
 		ActivityManager am =(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> list = am.getRunningTasks(1);
        if (list != null && list.size() > 0) {
            ComponentName cpn = list.get(0).topActivity;
            if (className.equals(cpn.getClassName())) {
                return true;
            }
        }
        return false;
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值