当应用在后台时想要隐藏Android的Toast提示信息

7
如果当我的应用程序活动不在前台时,我发出了一个toast,那么这个toast仍然会显示在屏幕上。如何防止我的toast在我的应用程序在后台运行时显示出来呢?即没有任何活动正在显示。

我想我必须以某种方式检测我的活动是否是当前正在显示的活动,当为true时不发出任何toast;但是我如何检测这种情况呢?

谢谢

3个回答

10

当您的应用程序在后台(即在onPause中)时设置标志,并且如果设置了标志,则不要发送toast。

如果您有大量活动,可以定义自己的Activity基类来包装此功能。


2
你是否尝试在onPause()方法被调用时为该活动设置变量或指示器,以表示它已被放入后台,并在onResume()被调用时关闭该指示器?如果该指示器关闭,则允许弹出Toast提示。请保留HTML标签。

0
在我的应用程序中,当应用程序进入后台时,排队的提示消息会一遍又一遍地出现,因此我采取了以下措施来解决这个问题。
添加代码以检测应用程序何时进入后台。注册生命周期处理程序的一种方法。更多详细信息请参见ref
registerActivityLifecycleCallbacks(new MyLifecycleHandler());

App.inBackground = true; 当应用程序进入后台并使用SmartToast类显示toast时

public class SmartToast {

    static ArrayList<WeakReference<Toast>> toasts = new ArrayList<>();
    public static void showToast(@NonNull Context context,@NonNull String message){
        //this will not allowed to show toast when app in background
        if(App.inBackground) return;
        Toast toast = Toast.makeText(context,message,Toast.LENGTH_SHORT);
        toasts.add(new WeakReference<>(toast));
        toast.show();

        //clean up WeakReference objects itself
        ArrayList<WeakReference<Toast>> nullToasts = new ArrayList<>();
        for (WeakReference<Toast> weakToast : toasts) {
            if(weakToast.get() == null) nullToasts.add(weakToast);
        }
        toasts.remove(nullToasts);
    }

    public static void cancelAll(){
        for (WeakReference<Toast> weakToast : toasts) {
            if(weakToast.get() != null) weakToast.get().cancel();
        }
        toasts.clear();
    }

}

当应用程序进入后台时,调用SmartToast.cancelAll();方法以隐藏当前和所有待处理的提示。编程很有趣。享受吧!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接