在實際開發(fā)中在我們的 app 中幾乎都會用到網(wǎng)絡,有時我們需要在網(wǎng)絡改變時給用戶一些體驗上的友好提示,比如:我們在視頻播放時,由wifi切換到4G網(wǎng)絡時,要給用戶提示,當前為 4G 網(wǎng)絡狀態(tài),注意流量的使用等.
不同level 網(wǎng)絡變化監(jiān)聽
在android5.0(API21)之前是使用廣播的方式進行監(jiān)聽,從android5.0(API21)起使用NetworkCallback 監(jiān)聽網(wǎng)絡變化.
下面主要介紹基于廣播的方式監(jiān)聽網(wǎng)絡變,NetStatus 庫目前也是基于廣播的方式實現(xiàn),后期會適配 API21 以后新的方法 NetworkCallback.
網(wǎng)絡變化的監(jiān)聽
實現(xiàn)方法,我們通過添加廣播的方式,監(jiān)聽網(wǎng)絡變化.
- 添加網(wǎng)絡狀態(tài)權限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
- 創(chuàng)建網(wǎng)絡變化監(jiān)聽廣播
public class NetStatusBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//當網(wǎng)絡變化時,該廣播中該方法會被回調.
}
}
- 在 AndroidManifest.xml 中添加廣播的配置信息,如下:
<receiver android:name=".NetStatusBroadcast">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
實現(xiàn)這個功能很簡單,就上面這個幾行代碼就可以實現(xiàn).
在注冊網(wǎng)絡變化監(jiān)聽時,建議是使用動態(tài)注冊方式.不要忘記當程序退出時記得你,取消注冊.
IntentFilter filter = new IntentFilter();
filter.addAction(NetStatusBroadcast.NET_CHANGE_ACTION);
mBroadcast = new NetStatusBroadcast();
this.registerReceiver(mBroadcast,filter);
下面是一個監(jiān)聽網(wǎng)絡變化的工具庫NetStatus
NetStatus工具庫使用方法:
介紹
NetStatus 是一個監(jiān)聽網(wǎng)絡狀態(tài)變化的工具庫.
功能
- 在網(wǎng)絡狀態(tài)發(fā)生變化時,可以控制不同注冊監(jiān)聽響應順序
- 可以對網(wǎng)絡狀態(tài)進行過濾和攔截處理.
工程地址:
載地址:https://github.com/MrChao1991/NetStatus
使用
引入依賴
引入NetStatus庫 lib-
注冊:
NetWorkStatus.register(context);
-
取消注冊:
NetWorkStatus.unregister();
-
注冊網(wǎng)絡變化監(jiān)聽
默認優(yōu)先級, 優(yōu)先級默認為0 ,最低private NetStatusReceiver receiver = new NetStatusReceiver() { @Override protected void netStatusChanged(NetType netType) { // 變化時,回調 } @Override public boolean onFilter(NetType netType) { // 過來方法,如果攔截 返回false ,繼續(xù)執(zhí)行后面的監(jiān)聽返回true return super.onFilter(netType); } }; NetTypeObservable.register(receiver);
帶有優(yōu)先級注冊, 優(yōu)先級越高優(yōu)先執(zhí)行.
private NetStatusReceiver receiver = new NetStatusReceiver() { @Override protected void netStatusChanged(NetType netType) { // 網(wǎng)絡變化時,回調 } @Override public boolean onFilter(NetType netType) { // 過濾和攔截方法,如果攔截 返回false ,繼續(xù)執(zhí)行后面的監(jiān)聽返回true return super.onFilter(netType); } }; NetTypeObservable.register(receiver, 20);
說明:
- 注冊時可以設置Receiver的優(yōu)先級,優(yōu)先級高的先執(zhí)行,相同優(yōu)先級的,后注冊的先被運行.
- 執(zhí)行完
netStatusChanged
會執(zhí)行到onFilter
中,在onFilter
中可以對網(wǎng)絡狀態(tài)進行干預和攔截. - 使用
NetTypeObservable.register()
注冊網(wǎng)絡狀態(tài)改變監(jiān)聽,可以注冊多個,不使用的要使用NetTypeObservable.unregister(receiver);
取消注冊.
-
取消網(wǎng)絡變化監(jiān)聽注冊
NetTypeObservable.unregister(receiver);
-
單回調網(wǎng)絡變化監(jiān)聽:
無論注冊多少次,在網(wǎng)絡發(fā)生變化時,只有最后一次設置的監(jiān)聽對象會被回調.NetTypeObservable.setNetworkListener(new NetworkListener() { @Override public void netChange(NetType netType) { // 網(wǎng)絡變化時 } });