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