android 全域性網路監聽
阿新 • • 發佈:2018-12-29
平常我們在android的頁面要檢測是否有網路,並且還要根據不同的網路來處理相關事務
1.開啟系統廣播監聽
package com.dejun.commonsdk.receiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import com.dejun.commonsdk.observer.NetChangeObserver; import com.dejun.commonsdk.util.NetUtils; import java.util.ArrayList; /** * Author:DoctorWei * Time:2018/12/15 9:43 * Description: * email:[email protected] */ public class NetStateReceiver extends BroadcastReceiver { public final static String CUSTOM_ANDROID_NET_CHANGE_ACTION = "com.zhanyun.api.netstatus.CONNECTIVITY_CHANGE"; private final static String ANDROID_NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE"; private static boolean isNetAvailable = false; private static NetUtils.NetType mNetType; private static ArrayList<NetChangeObserver> mNetChangeObservers = new ArrayList<>(); private static BroadcastReceiver mBroadcastReceiver; @Override public void onReceive(Context context, Intent intent) { mBroadcastReceiver = NetStateReceiver.this; if (intent.getAction().equalsIgnoreCase(ANDROID_NET_CHANGE_ACTION) || intent.getAction().equalsIgnoreCase(CUSTOM_ANDROID_NET_CHANGE_ACTION)) { if (!NetUtils.isNetworkAvailable(context)) { isNetAvailable = false; } else { isNetAvailable = true; mNetType = NetUtils.getAPNType(context); } notifyObserver(); } } private void notifyObserver() { if (!mNetChangeObservers.isEmpty()) { int size = mNetChangeObservers.size(); for (int i = 0; i < size; i++) { NetChangeObserver observer = mNetChangeObservers.get(i); if (observer != null) { if (isNetworkAvailable()) { observer.onNetConnected(mNetType); } else { observer.onNetDisConnect(); } } } } } public static boolean isNetworkAvailable() { return isNetAvailable; } /** * 註冊廣播 * * @return */ public static void registerNetworkStateReceiver(Context mContext) { IntentFilter filter = new IntentFilter(); filter.addAction(CUSTOM_ANDROID_NET_CHANGE_ACTION); filter.addAction(ANDROID_NET_CHANGE_ACTION); mContext.getApplicationContext().registerReceiver(getReceiver(), filter); } /** * 銷燬廣播 * * @return */ public static void unRegisterStateReceiver(Context context) { if (mBroadcastReceiver != null) { context.getApplicationContext().unregisterReceiver(mBroadcastReceiver); } } private static BroadcastReceiver getReceiver() { if (mBroadcastReceiver == null) { synchronized (NetStateReceiver.class) { if (mBroadcastReceiver == null) { mBroadcastReceiver = new NetStateReceiver(); } } } return mBroadcastReceiver; } /** * 註冊回撥函式觀察者 */ public static void registerObserver(NetChangeObserver observer) { if (mNetChangeObservers == null) { mNetChangeObservers = new ArrayList<>(); } mNetChangeObservers.add(observer); } /** * 移除監聽 */ public static void removeObserver(NetChangeObserver netChangeObserver) { if (mNetChangeObservers != null) { boolean contains = mNetChangeObservers.contains(netChangeObserver); if (contains) { mNetChangeObservers.remove(netChangeObserver); } } } } 2.獲取網路狀態工具類
package com.dejun.commonsdk.util; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import java.util.Locale; /** * Author:DoctorWei * Time:2018/12/14 14:03 * Description:網路監聽工具類負責實時監聽網路 * email:[email protected] */ public class NetUtils { public static enum NetType { WIFI, CMNET, CMWAP, NONE } /** * 判斷是否已連線上了網路 * * @param context * @return */ public static boolean isNetworkAvailable(Context context) { ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo[] allNetworkInfo = manager.getAllNetworkInfo();//獲取裝置支援的所有網路型別的連結狀態資訊。 if (allNetworkInfo != null) { for (int i = 0; i < allNetworkInfo.length; i++) { if (allNetworkInfo[i].getState() == NetworkInfo.State.CONNECTED) {//已連線 return true; } } } return false; } public static boolean isNetworkConnected(Context context) { if (context != null) { ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo(); if (networkInfo != null) { return networkInfo.isAvailable(); } } return false; } /** * 判斷是否是wifi環境 * * @param context * @return */ public static boolean isWifiConnected(Context context) { if (context != null) { ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfoWifi = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if (networkInfoWifi != null) { return networkInfoWifi.isAvailable(); } } return false; } /** * 判斷是否是4g環境 * * @param context * @return */ public static boolean isMobileConnected(Context context) { if (context != null) { ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfoMobile = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if (networkInfoMobile != null) { return networkInfoMobile.isAvailable(); } } return false; } /** * 獲取連線方式 */ public static int getConnectedType(Context context) { if (context != null) { ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = mConnectivityManager.getActiveNetworkInfo(); if (activeNetworkInfo != null && activeNetworkInfo.isAvailable()) { return activeNetworkInfo.getType(); } } return -1; } public static NetType getAPNType(Context context) { ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = mConnectivityManager.getActiveNetworkInfo(); if (activeNetworkInfo == null) { return NetType.NONE; } int type = activeNetworkInfo.getType(); if (type==ConnectivityManager.TYPE_MOBILE){ if (activeNetworkInfo.getExtraInfo().toLowerCase(Locale.getDefault()).equals("cmnet")){ return NetType.CMNET; }else{ return NetType.CMWAP; } }else if (type==ConnectivityManager.TYPE_WIFI){ return NetType.WIFI; } return NetType.NONE; } } 3.分別在Apllication中註冊廣播和在baseAcitvity中監聽廣播的的觸發 public class MyApllication extends Application{ @Override public void onCreate() { super.onCreate(); NetStateReceiver.registerNetworkStateReceiver(this); }
public abstract class BaseActivity<V extends BaseView,P extends BasePresenter> extends SupportActivity implements BaseView{ /** * 網路觀察者 * @param savedInstanceState */ protected NetChangeObserver netChangeObserver; @Override public void onCreate( Bundle savedInstanceState) { super.onCreate(savedInstanceState); //設定全域性的網路監聽 netChangeObserver=new NetChangeObserver() { @Override public void onNetConnected(NetUtils.NetType netType) { Logger.d("onNetConnected"); } @Override public void onNetDisConnect() { Logger.d("onNetDisConnect"); } }; NetStateReceiver.registerObserver(netChangeObserver); } @Override protected void onDestroy() { super.onDestroy(); if (netChangeObserver!=null) { NetStateReceiver.removeObserver(netChangeObserver); } Logger.d(TAG,"onDestroy"); if (mPresenter!=null){ mPresenter.dettachView(); } } }
@Override public void onLowMemory() { super.onLowMemory(); NetStateReceiver.unRegisterStateReceiver(this); android.os.Process.killProcess(android.os.Process.myPid()); } }