您的位置:首页 > 理论基础 > 计算机网络

[Android] 实时动态监测网络变化

2016-09-12 22:40 399 查看

【需求分析】

  当前的App一般都需要与网络进行通信,而这其中一个重要的方面就是能够及时监测处网络状态的变化,因此也就也有本次的需求:动态监测当前手机网络状态的变化,包括以下几个方面:1. 手机无网络到有网络 2. 手机有网络到无网络 3. 手机网络Wifi-> 手机移动网络(2/3/4 G)4.手机移动网络(2/3/4 G)-> 手机网络Wifi

【动画效果】

通过Toast展示各种状态的变化




【实现方案】

  核心方案:1. 动态注册广播监听网络状态的变化 2. 根据系统API得到当前的网络类型

  注意:由于需要判断网络类型,需要在Manifest.xml中添加网络访问权限

【代码展示】

package com.test.networkchangetest;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

private NetworkChangeBroadcast networkChangeBroadcast = null;

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

networkChangeBroadcast = new NetworkChangeBroadcast();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(networkChangeBroadcast, intentFilter);
}

@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeBroadcast);
}
}


package com.test.networkchangetest;

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 android.widget.Toast;

public class NetworkChangeBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("NetworkChangeBroadcast", "network changed!");

boolean isNetworkAvailable = false, isWifiAvailable = false, isMobileAvailable = false;
ConnectivityManager connectivityManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null) {
isNetworkAvailable = networkInfo.isAvailable();
isWifiAvailable = networkInfo.isAvailable() && (networkInfo.getType() == ConnectivityManager.TYPE_WIFI);
isMobileAvailable = networkInfo.isAvailable() && (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE);
}

if (isNetworkAvailable) {
if (isWifiAvailable) {
Toast.makeText(context, "当前网络状态:Wifi 可用", Toast.LENGTH_SHORT).show();
} else if (isMobileAvailable) {
Toast.makeText(context, "当前网络状态:移动网络可用", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(context, "当前网络状态:网络不可用", Toast.LENGTH_SHORT).show();
}
}
}


<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


【个人总结】

动态注册广播监听网络的变化,在onCreate中注册,onDestroy中反注册

判断当前网络状态,通过getSystemService得到ConnectivityManager来得到NetworkInfo,从而拿到当前的网络链接状态

访问网络状态需要在Manifest中添加网络访问权限android.permission.ACCESS_NETWORK_STATE
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息