国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android BroadcastReceiver實現網絡狀態實時監聽

2019-10-22 18:10:28
字體:
來源:轉載
供稿:網友

前言:最近公司項目重構,為了提高用戶的體驗,項目中要求添加當前網絡狀態的實時監聽,以便在無網絡狀態時給用戶友好的提醒并修改UI界面。本文將介紹使用四大組件之一的BroadcastReceiver實現全局的網絡狀態監聽,使用動態方式注冊。

BroadcastReceiver的注冊方式:

(1)動態注冊:即在代碼中使用registerReceiver()方法進行注冊,動態注冊需要在onPause或onDestory方法中反注冊,不然會出現泄露。

(2)靜態注冊:在清單文件的application節點下通過<receiver>標簽聲明,系統首次啟動時會自動注冊。

效果圖:

Android,BroadcastReceiver,網絡狀態,實時監聽

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武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 渑池县| 庄河市| 德阳市| 佳木斯市| 繁昌县| 那坡县| 固安县| 巴彦县| 宜丰县| 揭阳市| 兴隆县| 行唐县| 棋牌| 呼和浩特市| 广州市| 沈阳市| 敖汉旗| 昌江| 祁门县| 兰州市| 苏州市| 博客| 开封市| 景泰县| 瑞昌市| 高要市| 潢川县| 前郭尔| 新闻| 时尚| 罗江县| 锦州市| 略阳县| 长宁县| 明光市| 申扎县| 繁昌县| 鹤壁市| 渑池县| 稻城县| 宣化县|