前言:最近公司項目重構,為了提高用戶的體驗,項目中要求添加當前網絡狀態的實時監聽,以便在無網絡狀態時給用戶友好的提醒并修改UI界面。本文將介紹使用四大組件之一的BroadcastReceiver實現全局的網絡狀態監聽,使用動態方式注冊。
BroadcastReceiver的注冊方式:
(1)動態注冊:即在代碼中使用registerReceiver()方法進行注冊,動態注冊需要在onPause或onDestory方法中反注冊,不然會出現泄露。
(2)靜態注冊:在清單文件的application節點下通過<receiver>標簽聲明,系統首次啟動時會自動注冊。
效果圖:
1.定義網絡狀態監聽接口及方法
/** * 網絡狀態類型改變的監聽接口 */public interface NetStatusMonitor { void onNetChange(boolean netStatus);}/** * 設置網絡狀態監聽接口 */public void setStatusMonitor(NetStatusMonitor netStatusMonitor) { this.netStatusMonitor = netStatusMonitor;}
2.網絡狀態工具類
/** * Created by ruancw on 2018/5/27. * 網絡狀態工具類 */public class NetUtil { //網絡未連接 private static final boolean NETWORK_NONE = false; //移動數據或無線網絡連接 private static final boolean NETWORK_AVAILABLE = true; /** * 獲取當前網絡狀態 * @param context 上下文對象 * @return boolean */ public static boolean getNetStatus(Context context) { // 獲取系統連接管理器對象 ConnectivityManager connectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); //獲取網絡狀態信息 NetworkInfo activeNetworkInfo = connectivityManager != null ? connectivityManager .getActiveNetworkInfo() : null; //判斷網絡NetworkInfo是否不為空且連接 if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) { //網絡連接可用 return NETWORK_AVAILABLE; } else { return NETWORK_NONE;//網絡不可用(未連接) } }}
3.定義NetBroadcastReceiver
NetBroadcastReceiver繼承自BroadcastReceiver,并重寫onReceive方法
/** * Created by ruancw on 2018/5/27. * 用于實時監聽app的網絡狀態 */public class NetBroadcastReceiver extends BroadcastReceiver { //網絡狀態監聽接口 private NetStatusMonitor netStatusMonitor; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { //獲取網絡狀態的類型 boolean netStatus = NetUtil.getNetStatus(context); if (netStatusMonitor != null) // 接口傳遞網絡狀態的類型到注冊廣播的頁面 netStatusMonitor.onNetChange(netStatus); } } /** * 網絡狀態類型改變的監聽接口 */ public interface NetStatusMonitor { void onNetChange(boolean netStatus); } /** * 設置網絡狀態監聽接口 */ public void setStatusMonitor(NetStatusMonitor netStatusMonitor) { this.netStatusMonitor = netStatusMonitor; }}
4.BaseActivity中注冊
(1)BaseActivity實現網絡狀態監聽接口
(2)onResume中注冊廣播
@Overrideprotected void onResume() { super.onResume(); //注冊網絡狀態監聽的廣播 registerBroadcastReceiver();}
/** * 注冊網絡狀態廣播 */private void registerBroadcastReceiver() { //注冊廣播 if (netBroadcastReceiver == null) { netBroadcastReceiver = new NetBroadcastReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(netBroadcastReceiver, filter); //設置監聽 netBroadcastReceiver.setStatusMonitor(this); }}
(3)onPause或onDestory中取消注冊
@Overrideprotected void onDestroy() { super.onDestroy(); if (netBroadcastReceiver != null) { //注銷廣播 unregisterReceiver(netBroadcastReceiver); }}
(4)重寫網絡監聽接口方法
@Overridepublic void onNetChange(boolean netStatus) { this.netStatus = netStatus; isNetConnect();}
/** * 監聽網絡狀態做出相應改變 */private void isNetConnect() { Message message=new Message(); if (netStatus){ message.what=99; handler.sendMessage(message); }else { UIUtil.toast("當前網絡不可用"); 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); } }};
這樣就實現了全局網絡狀態監聽,并在主線程修改UI界面。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。
新聞熱點
疑難解答