没有互联网时如何显示警报对话框?

How to show alert dialog when there is no internet?

我的应用程序是基于互联网的。当我的应用程序 运行 没有互联网时,我需要显示一个警告对话框。所以我创建了一个 BroadcastReceiver 并在 MainActivity 中注册了它。我无法在每个 activity 或片段的顶部正确显示带有 toast 的互联网,但警报对话框仅显示在 MainActivity 中。当我在另一个 activity 或片段中并且网络断开连接时,它不会在我当前的 activity 中显示警报对话框,但会在 MainActivity 中显示警报对话框,看起来它正在获取的上下文是MainActivity 的上下文。我的代码在这里 NetworkUtil.java 作为实用程序 class.

//NetworkUtil.java
public class NetworkUtil {
    public static final int TYPE_WIFI = 1;
    public static final int TYPE_MOBILE = 2;
    public static final int TYPE_NOT_CONNECTED = 0;
    public static final int NETWORK_STATUS_NOT_CONNECTED = 0;
    public static final int NETWORK_STATUS_WIFI = 1;
    public static final int NETWORK_STATUS_MOBILE = 2;

    public static int getConnectivityStatus(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        if (null != activeNetwork) {
            if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
                return TYPE_WIFI;

            if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
                return TYPE_MOBILE;
        }
        return TYPE_NOT_CONNECTED;
    }

    public static int getConnectivityStatusString(Context context) {
        int conn = NetworkUtil.getConnectivityStatus(context);
        int status = 0;
        if (conn == NetworkUtil.TYPE_WIFI) {
            status = NETWORK_STATUS_WIFI;
        } else if (conn == NetworkUtil.TYPE_MOBILE) {
            status = NETWORK_STATUS_MOBILE;
        } else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) {
            status = NETWORK_STATUS_NOT_CONNECTED;
        }
        return status;
    }
}

我的 BroadcastReceiver CheckConnectivity

public class CheckConnectivity extends BroadcastReceiver{
@Override
    public void onReceive(final Context context, final Intent intent) {

        int status = NetworkUtil.getConnectivityStatusString(context);
        if ("android.net.conn.CONNECTIVITY_CHANGE".equals(intent.getAction())) {
            if (status == NetworkUtil.NETWORK_STATUS_NOT_CONNECTED) {
                new SweetAlertDialog(context, SweetAlertDialog.ERROR_TYPE)
                        .setTitleText("Oops...")
                        .setContentText("No internet! Check your network connection")
                        .show();
            Toast.makeText(context, "Internet Connection Lost", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(context, "Internet Connected", Toast.LENGTH_LONG).show();
            }
        }
    }
}

MainActivity BroadcastReceiver 注册的地方。

public class MainActivity extends AppCompatActivity {

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        BroadcastReceiver networkChangeReceiver=new CheckConnectivity();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(networkChangeReceiver, intentFilter);
   }
}

试试这个代码:

public static boolean isConnectedToInternet(Context context){
    ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivityManager != null){
        NetworkInfo info = connectivityManager.getActiveNetworkInfo();
        if (info != null){
            if (info.getType() == ConnectivityManager.TYPE_WIFI){
                return true;
            }else if (info.getType() == ConnectivityManager.TYPE_MOBILE){
                return true;
            }
        }
    }
    return false;
}

