Android BroadcastReceiver實現(xiàn)網(wǎng)絡(luò)狀態(tài)實時監(jiān)聽
前言:最近公司項目重構(gòu),為了提高用戶的體驗,項目中要求添加當前網(wǎng)絡(luò)狀態(tài)的實時監(jiān)聽,以便在無網(wǎng)絡(luò)狀態(tài)時給用戶友好的提醒并修改UI界面。本文將介紹使用四大組件之一的BroadcastReceiver實現(xiàn)全局的網(wǎng)絡(luò)狀態(tài)監(jiān)聽,使用動態(tài)方式注冊。
BroadcastReceiver的注冊方式:
(1)動態(tài)注冊:即在代碼中使用registerReceiver()方法進行注冊,動態(tài)注冊需要在onPause或onDestory方法中反注冊,不然會出現(xiàn)泄露。
(2)靜態(tài)注冊:在清單文件的application節(jié)點下通過<receiver>標簽聲明,系統(tǒng)首次啟動時會自動注冊。
效果圖:
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; //移動數(shù)據(jù)或無線網(wǎng)絡(luò)連接 private static final boolean NETWORK_AVAILABLE = true; /** * 獲取當前網(wǎng)絡(luò)狀態(tài) * @param context 上下文對象 * @return boolean */ public static boolean getNetStatus(Context context) { // 獲取系統(tǒng)連接管理器對象 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. * 用于實時監(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)的類型到注冊廣播的頁面 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中注冊
(1)BaseActivity實現(xiàn)網(wǎng)絡(luò)狀態(tài)監(jiān)聽接口
(2)onResume中注冊廣播
@Override protected void onResume() { super.onResume(); //注冊網(wǎng)絡(luò)狀態(tài)監(jiān)聽的廣播 registerBroadcastReceiver(); }
/** * 注冊網(wǎng)絡(luò)狀態(tài)廣播 */ private void registerBroadcastReceiver() { //注冊廣播 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中取消注冊
@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("當前網(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); } } };
這樣就實現(xiàn)了全局網(wǎng)絡(luò)狀態(tài)監(jiān)聽,并在主線程修改UI界面。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android四大組件之廣播BroadcastReceiver詳解
- Android 使用registerReceiver注冊BroadcastReceiver案例詳解
- Android BroadcastReceiver廣播簡單使用
- Android Broadcast 和 BroadcastReceiver的權(quán)限限制方式
- Android中BroadcastReceiver案例講解
- Android四大組件之BroadcastReceiver詳解
- Android中BroadcastReceiver實現(xiàn)短信關(guān)鍵字自動回復(fù)功能
- Android使用BroadcastReceiver監(jiān)聽網(wǎng)絡(luò)連接狀態(tài)的改變
- Android?廣播接收器BroadcastReceiver詳解
相關(guān)文章
Android使用surfaceView自定義抽獎大轉(zhuǎn)盤
這篇文章主要為大家詳細介紹了Android使用surfaceView自定義抽獎大轉(zhuǎn)盤,熟練掌握SurfaceVie實現(xiàn)抽獎大轉(zhuǎn)盤,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12Android自定義View實現(xiàn)九宮格圖形解鎖(Kotlin版)
這篇文章主要為大家詳細介紹了Android自定義View實現(xiàn)九宮格圖形解鎖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09詳解Android 通過Socket 和服務(wù)器通訊(附demo)
Android 通過Socket 和服務(wù)器通訊,是一種比較常用的通訊方式,這篇文章主要介紹了詳解Android 通過Socket 和服務(wù)器通訊,有興趣的可以了解一下。2016-12-12Android NDK開發(fā)之:配置環(huán)境的詳解
本篇文章是對Android中的配置環(huán)境進行了詳細的分析介紹,需要的朋友參考下2013-05-05