6

如果我在我的应用程序的活动不在前台时发出祝酒词,那么祝酒词仍会显示在屏幕上。当我的应用程序在后台运行时,如何防止我的 toast 出现。即当前没有任何活动显示活动。

我在想我必须以某种方式检测到我的活动不是当前显示的活动,并且当真实时不发出任何祝酒词;但我将如何检测这种情况?

谢谢

4

3 回答 3

9

当您的应用程序在后台(即 in onPause)时设置一个标志,如果设置了标志,则不要发送敬酒。

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

于 2011-01-20T03:03:02.687 回答
2

您是否尝试在onPause()为该活动调用该方法时设置变量或某些指示器以表示其已被放入后台,然后在调用时关闭该指示器onResume()

如果指示灯熄灭,则让祝酒发生。

于 2011-01-20T03:02:58.260 回答
0

在我的应用程序中,当应用程序进入后台时,排队的祝酒词一次又一次地出现,所以我做了以下操作来解决问题。

添加代码以检测应用何时进入后台。一种注册生命周期处理程序的方法。有关更多详细信息,请参阅

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();当应用程序进入后台以隐藏当前和所有待处理的 toast 时调用方法。代码很有趣。享受!

于 2016-12-14T08:02:43.383 回答