問題

私のアプリケーションでは、デバイスがネットワーク接続を失ったかどうか、ネットワークに再び接続されているかどうかを通知したいと思います。

だから私はこのようなBroadcastreceiverを書いた:

 class NetworkReceiver() : BroadcastReceiver() {

override fun onReceive(context: Context?, intent: Intent?) {

    if (isNetworkConnected(context)) {
        //do some stuff
    } else {
        //do smoke stuff
    }
}

private fun isNetworkConnected(context: Context?): Boolean {
    val connectivityManager: ConnectivityManager? = context?.getSystemService(Context.CONNECTIVITY_SERVICE)
            as ConnectivityManager?
    if (connectivityManager != null) {
        if (Build.VERSION.SDK_INT < 23) {
            val networkInfo: NetworkInfo? = connectivityManager.activeNetworkInfo
            if (networkInfo != null) {
                return networkInfo.isConnected
                        && networkInfo.type == ConnectivityManager.TYPE_WIFI
                        || networkInfo.type == ConnectivityManager.TYPE_MOBILE
            }
        } else {
            val network: Network? = connectivityManager.activeNetwork
            if (network != null) {
                val networkCapabilities = connectivityManager.getNetworkCapabilities(network)
                return (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
                        || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                        || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN))
            }
        }
    }
    return false
}
 

私の質問は、デバイスがネットワークに接続または切断されたときに、このブロードキャストレシーバを自分のアクティビティに登録してNetworkReceiverをトリガーする方法です。どのIntentFilterを使うべきですか?

  ベストアンサー

BroadcastReceiver

 import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;

import static com.keshav.networkchangereceiverexample.MainActivity.dialog;

public class NetworkChangeReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        try
        {
            if (isOnline(context)) {
                dialog(true);
                Log.e("keshav", "Online Connect Intenet ");
            } else {
                dialog(false);
                Log.e("keshav", "Conectivity Failure !!! ");
            }
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    }

    private boolean isOnline(Context context) {
        try {
            ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            //should check null because in airplane mode it will be null
            return (netInfo != null && netInfo.isConnected());
        } catch (NullPointerException e) {
            e.printStackTrace();
            return false;
        }
    }
}
 

マニフェストファイル:

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

  同じタグがついた質問を見る

androidnetworkingandroid-broadcastreceiver