场景:一个Activity请求网络,当出现网络问题请求出错时,会弹出一个Dialog提示。但是,在结果返回之前就跳到了另一个Activity,使得之前那个Activity处于后台,此时如果回到之前的Activity会出现页面变暗,而且任何地方不能点击的现象。这是由于Activity处于后台,弹Dialog遇到问题没有弹出来,但是页面已经变暗了,并抢占了焦点,使得底部的控件看得见但不可点击。给人的感觉就是App死机了,只有点返回键才能激活页面。查了半天,只遇到一个知己遇到和我一样的问题,并提出来了。有人给了一些方案。如下:https://www.iteye.com/problems/77129
我的场景不太一样,Dialog弹出没有那么重要,极端情况下Dialog可以不弹出,只要页面不变暗并且不可点击。所以我的思路是:只要Activity不是可见的,就不在当前Activity上调用弹出Dialog的操作。具体操作如下:
在我的网络请求框架MyGernericCallback上作如下判断:
//只有当Activity处于前台时,才在当前Activity上弹Dialog
if (IsActivityForegroundUtil.isForeground((Activity) mContext)) {
try {
dialog.show();
} catch (Exception e) {
e.printStackTrace();
}
}
IsActvityForegroundUtil.java
import android.app.Activity;
import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Context;
import android.text.TextUtils;
import java.util.List;
public class IsActivityForegroundUtil {
/**
* 判断某个界面是否在前台
*
* @param activity 要判断的Activity
* @return 是否在前台显示
*/
public static boolean isForeground(Activity activity) {
return isForeground(activity, activity.getClass().getName());
}
/**
* 判断某个界面是否在前台
*
* @param context Context
* @param className 界面的类名
* @return 是否在前台显示
*/
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 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;
}
}