十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
在项目的开发过程中 , 我们的应用程序都是在有网络的情况下进行处理的 , 但我们也要考虑到在没有网络的情况下,应用会出现什么样的情况 , 所以我们需要获取到当前的网络信息.
在神池等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都做网站、成都网站设计 网站设计制作定制开发,公司网站建设,企业网站建设,品牌网站设计,营销型网站,外贸网站建设,神池网站建设费用合理。
获取网络信息需要在AndroidManifest.xml文件中加入相应的权限。
1)判断是否有网络连接
2)判断WIFI网络是否可用
3)判断MOBILE网络是否可用
4)获取当前网络连接的类型信息
在开发android应用时,涉及到要进行网络访问,时常需要进行网络状态的检查,以提供给用户必要的提醒。一般可以通过ConnectivityManager来完成该工作。
当我们要在程序中监听网络状态时,只要一下几个步骤即可:
1、定义一个Receiver重载其中的onReceive函数,在其中完成所需要的功能,如根据WIFI和GPRS是否断开来改变空间的外观
2、在适当的地方注册Receiver,可以在程序中注册,在onCreate中调用如下函数即可:
3、在适当时取消注册Receiver,可以在程序中取消,在onDestroye中调用如下函数即可:
很多朋友在android开发中,都会遇到手机网络类型判断,因为就目前的android平台手机来说:可能会存在4种状态:
这四种状态,如果没有网络,肯定是无法请求Internet了,如果是wap就需要为手机添加中国移动代理.
下面是网络判断的方法:
因为获取的是服务对象,所以这个网络状态都是时时刷新的,所以我们只需要得到网络状态就可以了!
最后总结:
工具类:
BaseActivity:
MainActivity
Log日志
获取android系统的连接服务可判断网络连接状态,代码如下
public class NetUtils{
public static boolean isNetworkConnected(Context context){
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] infos = cm.getAllNetworkInfo();
for(NetworkInfo info:infos){
if(info.isAvailable()info.isConnected()){
return true;
}
}
return false;
}
}
NetworkInfo的isAvailable()和isConnected()有以下5种状态:
在WLAN设置界面
1,显示连接已保存,但标题栏没有,即没有实质连接上:isConnected()==false,isAvailable()=true
2,显示连接已保存,标题栏也有已连接上的图标:isConnected()==true,isAvailable()=true
3,选择不保存后:isConnected()==false,isAvailable()=true
4,选择连接,在正在获取IP地址时:isConnected()==false,isAvailable()=false
5,连接上后:isConnected()==true,isAvailable()=true
1、首先先用usb线连接android手机,然后输入指令:adbtcpip,端口号默认为5555。
2、设置端口号后,然后查看设置中手机的ip地址。
3、通过adb连接ip地址adbconnectip地址。
4、打开androidstudio,可以看到手机已经连接上了。
我们做项目的时候,不可避免的要做网络状态的监听,一般我们都是抽取出一个工具类来实现,比如:
细致的你当然还会再写一个判断网络类型的方法,反手再来一个例:
然后就可以在相应的操作前进行判断网络的判断:
但是这样做也有些问题:
接下来就是本文的重点,如何通过 NetStatusBus 这个库来解决以上问题,让你的网络状态监听变得前所未有的简单粗暴。
到这里就已经结束了,你的所有网络操作已经都可以清晰优雅的在订阅方法中进行处理了,当然你也可以继续往下看。
订阅方法必须填写一个NetType参数,可以通过NetType的值来判断当前网络类型。
@NetSubscribe中 netType为可选值,可以设置订阅的类型,可选值类型如下:
NetType.AUTO
这是默认值,任何网络状态发生变化,该类型订阅者都会被回调。同时会传入NetType参数告知你当前的网络类型,示例如下:
只要当前是由 WIFI 改变引发的网络状态变化,该类型订阅者都会被回调。同时会传入NetType参数告知你当前的网络类型,示例如下:
只要当前是由移动网络改变引发的网络状态变化,该类型订阅者都会被回调。同时会传入NetType参数告知你当前的网络类型,示例如下:
NetType.NONE
只有当网络丢失时,该类型订阅者才会被回调。
有人会觉得,我用个库爽就行了管它的原理干什么?
你放心,我只是小小的描述一下实现方式。
原理简单来说,就是在全局初始化的时候就绑定对网络的变化监听。然后将进行注册的父类所有的订阅方法保存至集合中,这里涉及到一些方法的校验,最后在网络状态发生改变时利用 Java 反射机制遍历执行所有订阅方法。熟悉 EventBus 的小伙伴已经看出来了这里借鉴了一小部分 EventBus 的思想。
回到第一步,那么具体是如何绑定对网络状态变化的监听呢?
以前我们是通过注册广播来实现绑定网络变更的监听,在Android 7.0 以后,Google 基于性能和安全原因对广播进行了很多限制,比如监听网络变更的广播 android.net.conn.CONNECTIVITY_CHANGE 使用静态注册的方式则无法生效,而动态注册的方式虽然可以生效但毕竟不是最优解。
同样出于性能和安全,以及拥抱变化的角度,最终我们还是使用官方推荐的方式,利用 ConnectivityManager.NetworkCallback 来进行网络变化的监听,这是在Android 5.0即android api 21推出的API,目前Android 5.0以上的市场占有率在 85%以上,随着国内各大厂商正在积极的推进适配普及Android Q,这个比例还会进一步增大,所以个人人认为无需过于担心低版本适配。
使用的时候出现这个问题是由于少添加了权限。
Caused by: java.lang.SecurityException: ConnectivityService: Neither user 10513 nor current process has android.permission.ACCESS_NETWORK_STATE.
java.lang.RuntimeException: Unable to create application com.jiyun.wanandroid.WanApplication: java.lang.SecurityException: ConnectivityService: Neither user 10513 nor current process has android.permission.ACCESS_NETWORK_STATE.
加上这几个权限就好了:
附上原文地址: