有的時候咱們在寫項目的時候,須要監聽網絡的變化,來作一些事情,須要處理一些業務邏輯等事情。android
今天查看了一些帖子資料,寫一個demo來記錄一下本身的筆記,以便本身在之後使用的時候,能更快的熟悉。網絡
註解: BroadcastReceiverapp
在Android中,Broadcast是一種普遍運用的在應用程序之間傳輸信息的機制。而BroadcastReceiver是對發送出來的 Broadcast進行過濾接受並響應的一類組件。ide
下面將詳細的闡述如何發送Broadcast和使用BroadcastReceiver過濾接收的過程:.net
首先在須要發送信息的地方,把要發送的信息和用於過濾的信息(如Action、Category)裝入一個Intent對象,而後經過調用 sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent對象以廣播方式發送出去。線程
當Intent發送之後,全部已經註冊的BroadcastReceiver會檢查註冊時的IntentFilter是否與發送的Intent相匹配,若匹配則就會調用BroadcastReceiver的onReceive()方法。因此當咱們定義一個BroadcastReceiver的時候,都須要實現onReceive()方法。code
廣播—是一個生命週期很短的過程,在這個過程裏面不能有太耗時的操做(固然不能開子線程,有點時候線程尚未結束,廣播的生命週期就結束了),那麼記錄一下本身的demo。xml
廣播的註冊方式有兩種: (1)能夠在配置文件Manifest.xml中註冊對象
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.zhjy.hxf.hznetworkchangedreceiver"> <uses-permission android:name="android.permission.access_wifi_state" /> <uses-permission android:name="android.permission.access_network_state" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!--在AndroidManifest.xml中用標籤生命註冊,並在標籤內用標籤設置過濾器--> <receiver android:name=".NetworkReceiver" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> <action android:name="android.net.wifi.STATE_CHANGE" /> </intent-filter> </receiver> </application> </manifest>
(2)固然還有一種就是在代碼中實現動態註冊繼承
package com.zhjy.hxf.hznetworkchangedreceiver; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.wifi.WifiManager; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); init(); } private void init() { //在代碼中實現動態註冊的方式 IntentFilter filter = new IntentFilter(); filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(new NetworkReceiver(), filter); } }
那麼接下來咱們就該建立對網絡斷開和鏈接實時監聽NetworkReceiver繼承自BroadcastReceiver,而且要實現其中的一個方法, public void onReceive(Context context, Intent intent)方法。
NetworkReceiver的實現代碼以下:
package com.zhjy.hxf.hznetworkchangedreceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiManager; import android.os.Parcelable; import android.util.Log; /** * @author :huangxianfeng on 2016/12/6. * 監聽網絡的變化 */ public class NetworkReceiver extends BroadcastReceiver { private final static String TAG = NetworkReceiver.class.getName(); private String getConnectionType(int type) { String connType = ""; if (type == ConnectivityManager.TYPE_MOBILE) { connType = "3G網絡數據"; } else if (type == ConnectivityManager.TYPE_WIFI) { connType = "WIFI網絡"; } return connType; } @Override public void onReceive(Context context, Intent intent) { if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())){ //拿到wifi的狀態值 int wifiState = intent.getIntExtra(WifiManager.EXTRA_NEW_STATE,0); Log.i(TAG,"wifiState = "+ wifiState); switch (wifiState){ case WifiManager.WIFI_STATE_DISABLED: break; case WifiManager.WIFI_STATE_DISABLING: break; } } //監聽wifi的鏈接狀態便是否鏈接的一個有效的無線路由 if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())){ Parcelable parcelableExtra = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); if (parcelableExtra != null){ // 獲取聯網狀態的NetWorkInfo對象 NetworkInfo networkInfo = (NetworkInfo) parcelableExtra; //獲取的State對象則表明着鏈接成功與否等狀態 NetworkInfo.State state = networkInfo.getState(); //判斷網絡是否已經鏈接 boolean isConnected = state == NetworkInfo.State.CONNECTED; Log.i(TAG, "isConnected:" + isConnected); if (isConnected) { } else { } } } // 監聽網絡鏈接,包括wifi和移動數據的打開和關閉,以及鏈接上可用的鏈接都會接到監聽 if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) { //獲取聯網狀態的NetworkInfo對象 NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); if (info != null) { //若是當前的網絡鏈接成功而且網絡鏈接可用 if (NetworkInfo.State.CONNECTED == info.getState() && info.isAvailable()) { if (info.getType() == ConnectivityManager.TYPE_WIFI || info.getType() == ConnectivityManager.TYPE_MOBILE) { Log.i(TAG, getConnectionType(info.getType()) + "連上"); } } else { Log.i(TAG, getConnectionType(info.getType()) + "斷開"); } } } } }
在onReceive方法裏面,咱們能夠獲取從廣播而來的Intent中的數據,這包含不少有用的信息,其中ConnectivityManager : 主要管理和網絡鏈接相關的操做。WifiManager: 管理和wifi相關的信息 TelephonyManager: 管理和手機、運營商等的相關信息 NetworkInfo類包含了對wifi和mobile兩種網絡模式鏈接的詳細描述, 經過getState()方法獲取的State對象,表明着鏈接成功與否的狀態。
最後記得添加權限:
<uses-permission android:name="android.permission.access_wifi_state" /> <uses-permission android:name="android.permission.access_network_state" />