鏈接:(http://www.reibang.com/p/89e3fbd33964)
一、編寫判斷網(wǎng)絡(luò)幫助類 NetUtil
public static int getNetWorkState(Context context) {
//得到連接管理器對象
? ConnectivityManager connectivityManager = (ConnectivityManager) context
? ? ? .getSystemService(Context.CONNECTIVITY_SERVICE);
? NetworkInfo activeNetworkInfo = connectivityManager
? ? ? ? ? ? .getActiveNetworkInfo();
? //如果網(wǎng)絡(luò)連接晌柬,判斷該網(wǎng)絡(luò)類型
? if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
? ? if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_WIFI)) {
? ? ? ? ? ? return NETWORK_WIFI;//wifi
? ? ? } else if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_MOBILE)) {
? ? ? ? ? ? return NETWORK_MOBILE;//mobile
? ? ? }
? } else {
? ? ? ? //網(wǎng)絡(luò)異常
? ? ? ? return NETWORK_NONE;
? }
? ? return NETWORK_NONE;
}
二质欲、編寫檢測網(wǎng)絡(luò)變化廣播類
public class NetBroadcastReceiver extends BroadcastReceiver {
? ? public NetChangeListener listener = BaseActivity.listener;
? ? @Override
? ? public void onReceive(Context context, Intent intent) {
? ? ? ? // TODO Auto-generated method stub
? ? ? ? // 如果相等的話就說明網(wǎng)絡(luò)狀態(tài)發(fā)生了變化
? ? ? ? Log.i("NetBroadcastReceiver", "NetBroadcastReceiver changed");
? ? ? ? if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
? ? ? ? ? ? int netWorkState = NetUtil.getNetWorkState(context);
? ? ? ? ? ? // 當(dāng)網(wǎng)絡(luò)發(fā)生變化共郭,判斷當(dāng)前網(wǎng)絡(luò)狀態(tài)祠丝,并通過NetEvent回調(diào)當(dāng)前網(wǎng)絡(luò)狀態(tài)
? ? ? ? ? ? if (listener != null) {
? ? ? ? ? ? ? ? listener.onChangeListener(netWorkState);
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? // 自定義接口
? ? public interface NetChangeListener {
? ? ? ? void onChangeListener(int status);
? ? }
}
三、注冊廣播
<receiver android:name=".network.NetBroadcastReceiver">
? ? <intent-filter>
? ? ? ? <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
? ? </intent-filter>
</receiver>
這里有一個問題除嘹,在Android 7.0之靜態(tài)注冊廣播的方式被取消了写半,所以我們這里采用動態(tài)注冊的方式
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
? ? //實例化IntentFilter對象
? ? IntentFilter filter = new IntentFilter();
? ? filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
? ? netBroadcastReceiver = new NetBroadcastReceiver();
? ? //注冊廣播接收
? ? registerReceiver(netBroadcastReceiver, filter);
}
四、創(chuàng)建一個回調(diào)當(dāng)前網(wǎng)絡(luò)狀態(tài)值的接口類
// 自定義接口
public interface NetChangeListener {
? ? void onChangeListener(int status);
}
五尉咕、并在BaseActivity中實現(xiàn)該接口叠蝇,廣播檢測到網(wǎng)絡(luò)變化時,通過onChangeListener回調(diào)當(dāng)前網(wǎng)絡(luò)狀態(tài)至BaseActivity
/**
* 網(wǎng)絡(luò)變化之后的類型
*/
@Override
public void onChangeListener(int netMobile) {
? ? // TODO Auto-generated method stub
? ? this.netType = netMobile;
? ? Log.i("netType", "netType:" + netMobile);
? ? if (!isNetConnect()) {
? ? ? ? showNetDialog();
? ? ? ? T.showShort("網(wǎng)絡(luò)異常年缎,請檢查網(wǎng)絡(luò)");
? ? } else {
? ? ? ? hideNetDialog();
? ? ? ? T.showShort("網(wǎng)絡(luò)恢復(fù)正常");
? ? }
}
六悔捶、這里寫了個dialog用來提示網(wǎng)絡(luò)的變化 showNetDialog() 和 hideNetDialog()分別用來顯示和隱藏dialog
/**
* 彈出設(shè)置網(wǎng)絡(luò)框
*/
private void showNetDialog() {
? ? if (alertDialog == null) {
? ? ? ? alertDialog = new MyAlertDialog(this).builder().setTitle("網(wǎng)絡(luò)異常")
? ? ? ? ? ? ? ? .setNegativeButton("取消", new OnClickListener() {
? ? ? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? ? ? public void onClick(View view) {
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }).setPositiveButton("設(shè)置", new OnClickListener() {
? ? ? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? ? ? public void onClick(View view) {
? ? ? ? ? ? ? ? ? ? ? ? Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
? ? ? ? ? ? ? ? ? ? ? ? startActivity(intent);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }).setCancelable(false);
? ? }
? ? alertDialog.show();
? ? showMsg("網(wǎng)絡(luò)異常,請檢查網(wǎng)絡(luò)");
}
七单芜、通過Intent跳轉(zhuǎn)到網(wǎng)絡(luò)設(shè)置頁面
Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
startActivity(intent);