Android BroadcastReceiver實(shí)現(xiàn)網(wǎng)絡(luò)狀態(tài)實(shí)時(shí)監(jiān)聽
前言:最近公司項(xiàng)目重構(gòu),為了提高用戶的體驗(yàn),項(xiàng)目中要求添加當(dāng)前網(wǎng)絡(luò)狀態(tài)的實(shí)時(shí)監(jiān)聽,以便在無網(wǎng)絡(luò)狀態(tài)時(shí)給用戶友好的提醒并修改UI界面。本文將介紹使用四大組件之一的BroadcastReceiver實(shí)現(xiàn)全局的網(wǎng)絡(luò)狀態(tài)監(jiān)聽,使用動(dòng)態(tài)方式注冊(cè)。
BroadcastReceiver的注冊(cè)方式:
(1)動(dòng)態(tài)注冊(cè):即在代碼中使用registerReceiver()方法進(jìn)行注冊(cè),動(dòng)態(tài)注冊(cè)需要在onPause或onDestory方法中反注冊(cè),不然會(huì)出現(xiàn)泄露。
(2)靜態(tài)注冊(cè):在清單文件的application節(jié)點(diǎn)下通過<receiver>標(biāo)簽聲明,系統(tǒng)首次啟動(dòng)時(shí)會(huì)自動(dòng)注冊(cè)。
效果圖:
1.定義網(wǎng)絡(luò)狀態(tài)監(jiān)聽接口及方法
/** * 網(wǎng)絡(luò)狀態(tài)類型改變的監(jiān)聽接口 */ public interface NetStatusMonitor { void onNetChange(boolean netStatus); } /** * 設(shè)置網(wǎng)絡(luò)狀態(tài)監(jiān)聽接口 */ public void setStatusMonitor(NetStatusMonitor netStatusMonitor) { this.netStatusMonitor = netStatusMonitor; }
2.網(wǎng)絡(luò)狀態(tài)工具類
/** * Created by ruancw on 2018/5/27. * 網(wǎng)絡(luò)狀態(tài)工具類 */ public class NetUtil { //網(wǎng)絡(luò)未連接 private static final boolean NETWORK_NONE = false; //移動(dòng)數(shù)據(jù)或無線網(wǎng)絡(luò)連接 private static final boolean NETWORK_AVAILABLE = true; /** * 獲取當(dāng)前網(wǎng)絡(luò)狀態(tài) * @param context 上下文對(duì)象 * @return boolean */ public static boolean getNetStatus(Context context) { // 獲取系統(tǒng)連接管理器對(duì)象 ConnectivityManager connectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); //獲取網(wǎng)絡(luò)狀態(tài)信息 NetworkInfo activeNetworkInfo = connectivityManager != null ? connectivityManager .getActiveNetworkInfo() : null; //判斷網(wǎng)絡(luò)NetworkInfo是否不為空且連接 if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) { //網(wǎng)絡(luò)連接可用 return NETWORK_AVAILABLE; } else { return NETWORK_NONE;//網(wǎng)絡(luò)不可用(未連接) } } }
3.定義NetBroadcastReceiver
NetBroadcastReceiver繼承自BroadcastReceiver,并重寫onReceive方法
/** * Created by ruancw on 2018/5/27. * 用于實(shí)時(shí)監(jiān)聽app的網(wǎng)絡(luò)狀態(tài) */ public class NetBroadcastReceiver extends BroadcastReceiver { //網(wǎng)絡(luò)狀態(tài)監(jiān)聽接口 private NetStatusMonitor netStatusMonitor; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { //獲取網(wǎng)絡(luò)狀態(tài)的類型 boolean netStatus = NetUtil.getNetStatus(context); if (netStatusMonitor != null) // 接口傳遞網(wǎng)絡(luò)狀態(tài)的類型到注冊(cè)廣播的頁(yè)面 netStatusMonitor.onNetChange(netStatus); } } /** * 網(wǎng)絡(luò)狀態(tài)類型改變的監(jiān)聽接口 */ public interface NetStatusMonitor { void onNetChange(boolean netStatus); } /** * 設(shè)置網(wǎng)絡(luò)狀態(tài)監(jiān)聽接口 */ public void setStatusMonitor(NetStatusMonitor netStatusMonitor) { this.netStatusMonitor = netStatusMonitor; } }
4.BaseActivity中注冊(cè)
(1)BaseActivity實(shí)現(xiàn)網(wǎng)絡(luò)狀態(tài)監(jiān)聽接口
(2)onResume中注冊(cè)廣播
@Override protected void onResume() { super.onResume(); //注冊(cè)網(wǎng)絡(luò)狀態(tài)監(jiān)聽的廣播 registerBroadcastReceiver(); }
/** * 注冊(cè)網(wǎng)絡(luò)狀態(tài)廣播 */ private void registerBroadcastReceiver() { //注冊(cè)廣播 if (netBroadcastReceiver == null) { netBroadcastReceiver = new NetBroadcastReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(netBroadcastReceiver, filter); //設(shè)置監(jiān)聽 netBroadcastReceiver.setStatusMonitor(this); } }
(3)onPause或onDestory中取消注冊(cè)
@Override protected void onDestroy() { super.onDestroy(); if (netBroadcastReceiver != null) { //注銷廣播 unregisterReceiver(netBroadcastReceiver); } }
(4)重寫網(wǎng)絡(luò)監(jiān)聽接口方法
@Override public void onNetChange(boolean netStatus) { this.netStatus = netStatus; isNetConnect(); }
/** * 監(jiān)聽網(wǎng)絡(luò)狀態(tài)做出相應(yīng)改變 */ private void isNetConnect() { Message message=new Message(); if (netStatus){ message.what=99; handler.sendMessage(message); }else { UIUtil.toast("當(dāng)前網(wǎng)絡(luò)不可用"); message.what=100; handler.sendMessage(message); } }
(5)主線程修改UI
@SuppressLint("HandlerLeak") Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what==100){ tvNet.setVisibility(View.VISIBLE); }else { tvNet.setVisibility(View.GONE); } } };
這樣就實(shí)現(xiàn)了全局網(wǎng)絡(luò)狀態(tài)監(jiān)聽,并在主線程修改UI界面。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android四大組件之廣播BroadcastReceiver詳解
- Android 使用registerReceiver注冊(cè)BroadcastReceiver案例詳解
- Android BroadcastReceiver廣播簡(jiǎn)單使用
- Android Broadcast 和 BroadcastReceiver的權(quán)限限制方式
- Android中BroadcastReceiver案例講解
- Android四大組件之BroadcastReceiver詳解
- Android中BroadcastReceiver實(shí)現(xiàn)短信關(guān)鍵字自動(dòng)回復(fù)功能
- Android使用BroadcastReceiver監(jiān)聽網(wǎng)絡(luò)連接狀態(tài)的改變
- Android?廣播接收器BroadcastReceiver詳解
相關(guān)文章
Android使用surfaceView自定義抽獎(jiǎng)大轉(zhuǎn)盤
這篇文章主要為大家詳細(xì)介紹了Android使用surfaceView自定義抽獎(jiǎng)大轉(zhuǎn)盤,熟練掌握SurfaceVie實(shí)現(xiàn)抽獎(jiǎng)大轉(zhuǎn)盤,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12基于Android自定義控件實(shí)現(xiàn)雷達(dá)效果
這篇文章主要為大家詳細(xì)介紹了基于Android自定義控件實(shí)現(xiàn)雷達(dá)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Android自定義View實(shí)現(xiàn)九宮格圖形解鎖(Kotlin版)
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)九宮格圖形解鎖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Android studio案例之實(shí)現(xiàn)電話撥號(hào)
這篇文章主要介紹了Android studio案例之實(shí)現(xiàn)電話撥號(hào),并有詳細(xì)的步驟和實(shí)現(xiàn)代碼,對(duì)此感興趣的同學(xué),可以參考下2021-04-04gradle配置國(guó)內(nèi)鏡像的實(shí)現(xiàn)
這篇文章主要介紹了gradle配置國(guó)內(nèi)鏡像的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09詳解Android 通過Socket 和服務(wù)器通訊(附demo)
Android 通過Socket 和服務(wù)器通訊,是一種比較常用的通訊方式,這篇文章主要介紹了詳解Android 通過Socket 和服務(wù)器通訊,有興趣的可以了解一下。2016-12-12完美解決Android App啟動(dòng)頁(yè)有白屏閃過的問題
這篇文章主要介紹了完美解決Android App啟動(dòng)頁(yè)有白屏閃過的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08Android NDK開發(fā)之:配置環(huán)境的詳解
本篇文章是對(duì)Android中的配置環(huán)境進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Android自定義View新年煙花、祝福語橫幅動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了Android自定義View新年煙花、祝福語橫幅動(dòng)畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01