NetStateReceiver【监听网路状态变化】

版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

用来监控网络变化时的处理,一般用来toast提示或者扩展为其他作用。

效果图

  

代码分析

NetStateReceiver:网络改变时的广播器

NetUtils:获取网络类型

使用步骤

一、项目组织结构图

注意事项:

1、导入类文件后需要change包名以及重新import R文件路径

2、Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

将netstatus包复制到项目中

在AndroidManifest.xml文件中声明权限以及静态注册NetStateReceiver【注意,路径需要跟实际项目的路径保持一致】

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.why.project.netstatereceiverdemo">

    <!-- ======================NetStateReceiver相关========================== -->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <!-- ===========NetStateReceiver相关=====也可以使用动态注册在MyApplication,不过需要注意注销的触发时机=============== -->
        <receiver android:name=".utils.netstatus.NetStateReceiver">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
                <action android:name="os.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

在BaseActivity.java中添加以下代码

package com.why.project.netstatereceiverdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.why.project.netstatereceiverdemo.utils.ToastUtil;
import com.why.project.netstatereceiverdemo.utils.netstatus.NetChangeObserver;
import com.why.project.netstatereceiverdemo.utils.netstatus.NetStateReceiver;
import com.why.project.netstatereceiverdemo.utils.netstatus.NetUtils;


/**
 * Created by HaiyuKing
 * Used Activity基类
 */

public abstract class BaseActivity extends AppCompatActivity {

    private static final String TAG = "BaseActivity";

    /*=================网络变化的广播器=====================*/
    protected NetChangeObserver mNetChangeObserver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        /*=================网络变化的广播器=====================*/
        registerNetStateChange();//注册网络变化的广播器

        super.onCreate(savedInstanceState);
    }

    protected void onDestroy() {
        super.onDestroy();
        /*=================网络变化的广播器=====================*/
        NetStateReceiver.removeRegisterObserver(this.mNetChangeObserver);
    }

    /*==========网络变化的广播器=============*/
    private void registerNetStateChange() {
        if (this.mNetChangeObserver == null) {
            this.mNetChangeObserver = new NetChangeObserver() {
                public void onNetConnected(NetUtils.NetType netType) {
                    super.onNetConnected(netType);
                    onNetworkConnected(netType);
                    if (NetUtils.isMobileConnected(getApplicationContext())){
                        ToastUtil.showShortToast("您当前正在使用运营商网络");
                    }
                    if(NetUtils.isWifiConnected(getApplicationContext())){
                        ToastUtil.showShortToast("您当前正在使用无线网络");
                    }
                }

                public void onNetDisConnect() {
                    super.onNetDisConnect();
                    onNetworkDisConnected();
                    ToastUtil.showShortToast("网络无法连接,请检查网络设置");
                }
            };
            NetStateReceiver.registerObserver(this.mNetChangeObserver);// 声明mNetChangeObserver注册到网络状态广播接收器中
        }
    }
    protected abstract void onNetworkConnected(NetUtils.NetType netType);
    protected abstract void onNetworkDisConnected();

}

本Demo搭配《ToastUtil【简单的Toast封装类】【未自定义Toast的显示风格】》使用

三、使用方法

package com.why.project.netstatereceiverdemo;

import android.os.Bundle;

import com.why.project.netstatereceiverdemo.utils.netstatus.NetUtils;

public class MainActivity extends BaseActivity {

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

    @Override
    protected void onNetworkConnected(NetUtils.NetType netType) {

    }

    @Override
    protected void onNetworkDisConnected() {

    }
}

混淆配置

参考资料

http://www.cnblogs.com/renzimu/p/4537954.html

http://www.cnblogs.com/renzimu/p/4537936.html

项目demo下载地址

https://github.com/haiyuKing/NetStateReceiverDemo

posted @ 2017-10-07 22:10  HaiyuKing  阅读(3547)  评论(0编辑  收藏  举报