Vip*_*hit 22
只要创建一个broadcast receiver与CONNECTIVITY_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)
你的问题不明确!
如果您想要检查网络连接,则可以执行以下操作.
// 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)
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)
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)
| 归档时间: |
|
| 查看次数: |
17014 次 |
| 最近记录: |