阅读此文,并实现功能,仅需 5-10分~
在此之前,总是免不了小小的抱怨,因为找了一天的可行性代码,要么篇幅太长,要么解决不了问题,还好最后算是勉强解决了需求,目前此篇只用于判断当前是否有网络连接( 有网的概念即是有Wifi或移动网络,反之如果都没有,那么就没有网络~ ),下面这篇文章 送给如我一般的菜鸟
实现效果 - - !!!
需求定位
在正式开始观看代码之前请确定需求 > <
- 如果您的需求只是说在某个单一场景下需要获取当前的网络状态,那么直接采用下方工具类即可~
- 反之如果您全局都需动态监听当前网络状态的话,那么请采用动态监听的处理方式 ~
如在此需求上去实时判断网络连接与网络类型(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();
}