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

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

在此之前,总是免不了小小的抱怨,因为找了一天的可行性代码,要么篇幅太长,要么解决不了问题,还好最后算是勉强解决了需求,目前此篇只用于判断当前是否有网络连接( 有网的概念即是有Wifi或移动网络,反之如果都没有,那么就没有网络~ ),下面这篇文章 送给如我一般的菜鸟

注:2020回头一看,发现当时确实挺菜的…只知其一,不知其二 ~ 故在此之际补充了一篇实时监听网络状态的Blog,实现了网络的连接判断、类型判断,解决了同时间内收到重复广播的问题,当然还有等等内容,尽情查收 ~

实现效果 - - !!!
在这里插入图片描述

需求定位

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

  • 如果您的需求只是说在某个单一场景下需要获取当前的网络状态,那么直接采用下方工具类即可~
  • 反之如果您全局都需动态监听当前网络状态的话,那么请采用动态监听的处理方式 ~

如在此需求上去实时判断网络连接与网络类型(4G 还是 Wifi),可直接前往Here ~

具体实现

AndroidManifest 清单文件 - 添加权限

    <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"/>

判断网络是否连接的工具类 - 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;
        }
    }
}

动态注册监听

注意

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

示例 Demo

此Demo,实时判断网络网络,进行视图的显示/隐藏与页面跳转

MainAcitivity

这里直接在MainActivity动态注册了监听网络状态的广播,同时内部实现了有网、无网的逻辑操作;实际开发中并不建议这样!而需单独创建广播接收类,方便统一管理且减少内存消耗 ~

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);
        //此Action是过滤网络的连接状态、与连接类型等等
        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

<?xml version="1.0" encoding="utf-8"?>
<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

网络无连接的相关操作,这里是一个无网络连接时用户点击后的一个跳转类,可以在此内部写入跳转系统wifi 或 移动网络

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

<?xml version="1.0" encoding="utf-8"?>
<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>
课外读物 - 网络判断、系统跳转

因为之前我还写过一篇网络状态的文章,但是和此文有部分重复,故此准备整合文章,所以在删除原文的基础上,在此补入了跳转设置网络的代码 ~
在这里插入图片描述

  • 跳转 - 移动网络 - 核心代码
    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();
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远方那座山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值