如何在android中监控网络状态

Amo*_*sai 5 networking android

嘿,我是新的android,请任何人帮助我.我只是想知道能够监控网络连接的库的名称.

Vip*_*hit 22

只要创建一个broadcast receiverCONNECTIVITY_CHANGE动作.broadcast每当网络连接发生变化时,您就会得到一个.

NetworkUtil.java

public class NetworkUtil {

    public static int TYPE_WIFI = 1;
    public static int TYPE_MOBILE = 2;
    public static int TYPE_NOT_CONNECTED = 0;


    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 String getConnectivityStatusString(Context context) {
        int conn = NetworkUtil.getConnectivityStatus(context);
        String status = null;
        if (conn == NetworkUtil.TYPE_WIFI) {
            status = "Wifi enabled";
        } else if (conn == NetworkUtil.TYPE_MOBILE) {
            status = "Mobile data enabled";
        } else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) {
            status = "Not connected to Internet";
        }
        return status;
    }
}
Run Code Online (Sandbox Code Playgroud)

广播接收器处理网络状态的变化

public class NetworkChangeReceiver extends BroadcastReceiver {

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

        String status = NetworkUtil.getConnectivityStatusString(context);

        Toast.makeText(context, status, Toast.LENGTH_LONG).show();
    }
}
Run Code Online (Sandbox Code Playgroud)

AndroidMenifest.xml

<application  ...>
     ...
        <receiver
            android:name="net.viralpatel.network.NetworkChangeReceiver"
            android:label="NetworkChangeReceiver" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            </intent-filter>
        </receiver>
      ...
</application>
Run Code Online (Sandbox Code Playgroud)

UPDATE

访问网络状态所需的权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Run Code Online (Sandbox Code Playgroud)

  • 我认为&lt;intent-filter&gt; &lt;action android:name =“ android.net.conn.CONNECTIVITY_CHANGE” /&gt; &lt;action android:name =“ android.net.wifi.WIFI_STATE_CHANGED” /&gt; &lt;/ intent有问题-过滤器&gt; (2认同)

Laz*_*nja 9

你的问题不明确!
如果您想要检查网络连接,则可以执行以下操作.

// Check network connection
private boolean isNetworkConnected(){
    ConnectivityManager connectivityManager 
            = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();    
}
Run Code Online (Sandbox Code Playgroud)


Zak*_*nov 6

kotlin的一个小类,支持监控sdk 24(Andoird P)版本前后上网状态。只需创建/注入这个类并添加一个观察者。在没有 LiveData 的评论版本中。

class ConnectivityListener(private val context: Context) {

    val isConnected = MutableLiveData<Boolean>()

    //region used on api < 24
    private val intentFilter by lazy {
        IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
    }

    private val networkBroadcastReceiver by lazy {
        object : BroadcastReceiver() {
            override fun onReceive(context: Context?, intent: Intent?) {
                val isConn = isConnected()
                isConnected.postValue(isConn)
            }
        }
    }
    //endregion

    private val networkCallback by lazy {
        object : ConnectivityManager.NetworkCallback() {
            override fun onAvailable(network: Network) {
                isConnected.postValue(true)
            }

            override fun onLost(network: Network) {
                isConnected.postValue(false)
            }
        }
    }

    init {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            getConnectivityManager()?.registerDefaultNetworkCallback(networkCallback)
        } else {
            context.registerReceiver(networkBroadcastReceiver, intentFilter)
        }
    }

    fun isConnected(): Boolean {
        val activeNetwork = getConnectivityManager()?.activeNetworkInfo
        val isConnected = activeNetwork?.isConnectedOrConnecting == true
        return isConnected
    }

    fun getConnectivityManager() = getSystemService(context, ConnectivityManager::class.java)
}
Run Code Online (Sandbox Code Playgroud)


And*_*tor 5

ConnectivityManager.CONNECTION_ACTION在 Android P 上已弃用,因此您必须根据 API 级别使用解决方案组合。

首先在你的AndroidManifest.xml中声明以下权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Run Code Online (Sandbox Code Playgroud)
enum class InternetConnectionStatus {
  CONNECTED,
  DISCONNECTED
}
Run Code Online (Sandbox Code Playgroud)

我将以下代码放入我的 Application 类中以避免受到配置更改的影响。

private var connectionStatusSubject: BehaviorSubject<InternetConnectionStatus> =
    BehaviorSubject.create()


fun observeNetworkChanges() {
    // getSystemService() is the core-ktx version
    val connectivityManager: ConnectivityManager? = getSystemService()
    if (
        BUILD.VERSION.SDK_INT >= BUILD.VERSION_CODES.P &&
        connectivityManager != null
    ) {
      val callback = NetworkChangeCallback(connectionStatusSubject, connectivityManager)
      connectivityManager.registerDefaultNetworkCallback(callback)
    } else {
      val networkChangeBroadcastReceiver =
        NetworkChangeBroadcastReceiver(connectionStatusSubject)
      val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
      registerReceiver(networkChangeBroadcastReceiver, filter)
    }
  }
Run Code Online (Sandbox Code Playgroud)
// API P+
class NetworkChangeCallback(
  private val subject: BehaviorSubject<InternetConnectionStatus>,
  connectivityManager: ConnectivityManager
) : NetworkCallback() {

  init {
    val network: Network? = connectivityManager.activeNetwork
    if (network == null) {
      subject.onNext(DISCONNECTED)
    } else {
      val capabilities: NetworkCapabilities? = connectivityManager.getNetworkCapabilities(network)
      if (capabilities?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) == true) {
        subject.onNext(CONNECTED)
      } else {
        subject.onNext(DISCONNECTED)
      }
    }
  }

  override fun onAvailable(network: Network) {
    subject.onNext(CONNECTED)
  }

  override fun onLost(network: Network) {
    subject.onNext(DISCONNECTED)
  }
}
Run Code Online (Sandbox Code Playgroud)
// Below API P
class NetworkChangeBroadcastReceiver(
  private val subject: BehaviorSubject<InternetConnectionStatus>
) : BroadcastReceiver() {
  override fun onReceive(
    context: Context,
    intent: Intent
  ) {
    val noConnectivity: Boolean = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)
    if (noConnectivity) {
      subject.onNext(DISCONNECTED)
    } else {
      subject.onNext(CONNECTED)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 RxJava 和 aBehaviorSubject将网络状态转换为 an Observable,但是您可以轻松地将其替换为回调,例如

interface NetworkChangedListener {
  fun onConnected()
  fun onDisconnected()
}
Run Code Online (Sandbox Code Playgroud)