android 5.0 以上监听网络生成。Android监控wifi连接状态。

前言#

世家吓,大概发生一个大多月份没有创新博客了,我是胡去了也?很醒目,程序员当然要突击……这无异次等以及大家分享一下初路之组成部分体验。

监听网络转移于开中凡是时常采取的,例如我们断网有一对温馨之唤起,或者因不同的网转移一些加载策略,例如wifi看视频,非wifi则会来一个提拔,还有无限个别更恶心之偷摸的以后台受你下各种安装包,是何许人也我就算不一一列举了。

在5.0先,我们还是广播BroadcastReceiver,注册与网络转移有关的播放,然后判断是接二连三要断开,这种做法很有利,但是趁安卓底本子迭代,在权力上更为小心,广播的措施就显得不极端优雅。

打只假设,之前便是将个老喇叭,在马路上各种喊,就好像逛地摊,各种货品的吆喝声混在一齐,需要而自己去分辨哪些是你想如果的音讯,而且又显得甚无安全,万一卖的货色较隐私为,大家都是非常低调的人数。

故而当安卓5.0以上算对网的监听进行了优化,那就算是经Callback回调的办法,这种支付模式是未是不行常用?例如监听下充斥进度,我独自需要三独回调:下载成功,下载失败,下载的快变化,这种回调方式对强,耦合性低,非常好,和播音相比,就接近我们是一个订了服务,需要之东西自动上门,very
good。

废话铺垫了如此多,下面就是是一个实战demo。

在类型被我们常常产生如此的要求,在下载图片或另文件时会见遇上网络不安宁之问题,导致下载失败当,因此,

正文#

public class MainActivity extends AppCompatActivity {

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

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        // 请注意这里会有一个版本适配bug,所以请在这里添加非空判断
        if (connectivityManager != null) {
            connectivityManager.requestNetwork(new NetworkRequest.Builder().build(), new ConnectivityManager.NetworkCallback() {

                /**
                 * 网络可用的回调
                 * */
                @Override
                public void onAvailable(Network network) {
                    super.onAvailable(network);
                    Log.e("lzp", "onAvailable");
                }

                /**
                 * 网络丢失的回调
                 * */
                @Override
                public void onLost(Network network) {
                    super.onLost(network);
                    Log.e("lzp", "onLost");
                }

                /**
                 * 当建立网络连接时,回调连接的属性
                 * */
                @Override
                public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
                    super.onLinkPropertiesChanged(network, linkProperties);
                    Log.e("lzp", "onLinkPropertiesChanged");
                }

                /**
                 *  按照官方的字面意思是,当我们的网络的某个能力发生了变化回调,那么也就是说可能会回调多次
                 *
                 *  之后在仔细的研究
                 * */
                @Override
                public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
                    super.onCapabilitiesChanged(network, networkCapabilities);
                    Log.e("lzp", "onCapabilitiesChanged");
                }

                /**
                 * 在网络失去连接的时候回调,但是如果是一个生硬的断开,他可能不回调
                 * */
                @Override
                public void onLosing(Network network, int maxMsToLive) {
                    super.onLosing(network, maxMsToLive);
                    Log.e("lzp", "onLosing");
                }

                /**
                 * 按照官方注释的解释,是指如果在超时时间内都没有找到可用的网络时进行回调
                 * */
                @Override
                public void onUnavailable() {
                    super.onUnavailable();
                    Log.e("lzp", "onUnavailable");
                }

            });
        }
    }
}

}

随即即是今底一体代码了,上面已发矣响应的注解,但是还是不够好我们理解,接下便仔细的研究一下:

1、首先我们打开app,此时网络是连的状态:

image

无异于打开demo,我们立马就取了onAvailable的回调,意思就是是网络时可用,这等同沾比较广播强多了,因为咱们早已启动还要单独处理同差,而由此回调的计,可以即时获得时底状态。

2、然后我们手动关闭网络:

image

哎呀?没有onLosing的回调,只视了onLost,说明我们手动关闭网络连接是一个死粗鲁的一言一行,就比如官注释上勾画的,如果是一个机械的断开,他也许不回调。

3、最后咱们又连网络:

