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

Android Toast偶现应用终止后仍显示问题,求可行规避方案

Workarounds for Android's Random Stuck Toast Issue

Yep, this is a super annoying Android system quirk that’s been around for ages—you’re not alone in dealing with this random stuck Toast problem. I’ve run into it across multiple devices and apps too, so here are some practical fixes to mitigate it:

1. Reuse and Cancel Toast Instances

Instead of creating a new Toast every time, keep a single global instance and cancel it before showing a new one. This prevents the system’s Toast queue from getting backed up or holding stale references that could trigger the stuck state.

private Toast mAppToast;

public void showAppToast(int stringResId) {
    if (this.isFinishing() || this.isDestroyed()) {
        return;
    }
    
    // Cancel existing Toast if it's still showing
    if (mAppToast != null) {
        mAppToast.cancel();
    }
    
    mAppToast = Toast.makeText(this, stringResId, Toast.LENGTH_LONG);
    mAppToast.show();
}

Call this method whenever you need to show your Toast instead of creating a new Toast.makeText() directly.

2. Replace Toast with SnackBar (If Possible)

SnackBars are part of your app’s window hierarchy, not managed by the system’s global Toast queue. This means they can’t get stuck in the same way system Toasts do. They also offer better interactivity (like action buttons) and automatically dismiss when the user interacts with the screen.

Just make sure your layout has a CoordinatorLayout for optimal behavior, but you can use it with any parent view too:

Snackbar.make(findViewById(android.R.id.content), 
              getString(R.string.my_toast_message), 
              Snackbar.LENGTH_LONG)
        .show();

3. Add Foreground Check Before Showing Toast

Sometimes Toasts misbehave when your app is in the background. Adding a check to ensure your app is in the foreground before displaying a Toast can reduce the chance of triggering the system bug:

private boolean isAppInForeground() {
    ActivityManager activityManager = 
        (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningAppProcessInfo> runningProcesses = 
        activityManager.getRunningAppProcesses();
    
    if (runningProcesses == null) return false;
    
    for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
        if (processInfo.processName.equals(getPackageName())) {
            return processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
        }
    }
    return false;
}

// Usage
if (!this.isFinishing() && isAppInForeground()) {
    Toast.makeText(this, R.string.my_toast_message, Toast.LENGTH_LONG).show();
}

For newer Android versions, using LifecycleObserver to track foreground state is a cleaner approach than this process check.

4. Hacky Emergency Reset

If you want a quick fix to unstick a Toast when your app resumes, you can trigger a tiny, immediately canceled Toast. This seems to kick the system’s Toast manager out of its stuck state:

@Override
protected void onResume() {
    super.onResume();
    // Reset stuck Toast if it exists
    Toast resetToast = Toast.makeText(this, "", Toast.LENGTH_SHORT);
    resetToast.show();
    resetToast.cancel();
}

None of these methods can 100% eliminate the system-level bug, but they’ll drastically reduce how often you run into this frustrating issue. The SnackBar replacement is the most reliable long-term solution if your UI allows it.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:53:51