阅读此文,并实现功能,仅需“5-10分钟”
开发中我们可能会经常用到网络状态的监听,从多篇文章中单独抽出部分代码,简单集成之后运行在了自己的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,实时判断网络网络,进行页面跳转与视图的显示/隐藏
这里直接在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>
因为之前我还写过一篇网络状态的文章,但是和此文有部分重复,故此准备整合文章,所以在删除原文的基础上,在此补入了跳转设置网络的代码 ~
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();
}