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

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

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

注解: BroadcastReceiverapp

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

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

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

当Intent发送之后,全部已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。因此当咱们定义一个BroadcastReceiver的时候,都须要实现onReceive()方法。code

广播—是一个生命周期很短的过程,在这个过程里面不能有太耗时的操做(固然不能开子线程,有点时候线程尚未结束,广播的生命周期就结束了),那么记录一下本身的demo。xml

广播的注册方式有两种: (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" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
                <action android:name="android.net.wifi.STATE_CHANGE" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

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

package com.zhjy.hxf.hznetworkchangedreceiver;

import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;

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的实现代码以下:

package com.zhjy.hxf.hznetworkchangedreceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import android.os.Parcelable;
import android.util.Log;

/**
 * @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" />
相关文章
相关标签/搜索