如果当我的应用程序活动不在前台时,我发出了一个toast,那么这个toast仍然会显示在屏幕上。如何防止我的toast在我的应用程序在后台运行时显示出来呢?即没有任何活动正在显示。
我想我必须以某种方式检测我的活动是否是当前正在显示的活动,当为true时不发出任何toast;但是我如何检测这种情况呢?
谢谢
当您的应用程序在后台(即在onPause
中)时设置标志,并且如果设置了标志,则不要发送toast。
如果您有大量活动,可以定义自己的Activity
基类来包装此功能。
onPause()
方法被调用时为该活动设置变量或指示器,以表示它已被放入后台,并在onResume()
被调用时关闭该指示器?如果该指示器关闭,则允许弹出Toast提示。请保留HTML标签。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();
方法以隐藏当前和所有待处理的提示。编程很有趣。享受吧!