今天具体说下Android检测网络状态的广播,我们在做一些手机应用的时候如果网络发生改变可能会给用户造成一些损失,在中国2G,3G网络都没有普及的情况下,基本都是包流量的,所以在做一些视频应用软件的时候,如果用户在使用WIFI的时候如果无线网络中断,手机网络会自动换手机网络,从而给用户造成不必要的损失。
Android手机在对于一些系统广播,如短信的接收,电话的接收,电池电量过低,网络状态改变都会发一个广播,既然系统会发送一条广播,那么就需要一个接收器来处理这个广播。首先定义一个类继承NetworkChangeReceiver,重写onReceive()就行了。然后在OnReceive()这个方法进行相应广播的处理。
网络状态切换的广播类:
**[java]** [view plain](http://blog.csdn.net/lonely_fireworks/article/details/7373166#)[copy](http://blog.csdn.net/lonely_fireworks/article/details/7373166#)
<div>
</div>
</div>
- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">package</span> com.test; </span>
- <span style="color: black;"> </span>
- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.content.BroadcastReceiver; </span>
- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.content.Context; </span>
- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.content.Intent; </span>
- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.net.ConnectivityManager; </span>
- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.net.NetworkInfo.State; </span>
- <span style="color: black;"> </span>
- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">class</span> <span class="keyword" style="font-weight: bold; color: #006699;">extends</span> BroadcastReceiver { </span>
- <span style="color: black;"> </span>
- <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span>
- <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onReceive(Context context, Intent intent) { </span>
- <span style="color: black;"> State wifiState = <span class="keyword" style="font-weight: bold; color: #006699;">null</span>; </span>
- <span style="color: black;"> State mobileState = <span class="keyword" style="font-weight: bold; color: #006699;">null</span>; </span>
- <span style="color: black;"> ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); </span>
- <span style="color: black;"> wifiState = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState(); </span>
- <span style="color: black;"> mobileState = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState(); </span>
- <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (wifiState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> && mobileState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> </span>
- <span style="color: black;"> && State.CONNECTED != wifiState </span>
- <span style="color: black;"> && State.CONNECTED == mobileState) { </span>
- <span style="color: black;"> <span class="comment" style="color: #008200;">// 手机网络连接成功</span> </span>
- <span style="color: black;"> } <span class="keyword" style="font-weight: bold; color: #006699;">else</span> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (wifiState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> && mobileState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> </span>
- <span style="color: black;"> && State.CONNECTED != wifiState </span>
- <span style="color: black;"> && State.CONNECTED != mobileState) { </span>
- <span style="color: black;"> <span class="comment" style="color: #008200;">// 手机没有任何的网络</span> </span>
- <span style="color: black;"> } <span class="keyword" style="font-weight: bold; color: #006699;">else</span> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (wifiState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> && State.CONNECTED == wifiState) { </span>
- <span style="color: black;"> <span class="comment" style="color: #008200;">// 无线网络连接成功</span> </span>
- <span style="color: black;"> } </span>
- <span style="color: black;"> </span>
- <span style="color: black;"> } </span>
- <span style="color: black;"> </span>
- <span style="color: black;">} </span>
在上面这个接收类中OnReceive()方法,你可以在上面三个网络状态(只有手机网络,只有无线网络,没有任何网络)中进行相应的处理,然后在应用中注册广播,注册广播有2种方式,一种在androidmanifest.xml中注册,一种在java代码中注册。
第一种:
**[html]** [view plain](http://blog.csdn.net/lonely_fireworks/article/details/7373166#)[copy](http://blog.csdn.net/lonely_fireworks/article/details/7373166#)
<div>
</div>
</div>
- <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">receiver</span> </span>
- <span style="color: black;"> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">“com.test.NetworkBroadcast”</span> </span>
- <span style="color: black;"> <span class="attribute" style="color: red;">android:label</span>=<span class="attribute-value" style="color: blue;">“NetworkConnection”</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span>
- <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">intent-filter</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span>
- <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">action</span> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">“android.net.conn.CONNECTIVITY_CHANGE”</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span>
- <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">intent-filter</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span>
- <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">receiver</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span>
第二种:
可以在Activity的onCreate()方法中注册广播,在Activity的onDestory()方法中卸载广播。
**[java]** [view plain](http://blog.csdn.net/lonely_fireworks/article/details/7373166#)[copy](http://blog.csdn.net/lonely_fireworks/article/details/7373166#)
<div>
</div>
</div>
- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">private</span> BroadcastReceiver networkBroadcast=<span class="keyword" style="font-weight: bold; color: #006699;">new</span> BroadcastReceiver(); </span>
**[java]** [view plain](http://blog.csdn.net/lonely_fireworks/article/details/7373166#)[copy](http://blog.csdn.net/lonely_fireworks/article/details/7373166#)
<div>
</div>
</div>
- <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">private</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> registerNetworkReceiver() { </span>
- <span style="color: black;"> IntentFilter filter = <span class="keyword" style="font-weight: bold; color: #006699;">new</span> IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); </span>
- <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">this</span>.registerReceiver(networkBroadcast, filter); </span>
- <span style="color: black;">} </span>
- <span style="color: black;"> </span>
- <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">private</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> unRegisterNetworkReceiver() { </span>
- <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">this</span>.unregisterReceiver(networkBroadcast); </span>
- <span style="color: black;">} </span>
注意:在接收类中的onReceive()方法中不要处理太多复杂逻辑问题,尤其耗时的操作。
💬 评论