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)方式注冊。
BroadcastReceiver的注冊方式:
(1)動(dòng)態(tài)注冊:即在代碼中使用registerReceiver()方法進(jìn)行注冊,動(dòng)態(tài)注冊需要在onPause或onDestory方法中反注冊,不然會(huì)出現(xiàn)泄露。
(2)靜態(tài)注冊:在清單文件的application節(jié)點(diǎn)下通過<receiver>標(biāo)簽聲明,系統(tǒng)首次啟動(dòng)時(shí)會(huì)自動(dò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;
//移動(dòng)數(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í)時(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)鍵字自動(dòng)回復(fù)功能
- Android使用BroadcastReceiver監(jiān)聽網(wǎng)絡(luò)連接狀態(tài)的改變
- Android?廣播接收器BroadcastReceiver詳解
相關(guān)文章
Jenkins打包android應(yīng)用時(shí)自動(dòng)簽名apk詳解
這篇文章主要介紹了Jenkins打包android應(yīng)用時(shí)自動(dòng)簽名apk詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
完美實(shí)現(xiàn)ExpandableListView二級(jí)分欄效果
這篇文章主要為大家詳細(xì)介紹了ExpandableListView實(shí)現(xiàn)二級(jí)分欄效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
Android編程實(shí)現(xiàn)對文件夾里文件排序的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)對文件夾里文件排序的方法,涉及Android文件操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-01-01
Android直播軟件搭建之實(shí)現(xiàn)背景顏色滑動(dòng)漸變效果的詳細(xì)代碼
這篇文章主要介紹了Android直播軟件搭建之實(shí)現(xiàn)背景顏色滑動(dòng)漸變效果的詳細(xì)代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
Android onActivityResult和setResult方法詳解及使用
這篇文章主要介紹了Android onActivityResult和setResult方法詳解及使用的相關(guān)資料,這里提供實(shí)例,幫助大家學(xué)習(xí)理解,需要的朋友可以參考下2016-12-12
Android圖片三級(jí)緩存的原理及其實(shí)現(xiàn)
本篇文章主要介紹了Android圖片三級(jí)緩存的原理及其實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09
Android?Flutter使用本地?cái)?shù)據(jù)庫編寫備忘錄應(yīng)用
這篇文章主要為大家詳細(xì)介紹了Android?Flutter如何使用本地?cái)?shù)據(jù)庫實(shí)現(xiàn)編寫簡單的備忘錄應(yīng)用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-03-03
Android利用Intent實(shí)現(xiàn)讀取圖片操作
這篇文章主要為大家詳細(xì)介紹了Android利用Intent實(shí)現(xiàn)讀取圖片操作的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-06-06

