Java 警报对话框在广播接收器类中工作不正常
首先,我正在创建一个Android应用程序,它的主要需求是网络连接。我的应用程序一直都需要网络连接。所以我制作了一个广播接收器类来检查连接的可用性。 如果连接不可用,那么我将显示一个对话框,强制用户连接到网络,否则退出应用程序,该对话框不可取消。 所以问题是,如果我在连接网络的情况下运行我的应用程序,它会像预期的那样正常工作,如果断开网络,对话框就会出现,如果我再次连接网络,对话框就会消失,但是,当我在没有连接网络的情况下启动我的应用程序时,即使我连接了网络,该对话框也不会消失。下面是我的ConnectionStatusReceiver类。请告诉我这是正确的方法吗?当连接不可用时,我如何改变整个内容视图,就像亚马逊应用程序显示狗的图像一样?? 基本上,我希望我的应用程序限制用户在notwork不可用时做任何事情Java 警报对话框在广播接收器类中工作不正常,java,android,android-alertdialog,Java,Android,Android Alertdialog,首先,我正在创建一个Android应用程序,它的主要需求是网络连接。我的应用程序一直都需要网络连接。所以我制作了一个广播接收器类来检查连接的可用性。 如果连接不可用,那么我将显示一个对话框,强制用户连接到网络,否则退出应用程序,该对话框不可取消。 所以问题是,如果我在连接网络的情况下运行我的应用程序,它会像预期的那样正常工作,如果断开网络,对话框就会出现,如果我再次连接网络,对话框就会消失,但是,当我在没有连接网络的情况下启动我的应用程序时,即使我连接了网络,该对话框也不会消失。下面是我的Con
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);
}
}
}
如果没有活动上下文,则无法使用AlertDialog。但是,如果您确实希望显示没有活动上下文的对话框,请使用以下代码:
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
好吧,我自己找到解决办法了 我刚刚改变了这样的if条件
if (dialog != null && dialog.isShowing())
dialog.dismiss();
if(dialog == null || !dialog.isShowing())
//showDialog
我在ReceiveContext、Intent和Intent上已经了解到的活动上下文;和对话框正在显示,但当网络连接时,我无法关闭该对话框。确定,然后将对话框定义为静态,当网络连接时,关闭对话框。请查看上面的代码并更正错误,尝试更改私有AlertDialog对话框;到私有静态警报对话框;不,使它成为静态会使情况变得更糟对话框现在永远不会被关闭
if (dialog != null && dialog.isShowing())
dialog.dismiss();
if(dialog == null || !dialog.isShowing())
//showDialog