废话不多说,先上效果图:
有网络连接状态
无网络连接状态
相信这二种情况,在很多应用中都有体现!直接上代码,注释很详细
第一步:主体界面,开启服务类
public class MainActivity extends AppCompatActivity {
//需要显示的状态
private RelativeLayout mNetWorkView;
private NetworkBroadcastReceiveHelp mNetworkBroadcastReceiveHelp;
/*第一步*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNetWorkView = (RelativeLayout) findViewById(R.id.view_no_network);
//开启网络状态服务
Intent intent = new Intent(this,NetWorkStateService.class);
startService(intent);
registerBroadcast();
}
/*第四步*/
private void registerBroadcast() {
//接收来自本地广播接收类的的广播
mNetworkBroadcastReceiveHelp = new NetworkBroadcastReceiveHelp(this, new NetworkBroadcastReceiveHelp.OnNetworkStateChangedListener() {
@Override
public void onConnected() {
//控制文本的显示和隐藏
mNetWorkView.setVisibility(View.GONE);
}
@Override
public void onDisConnected() {
mNetWorkView.setVisibility(View.VISIBLE);
//具体的进一步操作--引导用户去连接网络
}
});
mNetworkBroadcastReceiveHelp.register();
}
//销毁网络状态服务及广播
@Override
protected void onDestroy() {
super.onDestroy();
Intent intent = new Intent(this,NetWorkStateService.class);
stopService(intent);
mNetworkBroadcastReceiveHelp.unRegister();
}
}
第二步:具体的服务类操作
/**
* Created by pxw on 2017/6/5.
* 网络服务类,第二步
*/
public class NetWorkStateService extends Service {
private SharedPreferences shared;
private SharedPreferences.Editor editor;
//接收来自系统的网络连接广播
private BroadcastReceiver mReceiver;
{
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//判断广播发送行动
if (TextUtils.equals(ConnectivityManager.CONNECTIVITY_ACTION, action)) {
//获取连接网络管理器
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
//获取器网络连接的对象
NetworkInfo info = connectivityManager.getActiveNetworkInfo();
//判断是存在且不为空
if (info != null && info.isAvailable()) {
//获取连接类型
String typeName = info.getTypeName();
/*if(TextUtils.equals("WIFI", name)) {
editor.putString("netType", "wifi");
editor.commit();
} else {
editor.putString("netType", "3g");
editor.commit();
}*/
//发送连接状态广播--ReceiverConst.ACTION_CONNECTIONED状态标识
sendNetworkStateBroadCast(ReceiverConst.ACTION_CONNECTIONED);
} else {
//发送非连接状态广播
sendNetworkStateBroadCast(ReceiverConst.ACTION_NO_CONNECTION);
}
}
}
};
}
//发送本地广播通知网络状态
private void sendNetworkStateBroadCast(String actionConnectioned) {
if(TextUtils.equals(ReceiverConst.ACTION_CONNECTIONED,actionConnectioned) ||
TextUtils.equals(ReceiverConst.ACTION_NO_CONNECTION,actionConnectioned)) {
Intent intent = new Intent(actionConnectioned);
//本地广播管理器
LocalBroadcastUtils.send(getApplicationContext(),intent);
}
}
//绑定需要操作的数据,默认情况下可以返回为空
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
//注册系统默认广播
@Override
public void onCreate() {
super.onCreate();
//此时可以做些当前用户的保存操作
shared = getSharedPreferences("userInfo", 0);
editor = shared.edit();
//开启服务的时候,开启系统广播 ConnectiviyManager网络连接管理类
IntentFilter mFilter = new IntentFilter();
mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mReceiver, mFilter);
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
}
//onStartCommand会告诉系统如何重启服务,如判断是否异常终止后重新启动
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
}
第三步:网络状态服务帮助类
/**
* Created by pxw on 2017/6/5.
* 网络状态广播接收者帮助类
* 统一管理,供多次调用使用,第三步
*/
public class NetworkBroadcastReceiveHelp {
private Context mContext;
private OnNetworkStateChangedListener mOnNetworkStateChangedListener;
private BroadcastReceiver mReceiver;
public NetworkBroadcastReceiveHelp(Context context,OnNetworkStateChangedListener MonNetworkStateChangedListener) {
this.mContext = context;
this.mOnNetworkStateChangedListener = MonNetworkStateChangedListener;
}
//接收来自NetworkStateService服务开启的广播::行动ACTION_CONNECTIONED || ACTION_NO_CONNECTION
public void register(){
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(TextUtils.equals(ReceiverConst.ACTION_CONNECTIONED,intent.getAction())) {
if(mOnNetworkStateChangedListener != null) {
mOnNetworkStateChangedListener.onConnected();
}
}else if(TextUtils.equals(ReceiverConst.ACTION_NO_CONNECTION,intent.getAction())) {
if(mOnNetworkStateChangedListener != null) {
mOnNetworkStateChangedListener.onDisConnected();
}
}
}
};
IntentFilter filter = new IntentFilter();
filter.addAction(ReceiverConst.ACTION_CONNECTIONED);
filter.addAction(ReceiverConst.ACTION_NO_CONNECTION);
LocalBroadcastUtils.register(mContext,mReceiver,filter);
}
public void setOnNetworkStateChangedListener(OnNetworkStateChangedListener onNetworkStateChangedListener) {
this.mOnNetworkStateChangedListener = onNetworkStateChangedListener;
}
public OnNetworkStateChangedListener getOnNetworkStateChangedListener() {
return this.mOnNetworkStateChangedListener;
}
public void unRegister(){
LocalBroadcastUtils.unregister(mContext,mReceiver);
}
//定义接口供外界调用
public interface OnNetworkStateChangedListener{
void onConnected();
void onDisConnected();
}
}
第四步:回到第一步操作中的第四步
帮助类及广播状态标识类如下
/**
* 利用LocalBroadcastManager管理广播
*/
public class LocalBroadcastUtils {
/**
* 注册广播
* @param context
* @param broadcastReceiver
* @param intentFilter
*/
public static void register(Context context, BroadcastReceiver broadcastReceiver, IntentFilter intentFilter) {
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
localBroadcastManager.registerReceiver(broadcastReceiver, intentFilter);
}
/**
* 注销广播
* @param context
* @param broadcastReceiver
*/
public static void unregister(Context context, BroadcastReceiver broadcastReceiver) {
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
localBroadcastManager.unregisterReceiver(broadcastReceiver);
}
/**
* 发送广播
* @param context
* @param intent
*/
public static void send(Context context, Intent intent) {
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
localBroadcastManager.sendBroadcast(intent);
}
}
/**
* Created by pxw on 2017/6/5.
* 广播状态标识
*/
public class ReceiverConst {
//连接状态
public final static String ACTION_CONNECTIONED = "ACTION_CONNECTIONED";
//非连接状态
public final static String ACTION_NO_CONNECTION = "ACTION_NO_CONNECTION";
}
最后:别忘了添加权限和注册服务
<!--配置权限-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<!--注册服务-->
<service android:name=".NetWorkStateService"/>
以上:就ok