当App打开的时候,加载页面需要网络,但是网络接入和未接入 需要做分别处理。因为如果网络没有接入的话,我们需要给前端页面一张图片。当网络接入的话,我们就是展示我们要展示的内容。其次当我们网络未接入的时候,做类似阅读App的时候,我们是需要从缓存中去取值的,因为这样的话,不影响我们正常的App的使用。比如:小说 缓存之后页面未接入网络,但是页面却要展示内容。
我们需要从原始的Android底层封装的类或者接口出发去解决。直接上代码:
权限:
广播类:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkInfo;
import android.util.Log;
import android.widget.Toast;
/**
* @function 自定义网络触发接入工具
* @look 当手机网络接入发生改变的时候,进行页面修改或者数据默认值传递
*/
public class NetBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 书写 网络判断 代码
}
}
主类【MainActivity】注册 监听广播事件:
@Override
protected void onResume() {
// 网络监听
if (netBroadcastReceiver == null) {
netBroadcastReceiver = new NetBroadcastReceiver();
}
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver( netBroadcastReceiver , intentFilter );
super.onResume(); // 一定要放在后面
}
@Override
protected void onPause() {
// 网络注销
unregisterReceiver( netBroadcastReceiver );
super.onPause(); // 一定要放在后面
}
注:广播类的注册,注册在那个activity中,那个activity就可以使用广播方法,以及触发广播动作了。
因为不同的手机存在不同的网络判断问题,再次推荐几个:
public class NetBroadcastReceiver extends BroadcastReceiver {
public static boolean Death_Boolean;
@Override
public void onReceive(Context context, Intent intent) {
//Death_Boolean = ping();
final Context context1 = context;
new Thread(
new Runnable() {
@Override
public void run() {
Death_Boolean = ping();
// 如果当前没有网络接入
if( Death_Boolean == false)
Toast.makeText( context1 , "当前无网络接入" , Toast.LENGTH_LONG ).show();
// 相关网络接入之后操作 ...
}
}
).start();
}
public boolean ping() {
try {
String ip = "www.baidu.com";// ping 的地址,可以换成任何一种可靠的外网
Process p = Runtime.getRuntime().exec("ping -c 1 -w 100 " + ip);// ping网址1次
if (p.waitFor() == 0) return true;
}catch (Exception e) {
}
return false;
}
}
注:线程的使用,原因是如果放在主线程里面进行ping的话,会造成页面白屏,启动页面刷新延迟等问题。 因为存在网络连接不好判断的情况:模拟器,局域网等等,所以最笨的办法,先写一遍。
Android 9.0判断当前网络是否连接
/**
* 网络是否已连接
*
* @return true:已连接 false:未连接
*/
@SuppressWarnings("deprecation")
@RequiresPermission(ACCESS_NETWORK_STATE)
public static boolean iConnected(@NonNull Context context) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (manager != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
NetworkCapabilities networkCapabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
if (networkCapabilities != null) {
return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
|| networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
|| networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET);
}
} else {
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected();
}
}
return false;
}
/**
* Wifi是否已连接
*
* @return true:已连接 false:未连接
*/
@SuppressWarnings("deprecation")
public static boolean isWifiConnected(@NonNull Context context) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (manager != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
NetworkCapabilities networkCapabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
if (networkCapabilities != null) {
return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
}
} else {
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected() && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
}
}
return false;
}
/**
* 是否为流量
*/
@SuppressWarnings("deprecation")
public static boolean isMobileData(@NonNull Context context) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (manager != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
NetworkCapabilities networkCapabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
if (networkCapabilities != null) {
return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
}
} else {
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected() && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
}
}
return false;
}
[ API 21以下,6.0-8.0部分手机]
//检测API是不是小于21,因为到了 API21 之后getNetworkInfo(int networkType)方法被弃用
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) {
//获得ConnectivityManager对象
ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//获取ConnectivityManager对象对应的NetworkInfo对象
//获取WIFI连接的信息
NetworkInfo wifiNetworkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
//获取移动数据连接的信息
NetworkInfo dataNetworkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (wifiNetworkInfo.isConnected() && dataNetworkInfo.isConnected()) {
Toast.makeText(context, "WIFI已连接,移动数据已连接", Toast.LENGTH_SHORT).show();
} else if (wifiNetworkInfo.isConnected() && !dataNetworkInfo.isConnected()) {
Toast.makeText(context, "WIFI已连接,移动数据已断开", Toast.LENGTH_SHORT).show();
} else if (!wifiNetworkInfo.isConnected() && dataNetworkInfo.isConnected()) {
Toast.makeText(context, "WIFI已断开,移动数据已连接", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "WIFI已断开,移动数据已断开", Toast.LENGTH_SHORT).show();
}
//API大于23时使用下面的方式进行网络监听
}else {
//获得ConnectivityManager对象
ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//获取所有网络连接的信息
Network[] networks = connMgr.getAllNetworks();
//用于存放网络连接信息
StringBuilder sb = new StringBuilder();
//通过循环将网络信息逐个取出来
for (int i=0; i < networks.length; i++){
//获取ConnectivityManager对象对应的NetworkInfo对象
NetworkInfo networkInfo = connMgr.getNetworkInfo(networks[i]);
sb.append(networkInfo.getTypeName() + " connect is " + networkInfo.isConnected());
}
Toast.makeText(context, sb.toString(),Toast.LENGTH_SHORT).show();
}
因为我是运行过得,运行监测结果:
注:如果没有网络接入:ims(华为)、如果是WIFI:WIFI的名字,其余的移动就是接入的网络比如:cmnet,cmwap
附:Android 10.0 暂时不知道,是否特殊判断!!!
附【代码参考,运行结果分析等参考资料】:
其中一篇博文:https://blog.csdn.net/qq_40543575/article/details/79666315#commentBox
有关于不同Android API 去获取网络信息
其中一篇博文:https://blog.csdn.net/u014048850/article/details/44599191
有关于:NetWorkInfo(判断网络状况的类) 了解一下。
其中一篇博文:https://www.jianshu.com/p/83725a3125f2
有关于:Android 9.0判断当前网络是否连接