image

这次的回调就比较多了,首先是onAvailable,显示网络可用,然后是onCapabilitiesChanged,说这网的接连能力来了第一软变,估计是连着管,再然后是onLinkPropertiesChanged,说明连接的性都来了转,此时应该赢得了ip地址等信息,最后还要回调了onCapabilitiesChanged,那么当是网快及可用之状态。

监控网络连接的状态更是重要,最近本身举行的一个类主要靠连续wifi来下载,因此即便整理了有些于是来监督wifi状态的小demo

总结#

自无学出onLosing和onUnavailable的情景,至少证明他们的起的几率现在曾经休愈了,我们曾由此注释简单明了了她们的场面,这里就不开深入钻研了。

经过刚才的实验,我们得出了转定论:

1、要想监听网络的连续和断开,应该当onAvailable和onLost中,他们肯定会变成对出现。

2、其他的几乎独回调使用状况会少一点,并且onCapabilitiesChanged会回调多次,所以下它经常我们而慎重,避免重新的操作,但是好包最后一不成回调,网络的连一定是连连成功的。

OK,从之不大的成形,我们看看了安卓以逐步变得又好,使用起来又简短又优雅,这也加大了一些素质没有之厂商想尽办法后台干点坏事的行。

今天即交此,有啊问题大家一同留言讨论~

 

补充#

1、记得申请权限:
<uses-permission
android:name=”android.permission.CHANGE_NETWORK_STATE” />
<uses-permission android:name=”android.permission.WRITE_SETTINGS”
/>
尤其是WRITE_SETTINGS,这个需要手动申请,千万别忘了。

第一步:首先在Activity中注册一个监控wifi状态的播报

 1 package com.front.wifi_action;
 2 
 3 import android.app.Activity;
 4 import android.content.IntentFilter;
 5 import android.net.wifi.WifiManager;
 6 import android.os.Bundle;
 7 
 8 public class MainActivity extends Activity {
 9 
10     @Override
11     public void onCreate(Bundle savedInstanceState) {
12         super.onCreate(savedInstanceState);
13         setContentView(R.layout.activity_main);
14        
15         WifiBroad wifiReceiver=new WifiBroad();
16         IntentFilter filter=new IntentFilter();
17         filter.addAction(WifiManager.RSSI_CHANGED_ACTION);
18         filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
19         filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
20         this.registerReceiver(wifiReceiver,filter); 
21     }
22 
23 }

第二步:创建该广播,用来监督wifi的状态

 

 1 package com.front.wifi_action;
 2 
 3 import android.content.BroadcastReceiver;
 4 import android.content.Context;
 5 import android.content.Intent;
 6 import android.net.NetworkInfo;
 7 import android.net.wifi.WifiInfo;
 8 import android.net.wifi.WifiManager;
 9 
10 public class WifiBroad extends BroadcastReceiver {
11 
12     @Override
13     public void onReceive(Context context, Intent intent) {
14         if (intent.getAction().equals(WifiManager.RSSI_CHANGED_ACTION)) {
15         } else if (intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
16             System.out.println("网络状态改变");
17             NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
18             if (info.getState().equals(NetworkInfo.State.DISCONNECTED)) {// 如果断开连接
19                 System.out.println("wifi网络连接断开 ");
20             }
21             
22             if(info.getState().equals(NetworkInfo.State.CONNECTING)){
23                 System.out.println("连接到wifi网络");
24             }
25         } else if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
26             // WIFI开关
27             int wifistate = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,WifiManager.WIFI_STATE_DISABLED);
28             if (wifistate == WifiManager.WIFI_STATE_DISABLED) {// 如果关闭
29 
30                 System.out.println("系统关闭wifi");
31             }
32             
33             if(wifistate==WifiManager.WIFI_STATE_ENABLED){
34                 System.out.println("系统开启wifi");
35             }
36         }
37 
38     }

老三步:最后记得加上权限
<uses-permission
android:name=”android.permission.ACCESS_WIFI_STATE” />
<uses-permission
android:name=”android.permission.ACCESS_NETWORK_STATE” />

相关文章

admin

网站地图xml地图