Android 注册广播,实时监听网络连接与断开状态变化

来源:互联网 发布:百灵鸟播音软件下载 编辑:程序博客网 时间:2024/05/29 15:46

有的时候我们在写项目的时候,需要监听网络的变化,来做一些事情,需要处理一些业务逻辑等事情。

今天查看了一些帖子资料,写一个demo来记录一下自己的笔记,以便自己在以后使用的时候,能更快的熟悉。

注解:
BroadcastReceiver

在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。

下面将详细的阐述如何发送Broadcast和使用BroadcastReceiver过滤接收的过程:

首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。

当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法。

广播—是一个生命周期很短的过程,在这个过程里面不能有太耗时的操作(当然不能开子线程,有点时候线程还没有结束,广播的生命周期就结束了),那么记录一下自己的demo。

广播的注册方式有两种:
(1)可以在配置文件Manifest.xml中注册

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.zhjy.hxf.hznetworkchangedreceiver">    <uses-permission android:name="android.permission.access_wifi_state" />    <uses-permission android:name="android.permission.access_network_state" />    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity            android:name=".MainActivity"            android:label="@string/app_name"            android:theme="@style/AppTheme.NoActionBar">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <!--在AndroidManifest.xml中用标签生命注册,并在标签内用标签设置过滤器-->        <receiver android:name=".NetworkReceiver" >//继承BroadcastReceiver,重写onReceiver方法            <intent-filter>                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />//使用过滤器,接收指定action广播                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />                <action android:name="android.net.wifi.STATE_CHANGE" />            </intent-filter>        </receiver>    </application></manifest>

(2)当然还有一种就是在代码中实现动态注册

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);        setSupportActionBar(toolbar);        init();    }    private void init() {        //在代码中实现动态注册的方式        IntentFilter filter = new IntentFilter();        filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);        filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);        registerReceiver(new NetworkReceiver(), filter);    }}

那么接下来我们就该创建对网络断开和连接实时监听NetworkReceiver继承自BroadcastReceiver,并且要实现其中的一个方法, public void onReceive(Context context, Intent intent)方法。

NetworkReceiver的实现代码如下:

/** * @author :huangxianfeng on 2016/12/6. * 监听网络的变化 */public class NetworkReceiver extends BroadcastReceiver {    private final static String TAG = NetworkReceiver.class.getName();    private String getConnectionType(int type) {        String connType = "";        if (type == ConnectivityManager.TYPE_MOBILE) {            connType = "3G网络数据";        } else if (type == ConnectivityManager.TYPE_WIFI) {            connType = "WIFI网络";        }        return connType;    }    @Override    public void onReceive(Context context, Intent intent) {        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())){            //拿到wifi的状态值            int wifiState = intent.getIntExtra(WifiManager.EXTRA_NEW_STATE,0);            Log.i(TAG,"wifiState = "+ wifiState);            switch (wifiState){                case WifiManager.WIFI_STATE_DISABLED:                    break;                case WifiManager.WIFI_STATE_DISABLING:                    break;            }        }        //监听wifi的连接状态即是否连接的一个有效的无线路由        if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())){            Parcelable parcelableExtra = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);            if (parcelableExtra != null){                // 获取联网状态的NetWorkInfo对象                NetworkInfo networkInfo = (NetworkInfo) parcelableExtra;                //获取的State对象则代表着连接成功与否等状态                NetworkInfo.State state = networkInfo.getState();                //判断网络是否已经连接                boolean isConnected = state == NetworkInfo.State.CONNECTED;                Log.i(TAG, "isConnected:" + isConnected);                if (isConnected) {                } else {                }            }        }        // 监听网络连接,包括wifi和移动数据的打开和关闭,以及连接上可用的连接都会接到监听        if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {            //获取联网状态的NetworkInfo对象            NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);            if (info != null) {                //如果当前的网络连接成功并且网络连接可用                if (NetworkInfo.State.CONNECTED == info.getState() && info.isAvailable()) {                    if (info.getType() == ConnectivityManager.TYPE_WIFI                            || info.getType() == ConnectivityManager.TYPE_MOBILE) {                        Log.i(TAG, getConnectionType(info.getType()) + "连上");                    }                } else {                    Log.i(TAG, getConnectionType(info.getType()) + "断开");                }            }        }    }}

在onReceive方法里面,我们可以获取从广播而来的Intent中的数据,

这包含很多有用的信息,其中

ConnectivityManager : 主要管理和网络连接相关的操作

WifiManager: 管理和wifi相关的信息

TelephonyManager: 管理和手机、运营商等的相关信息

NetworkInfo类包含了对wifi和mobile两种网络模式连接的详细描述,

通过getState()方法获取的State对象,代表着连接成功与否的状态。

最后记得添加权限:

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

demo运行效果图如下:
Wifi已连接的状态

wifi已断开的状态:
这里写图片描述

本文参考:http://blog.csdn.net/qq_20785431/article/details/51520459

0 0
原创粉丝点击