广播接收器中的警报对话框无法正常工作 class

alert dialog not working properly in Broadcast Reciever class

首先,我正在创建一个 Android 应用程序,其主要要求是网络 Connection.My 应用程序始终需要网络连接。所以我做了一个 broadcast Receiver class 来检查连接的可用性。 如果连接不可用,那么我会显示一个对话框,强制用户连接到网络,否则退出应用程序并且 dialog 不是 cancelable。 所以问题是,我得到的是,如果我 运行 我的应用程序(已连接网络),它会按预期正常工作,如果断开网络,对话框就会出现,如果我再次连接网络,对话框就会消失,但是当我启动我的应用程序(未连接网络)然后该对话框出现并且永远不会消失,即使我连接 network.Below 是我的 ConnectionStatusReceiver class Also请告诉我这是正确的方法吗?以及如何更改整个内容视图,例如亚马逊应用程序在连接不可用时显示狗的图像?? 基本上我希望我的应用程序限制用户在工作不可用时做任何事情。

    import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.os.Build;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Toast;

public class ConnectionStatusReceiver extends BroadcastReceiver {

    private AlertDialog.Builder alertadd;
    private AlertDialog dialog;
    private boolean isDialogOpen = false;
    private SharedPreferences sp;
    private SharedPreferences.Editor editor;

    ConnectionStatusReceiver(){
    }


    public boolean isOnline(Context context) {

        final ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

        if (cm != null) {
            if (Build.VERSION.SDK_INT < 23) {
                final NetworkInfo ni = cm.getActiveNetworkInfo();

                if (ni != null) {
                    return (ni.isConnected() && (ni.getType() == ConnectivityManager.TYPE_WIFI || ni.getType() == ConnectivityManager.TYPE_MOBILE));
                }
            } else {
                final Network n = cm.getActiveNetwork();

                if (n != null) {
                    final NetworkCapabilities nc = cm.getNetworkCapabilities(n);

                    return (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI));
                }
            }
        }

        return false;
    }

    @Override
    public void onReceive(final Context context, Intent intent) {

            if(isOnline(context)){

                if (isDialogOpen) {
                    dialog.dismiss();
                }
                isDialogOpen = false;
                MyToast.showToast(context, "Connection Available", Toast.LENGTH_LONG);

            }else{

                alertadd = new AlertDialog.Builder(context);
                LayoutInflater factory = LayoutInflater.from(context);
                final View view = factory.inflate(R.layout.no_connection_error_dialog, null);
                alertadd.setView(view);

                alertadd.setNegativeButton("EXIT", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        System.exit(0);
                    }
                });
                alertadd.setCancelable(false);
                dialog = alertadd.create();
                dialog.show();
                isDialogOpen = true;
                MyToast.showToast(context, "Connection Lost!\nPlease connect to a Network", Toast.LENGTH_LONG);
            }

    }
}

您不能在没有 activity 上下文的情况下使用 AlertDialog。但是如果你真的想在没有 activity 上下文的情况下显示对话框,那么使用下面的代码:

public void showDialog(Context context) {
    Dialog dialog = new Dialog(context);
    dialog.setTitle("Title");
    dialog.getWindow().setType(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : WindowManager.LayoutParams.TYPE_PHONE);
    dialog.show();
}

并向 AndroidManifiest.xml

添加以下权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

好的,我自己找到了解决方案 我刚刚更改了这样的 if 条件

if (dialog != null && dialog.isShowing())
                    dialog.dismiss();

if(dialog == null || !dialog.isShowing()) 
                    //showDialog