一步步帶你實現Android網絡狀態監聽

前言

最近又在從新看《第一行代碼》這本書,在第五章中有一個樣例,能夠檢測當前網絡狀態,可是隻能判斷當前網絡是否可用,在此之上我想是否能作出一個和咱們平常使用的APP同樣判斷當前網絡是wifi仍是移動網絡的樣例出來,因而便有了這篇博文的誕生,一樣這也是我第一次寫博文,但願可以給須要的人帶來一些啓發。java

檢測網絡變化

  • 首先在清單文件里加入權限 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 這裏咱們加入的這個權限並不是<uses-permission android:name="android.permission.INTERNET" /> 由於咱們只須要應用去獲取當前網絡狀態,而不須要去經過應用去上網,因此只加入上述一個權限便可。
  • 實現書上的樣例
class NetworkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "網絡狀態改變", Toast.LENGTH_SHORT).show();
        }
    }
複製代碼

因爲代碼比較少,直接在MainActivity裏寫一個內部類,讓它繼承自BroadcastReceiver,命名爲NetworkChangeReceive,並重寫onReceive方法,當檢測到網絡狀態變化時彈出一個Toast。android

private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
複製代碼

在全局變量中增長兩個變量。網絡

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReceiver = new NetworkChangeReceiver();
        registerReceiver(networkChangeReceiver, intentFilter);
    }
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);
    }
複製代碼

在onCreate方法裏對networkChangeReceiver進行註冊而且在onDestroy方法裏進行註銷。ide

如今讓咱們運行程序,能夠發現程序已經可以判斷網絡狀態的變化,可是這仍是不夠的,因此接下來讓咱們接着進行改進。

檢測當前網絡是否可用

public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            if (networkInfo != null && networkInfo.isAvailable()) {
                Toast.makeText(context, "當前網絡可用", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "當前網絡不可用", Toast.LENGTH_SHORT).show();
            }
        }
複製代碼

在onReceive()方法中,首先經過getSystemService()方法獲得了ConnectivityManager的實例,這是一個系統服務類,專門用於管理網絡鏈接的。而後調用它的getActiveNetworkInfo()方法能夠獲得NetworkInfo的實例,接着調用NetworkInfo的isAvailable()方法就能夠判斷出當前是否有網絡了。spa

再次運行程序,發現已經能夠判斷當前網絡是否可用,書上的例子到這裏也就結束了,不過以後咱們只須要對當前網絡的類型進行判斷就能夠完成咱們最終的目標了。

判斷當前網絡屬於wif仍是流量

經過查看API,找到networkInfo中的getType方法能夠返回當前網絡類型。一共有五種類型,而其中的TYPE_MOBILE和TYPE_WIFI正是咱們所須要的。

class NetworkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
            if (networkInfo != null && networkInfo.isAvailable()) {
                switch (networkInfo.getType()) {
                    case TYPE_MOBILE:
                        Toast.makeText(context, "正在使用2G/3G/4G網絡", Toast.LENGTH_SHORT).show();
                        break;
                    case TYPE_WIFI:
                        Toast.makeText(context, "正在使用wifi上網", Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        break;
                }
            } else {
                Toast.makeText(context, "當前無網絡鏈接", Toast.LENGTH_SHORT).show();
            }
        }
    }
}
複製代碼

嘗試修改代碼,運行。發現程序實現了咱們想要的功能,至此你已經實現了判斷當前網絡類型的功能。
相關文章
相關標籤/搜索