编写不易,如有转载,请声明出处:http://blog.csdn.net/zxc514257857/article/details/68066192
方式一: 可以适用于各种android设备 包括数据网,有线网,和无线网
- 思路:
通过Ping 百度来判断网络是否连通.** - Demo展示图片:
无网络情况:
- 布局代码如下:
//(layout)activity_main.xml
<RelativeLayout 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"
tools:context="com.test.networkstate.MainActivity">
<ImageView
android:visibility="invisible"
android:src="@mipmap/etnerror"
android:layout_margin="10dp"
android:id="@+id/imageView"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_width="40dp"
android:layout_height="40dp"/>
</RelativeLayout>
- Activity代码如下:
//(activity)MainActivity
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private static final int NETWORKDISCONNECTED = 1;
private static final int NETWORKCONNECTED = 2;
private static final String TAG = "MainActivity";
private ImageView mImageView;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case NETWORKDISCONNECTED:
mImageView.setVisibility(View.VISIBLE);
break;
case NETWORKCONNECTED:
mImageView.setVisibility(View.INVISIBLE);
break;
}
super.handleMessage(msg);
}
};
Runnable runnable = new Runnable() {
@Override
public void run() {
checkNetWork();
//每隔五秒钟检查一下网络
handler.postDelayed(runnable , 5000);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler.post(runnable);
checkNetWork();
initView();
}
private void checkNetWork(){
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("http://www.baidu.com").build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
Log.i(TAG , "网络访问失败!");
handler.sendEmptyMessage(NETWORKDISCONNECTED);
}
@Override
public void onResponse(Response response) throws IOException {
Log.i(TAG , "网络访问成功!");
handler.sendEmptyMessage(NETWORKCONNECTED);
}
});
}
private void initView(){
mImageView = (ImageView) findViewById(R.id.imageView);
}
}
- 注: 需要添加权限:
<uses-permission android:name="android.permission.INTERNET"/>
注:需要导入Okhttp的jar包
Demo下载请移步:http://download.csdn.net/detail/zxc514257857/9797829
**方式二: 不适用于有有线网络接口的android设备,只能判断数据网,有线网 **
-
思路:通过ConnectivityManager进行判断
-
Demo展示图片:
-
布局代码如下:
//(layout)activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.test.activity.MainActivity">
<TextView
android:id="@+id/warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FEC7DE"
android:padding="10dp"
android:textColor="#000"
android:text="网络不给力,请检查网络设置。"
android:visibility="gone"/>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#2000">
</View>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="65dp">
<ImageView
android:src="@mipmap/circle"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:layout_marginLeft="10dp"/>
<RelativeLayout
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<RelativeLayout
android:id="@+id/firstLine"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:text="测试帐号"
android:textSize="16sp"
android:textColor="#000"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/title"
android:layout_marginLeft="13dp"/>
<TextView
android:textSize="14sp"
android:text="18:00"
android:textColor="#999"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView"
android:layout_marginRight="13dp"
android:layout_marginEnd="13dp"
android:layout_alignBaseline="@+id/title"
android:layout_alignBottom="@+id/title"
android:layout_alignParentRight="true"/>
</RelativeLayout>
<TextView
android:id="@+id/content"
android:text="王健林:先定一个小目标,比如挣它一个亿"
android:textSize="14sp"
android:textColor="#999"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/firstLine"
android:layout_marginLeft="13dp"
android:layout_marginTop="8dp"/>
</RelativeLayout>
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#2000">
</View>
</LinearLayout>
- Receiver代码如下:
//(receiver)NetBroadcastReceiver
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import com.test.utils.NetUtils;
import com.test.activity.BaseActivity;
public class NetBroadcastReceiver extends BroadcastReceiver {
public NetEvevt evevt = BaseActivity.evevt;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
int netWorkState = NetUtils.getNetWorkState(context);
// 接口回调传过去状态的类型
evevt.onNetChange(netWorkState);
}
}
// 自定义接口
public interface NetEvevt {
void onNetChange(int netMobile);
}
}
- Utils代码如下:
//(utils)NetUtils
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
public class NetUtils {
//没有连接网络
public static final int NETWORK_NONE = -1;
//移动网络
public static final int NETWORK_MOBILE = 0;
//无线网络
public static final int NETWORK_WIFI = 1;
public static int getNetWorkState(Context context) {
// 得到连接管理器对象
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager
.getActiveNetworkInfo();
if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_WIFI)) {
return NETWORK_WIFI;
} else if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_MOBILE)) {
return NETWORK_MOBILE;
}
} else {
return NETWORK_NONE;
}
return NETWORK_NONE;
}
}
Activity代码如下:
//(activity)BaseActivity
import android.app.Activity;
import android.os.Bundle;
import com.test.receiver.NetBroadcastReceiver;
import com.test.utils.NetUtils;
public class BaseActivity extends Activity implements NetBroadcastReceiver.NetEvevt {
public static NetBroadcastReceiver.NetEvevt evevt;
//网络类型
private int netMobile;
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
evevt = this;
inspectNet();
}
//初始化时判断有没有网络
public boolean inspectNet() {
this.netMobile = NetUtils.getNetWorkState(BaseActivity.this);
return isNetConnect();
}
//网络变化之后的类型
@Override
public void onNetChange(int netMobile) {
this.netMobile = netMobile;
isNetConnect();
}
//判断有无网络
//true 有网, false 没有网络.
public boolean isNetConnect() {
if (netMobile == NetUtils.NETWORK_WIFI) {
return true;
} else if (netMobile == NetUtils.NETWORK_MOBILE) {
return true;
} else if (netMobile == NetUtils.NETWORK_NONE) {
return false;
}
return false;
}
}
----------------------------------------------------------------------------------------
//(activity)MainActivity
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.demonet.R;
import com.test.utils.NetUtils;
public class MainActivity extends com.test.activity.BaseActivity {
private TextView mTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTv= (TextView) findViewById(R.id.warning);
//启动时判断网络状态
boolean netConnect = this.isNetConnect();
if (netConnect){
mTv.setVisibility(View.GONE);
}else {
mTv.setVisibility(View.VISIBLE);
}
}
@Override
public void onNetChange(int netMobile) {
super.onNetChange(netMobile);
//网络状态变化时的操作
if (netMobile== NetUtils.NETWORK_NONE){
mTv.setVisibility(View.VISIBLE);
}else {
mTv.setVisibility(View.GONE);
}
}
}
注:需要添加权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
注:需要在AndroidManifest文件中静态注册广播接收者
<receiver android:name="com.test.receiver.NetBroadcastReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
Demo下载请移步:http://download.csdn.net/detail/zxc514257857/9830686
----------因本人才疏学浅,如博客或Demo中有错误的地方请大家随意指出,与大家一起讨论,共同进步,谢谢!----