if (isConnectedToInternet() {
        Toast.makeText(context, "Internet Connected", Toast.LENGTH_LONG).show();
    }else {
        new SweetAlertDialog(MainActivity.this, SweetAlertDialog.ERROR_TYPE)
                .setTitleText("Oops...")
                .setContentText("No internet! Check your network connection")
                .show();
        Toast.makeText(context, "Internet Connection Lost", Toast.LENGTH_LONG).show();
    }

在您的每个活动的 onResume 方法中注册 BroadcastReceiver,并在 onPause 中注销。现在你只在MainActivity注册,但是MainActivity在后台不能显示AlertDialog

面向 Android 7.0(API 级别 24)及更高版本的应用如果在其清单中声明广播接收器,则不会接收 CONNECTIVITY_ACTION 广播。如果应用程序使用 Context.registerReceiver() 注册其 BroadcastReceiver 并且该上下文仍然有效,则它们仍会收到 CONNECTIVITY_ACTION 广播。

因此,下面是所有设备的完整解决方案。

创建commonclass检查设备是否联网状态

class ConnectivityHelper() {
    companion object {
        fun isConnectedToNetwork(): Boolean {
            val connectivityManager: ConnectivityManager =
                CenceApplication.cenceAppContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
            val networkInfo = connectivityManager.activeNetworkInfo
            if (networkInfo != null) {
                return networkInfo.isConnected
            }
            return false
        }
    }
}

现在检查低于 Nougat 的设备: 1.您需要在清单中设置广播接收器 2.听变化 3.通知你的基地activity.

注意:Base activity 是 common activity,由应用中的所有其他 Activity 扩展,而 base activity 由 AppCompatActivity()

扩展

清单中:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
 <receiver
                android:name=".Utility.NetworkChangeReceiver"
                android:label="NetworkChangeReceiver">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
        </receiver>

广播接收器class:

class NetworkChangeReceiver : BroadcastReceiver() {

    companion object {
        lateinit var networkChangeListener: NetworkChangeListener
    }

    override fun onReceive(context: Context?, intent: Intent?) {
        networkChangeListener.networkStateChanged(ConnectivityHelper.isConnectedToNetwork())
    }
}

创建一个接口以在基础activity中通知:

interface NetworkChangeListener {
    fun networkStateChanged(boolean: Boolean)
}

在应用程序中初始化接口

class YourApplication:Application() {

    companion object {
        lateinit var appContext: Context
    }

    override fun onCreate() {
        super.onCreate()
        appContext = this
    }


    fun initializeNetworkListener(listener:NetworkChangeListener){
        NetworkChangeReceiver.networkChangeListener = listener
    }
}

BasActivity,它实现接口并在 MutableLivedata 的帮助下通知任何 activity/fragment 如果网络中断 :

class BaseActivity : AppCompatActivity(), NetworkChangeListener {


    private var networkLiveData: MutableLiveData<Boolean> = MutableLiveData()
    private lateinit var snackbar: Snackbar

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setupNetworkState()
    }

    private fun setupNetworkState() {
        networkLiveData.postValue(checkNetworkState())

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

            val connectivityManager: ConnectivityManager =
                this.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

            connectivityManager.registerDefaultNetworkCallback(object : ConnectivityManager.NetworkCallback() {
                override fun onAvailable(network: Network?) {
                    super.onAvailable(network)
                    networkLiveData.postValue(checkNetworkState())
                }

                override fun onLost(network: Network?) {
                    super.onLost(network)
                    networkLiveData.postValue(checkNetworkState())
                }
            })


        } else {
            (application as YourApplication).initializeNetworkListener(this@BaseActivity)
        }
    }

    override fun networkStateChanged(boolean: Boolean) {
        networkLiveData.postValue(boolean)
    }


    fun getNetworkStateUpdate(): MutableLiveData<Boolean> {
        return networkLiveData
    }

    fun checkNetworkState(): Boolean {
        return ConnectivityHelper.isConnectedToNetwork()
    }

现在**您的任何 activity/fragment**** 的最后一步: 在 **onCreate() 方法中,

getNetworkStateUpdate().observe(this, object : Observer<Boolean> {
            val snackbar = Snackbar
                .make(
                    mIndMainParentLayout, "You're Offline",
                    Snackbar.LENGTH_INDEFINITE
                )

            override fun onChanged(t: Boolean?) {
                if (!t!!) {
                    snackbar.show()
                } else {
                    snackbar.dismiss()
                }
            }

        })