Android进阶之路 - 监听网络状态

阅读此文,并实现功能,仅需“5-10分钟”

开发中我们可能会经常用到网络状态的监听,从多篇文章中单独抽出部分代码,简单集成之后运行在了自己的Demo上

在此之前,总是免不了小小的抱怨,因为找了一天的可行性代码,要么篇幅太长,要么解决不了问题,还好最后算是勉强解决了需求,下面这篇文章 送给如我一般的菜鸟

        • 权限配置
        • 定位需求
        • 静态监听
        • 动态监听
          • 注意
          • Demo
            • 注册监听 - 监听处理
            • 监听处理 - 自定义类
        • 设置网络

实现效果 - - !!!

权限配置

添加权限

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

    <!--允许读取网络状态-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <!--允许读取wifi网络状态-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

定位需求

在正式开始观看代码之前请确定需求 > <

如果您的需求只是说在某个单一场景下需要获取当前的网络状态,那么直接采用静态监听中的工具类即可~

反之如果您全局都需动态监听当前网络状态的话,那么请采用动态监听的处理方式 ~

目前此篇中不论静态监听还是动态监听,只用于判断是否有网, 有网的概念即是有Wifi或移动网络,反之如果都没有,那么就没有网络~

如果在此需求上要判断有网状态是4G 还是 Wifi 的话,可以移步我新写的文章,补齐了此处短板 ~

静态监听

这里指的通过某些事件当时需要获取当前的网络状态,采用一个工具方法判断一下就ok ~

NetUtils:

package com.yl.demo.netstatetolayout;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import android.widget.Toast;

/**
 * We need day day up - -!
 * 判断网络状态工具
 */

public class NetUtils {

    /***
     * 是否有网
     * */
    public static boolean isOpenNet(Context context){
        ConnectivityManager conManager = (ConnectivityManager)context.getSystemService(context.getApplicationContext().CONNECTIVITY_SERVICE);
        NetworkInfo network = conManager.getActiveNetworkInfo();
        if(network!=null){
            Log.e("tag","网络打开了,true");
            Toast.makeText(context,"网络打开了",Toast.LENGTH_SHORT).show();
            return true;
        }else{
            Log.e("tag","网络关闭了,false");
            Toast.makeText(context,"网络关闭了",Toast.LENGTH_SHORT).show();
            return false;
        }
    }
}

动态监听

这里我写了一个Demo,实时判断网络网络,进行页面跳转与视图的显示/隐藏

注意
  • 实时网络监听,不需要我们发送广播,因为系统会自动发出,我们需要做的就是监听此系统广播状态
  • 这里我使用的也是广播机制,与平常使用广播方式不同的便是实时监听,如果只是统一进行广播处理的话,对应Layout的网络提示页面可需性加载有一些问题,不过可以写在Base中(我目前是这样实现的)
Demo

这里直接在MainActivity动态注册了监听网络状态的广播,实际开发中并不建议这样,而需单独创建广播接收类,方便统一管理 ~

注册监听 - 监听处理

MainAcitivity

package com.yl.demo.netstatetolayout;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView netState;

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

        netState = (TextView) findViewById(R.id.tv_net_state);

        IntentFilter localFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
        this.registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if(NetUtils.isOpenNet(context)){
                    netState.setVisibility(View.GONE);
                }else {
                    netState.setVisibility(View.VISIBLE);
                    netState.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            startActivity(new Intent(MainActivity.this,NetStateActivity.class));
                        }
                    });
                }
            }
        },localFilter);
    }
}

activity.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.yl.demo.netstatetolayout.MainActivity">

    <TextView
        android:textColor="#fff"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="Our Days"
        android:background="#1ba9e2"
        android:gravity="center"
        />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="#f00"
        android:textColor="#fff"
        android:id="@+id/tv_net_state"
        android:text="网络状态出错"
        android:gravity="center"
        android:visibility="gone"
    />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="center"
        android:text="If you are happy,you can do everything!" />
LinearLayout>
监听处理 - 自定义类

NetStateActivity

package com.yl.demo.netstatetolayout;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

/**
 * We need day day up - -!
 */

public class NetStateActivity extends AppCompatActivity {

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

        TextView mBack = (TextView) findViewById(R.id.tv_back);

        mBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
}

activity_new_state.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:background="#1ba9e2"
        android:layout_height="wrap_content">
        <TextView
            android:textColor="#fff"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="返回"
            android:id="@+id/tv_back"
            android:layout_marginLeft="8dp"
            android:layout_centerInParent="true"
            />
    <TextView
        android:textColor="#fff"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="网络设置提示"
        android:gravity="center"
        />
    RelativeLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#fff"
        android:orientation="vertical"
        android:padding="5dp"
        android:paddingLeft="10dp">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="5dp"
            android:text="请设置您的网络"
            android:textSize="15sp" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="5dp"
            android:text="1.打开设备的“系统设置”\'>“无线网和网络”\'>“移动网络”。"
            android:textColor="#D8D8D8"
            android:textSize="13sp" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="5dp"
            android:text="2.打开设备的“系统设置”\'>“WLAN”\'>启动“WLAN”后从中选择一个可用的热点连接。"
            android:textColor="#D8D8D8"
            android:textSize="13sp" />
    LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="2dp"
        android:background="#fff"
        android:orientation="vertical"
        android:padding="7dp"
        android:paddingLeft="10dp">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="2dp"
            android:padding="5dp"
            android:text="如果您已经链接WI-FI网络"
            android:textSize="15sp" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="2dp"
            android:background="#fff"
            android:padding="5dp"
            android:text="请确认你所接入的Wi-Fi网路已经连入互联网,或者确认你的设备是否被允许访问热点。"
            android:textColor="#D8D8D8"
            android:textSize="13sp" />
    LinearLayout>

LinearLayout>

设置网络

因为之前我还写过一篇网络状态的文章,但是和此文有部分重复,故此准备整合文章,所以在删除原文的基础上,在此补入了跳转设置网络的代码 ~
Android进阶之路 - 监听网络状态_第1张图片

  • 跳转 - 移动网络 - 核心代码
    Intent intent=null;
    //判断手机系统的版本  即API大于10 就是3.0或以上版本
    if(android.os.Build.VERSION.SDK_INT>10){
        intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS);
    }else{
        intent = new Intent();
        ComponentName component = new ComponentName("com.android.settings","com.android.settings.WirelessSettings");
        intent.setComponent(component);
        intent.setAction("android.intent.action.VIEW");
    }
    context.startActivity(intent);
  • 弹框 - 跳转 - 网络设置
  /*
   * 打开设置网络界面
   * */
    public static void setNetworkMethod(final Context context){
        //提示对话框
        AlertDialog.Builder builder=new AlertDialog.Builder(context);
        builder.setTitle("网络设置提示").setMessage("网络连接不可用,是否进行设置?").setPositiveButton("设置", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                Intent intent=null;
                //判断手机系统的版本  即API大于10 就是3.0或以上版本
                if(android.os.Build.VERSION.SDK_INT>10){
                    intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS);
                }else{
                    intent = new Intent();
                    ComponentName component = new ComponentName("com.android.settings","com.android.settings.WirelessSettings");
                    intent.setComponent(component);
                    intent.setAction("android.intent.action.VIEW");
                }
                context.startActivity(intent);
            }
        }).setNegativeButton("取消", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                dialog.dismiss();
            }
        }).show();
    }

你可能感兴趣的:(Android进阶之路)