You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

显示透明Activity时下层Activity的onResume被触发导致重复API调用问题

问题根因

你遇到的重复API调用问题是透明Activity的系统特性导致的:当Activity-B设置了windowIsTranslucent=true时,系统不会停止下层的Activity-A,Activity-A仅会回调onPause,因此应用从后台切回前台时,两个Activity的onResume会依次触发。

解决方案

方案1:全局状态标记拦截(最易实现,适配性最高)

通过全局标记位控制Activity-A的API调用逻辑:

  • 定义全局可访问的布尔标记,可放在Application类或者自定义单例类中:public static boolean isInterceptPageShowing = false;
  • Activity-A的onResume执行API请求前先判断标记:若标记为true直接跳过请求逻辑,仅标记为false时才执行接口调用
  • 启动Activity-B前将标记设为true;Activity-B校验用户已解封、执行finish()前将标记重置为false即可
  • Activity-B的onResume校验逻辑不受影响,正常调用API校验用户状态即可

方案2:栈顶Activity判断

不想用全局标记的话,可以在Activity-A调用API前判断当前应用栈顶是否是Activity-B,是则跳过请求:

private boolean isInterceptPageOnTop() {
    ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> taskList = am.getRunningTasks(1);
    ComponentName topActivity = taskList.get(0).topActivity;
    return ActivityB.class.getName().equals(topActivity.getClassName());
}

仅需要在AndroidManifest中声明权限<uses-permission android:name="android.permission.GET_TASKS" />,自己应用的任务栈获取不需要动态申请权限。

方案3:调整主题规避特性

如果不需要保留下层Activity-A的可见性,可以修改Activity-B的主题,将android:windowIsTranslucent属性改为false,调整为带半透明遮罩的悬浮主题即可,此时系统会正常回调Activity-A的onStop,切回前台时只会触发Activity-B的onResume,不会触发Activity-A的。

内容的提问来源于stack exchange,提问作者Dawood Ilyas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:15:03