當(dāng)我們在Android設(shè)備上關(guān)閉網(wǎng)絡(luò)連接時系統(tǒng)會發(fā)送網(wǎng)絡(luò)改變廣播,如下:
log.PNG
08-12 14:51:57.763 877-968/? D/ConnectivityService: sendStickyBroadcast: action=android.net.conn.CONNECTIVITY_CHANGE
action是android.net.conn.CONNECTIVITY_CHANGE,只要我們知道了這個Action就可以寫一個廣播接收器來接收網(wǎng)絡(luò)狀態(tài)的改變,并做出不同的處理邏輯,比如顯示一個斷網(wǎng)提示之類的什么的。
下面看下代碼
public class NetChangeReceiver extends BroadcastReceiver {
@SuppressLint("UnsafeProtectedBroadcastReceiver")
@Override
public void onReceive(Context context, Intent intent) {
try {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable()) {
//有網(wǎng)處理
} else {
//無網(wǎng)顯示個提示什么的
}
} catch (Exception e) {
//ignore
}
}
}
然后在清單文件中注冊:
// 這里注意路徑,每個人寫的包名不一樣,須修改成自己的包名下的路徑
<receiver android:name=".receiver.NetChangeReceiver ">
<intent-filter>
<action
android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
看起來完成了,在Android 5.1上試驗(yàn)也沒問題,但是在8.0上的手機(jī)出問題了,具然收不到廣播。What?
查了下,發(fā)現(xiàn),在Android8.0行為變更,大多數(shù)靜態(tài)注冊的廣播將接收不到,好吧。。。,將上述代碼修改成動態(tài)注冊的方式,測試,果然可以收到。
動態(tài)注冊代碼如下:
NetChangeReceiver receiver = new NetChangeReceiver ();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
mContext.registerReceiver(receiver, intentFilter);
這里使用的全局的Application,并沒有解注冊,大家注意根據(jù)需要實(shí)現(xiàn)。