Android BroadcastReceiver實(shí)現(xiàn)網(wǎng)絡(luò)狀態(tài)實(shí)時監(jiān)聽
前言:最近公司項(xiàng)目重構(gòu),為了提高用戶的體驗(yàn),項(xiàng)目中要求添加當(dāng)前網(wǎng)絡(luò)狀態(tài)的實(shí)時監(jiān)聽,以便在無網(wǎng)絡(luò)狀態(tài)時給用戶友好的提醒并修改UI界面。本文將介紹使用四大組件之一的BroadcastReceiver實(shí)現(xiàn)全局的網(wǎng)絡(luò)狀態(tài)監(jiān)聽,使用動態(tài)方式注冊。
BroadcastReceiver的注冊方式:
(1)動態(tài)注冊:即在代碼中使用registerReceiver()方法進(jìn)行注冊,動態(tài)注冊需要在onPause或onDestory方法中反注冊,不然會出現(xiàn)泄露。
(2)靜態(tài)注冊:在清單文件的application節(jié)點(diǎn)下通過<receiver>標(biāo)簽聲明,系統(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;
/**
* 獲取當(dāng)前網(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.
* 用于實(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)的類型到注冊廣播的頁面
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實(shí)現(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("當(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界面。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android四大組件之廣播BroadcastReceiver詳解
- Android 使用registerReceiver注冊BroadcastReceiver案例詳解
- Android BroadcastReceiver廣播簡單使用
- Android Broadcast 和 BroadcastReceiver的權(quán)限限制方式
- Android中BroadcastReceiver案例講解
- Android四大組件之BroadcastReceiver詳解
- Android中BroadcastReceiver實(shí)現(xiàn)短信關(guān)鍵字自動回復(fù)功能
- Android使用BroadcastReceiver監(jiān)聽網(wǎng)絡(luò)連接狀態(tài)的改變
- Android?廣播接收器BroadcastReceiver詳解
相關(guān)文章
Android使用surfaceView自定義抽獎大轉(zhuǎn)盤
這篇文章主要為大家詳細(xì)介紹了Android使用surfaceView自定義抽獎大轉(zhuǎn)盤,熟練掌握SurfaceVie實(shí)現(xiàn)抽獎大轉(zhuǎn)盤,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12
基于Android自定義控件實(shí)現(xiàn)雷達(dá)效果
這篇文章主要為大家詳細(xì)介紹了基于Android自定義控件實(shí)現(xiàn)雷達(dá)效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
Android自定義View實(shí)現(xiàn)九宮格圖形解鎖(Kotlin版)
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)九宮格圖形解鎖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
Android studio案例之實(shí)現(xiàn)電話撥號
這篇文章主要介紹了Android studio案例之實(shí)現(xiàn)電話撥號,并有詳細(xì)的步驟和實(shí)現(xiàn)代碼,對此感興趣的同學(xué),可以參考下2021-04-04
gradle配置國內(nèi)鏡像的實(shí)現(xiàn)
這篇文章主要介紹了gradle配置國內(nèi)鏡像的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
詳解Android 通過Socket 和服務(wù)器通訊(附demo)
Android 通過Socket 和服務(wù)器通訊,是一種比較常用的通訊方式,這篇文章主要介紹了詳解Android 通過Socket 和服務(wù)器通訊,有興趣的可以了解一下。2016-12-12
Android NDK開發(fā)之:配置環(huán)境的詳解
本篇文章是對Android中的配置環(huán)境進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05

