在工作中調(diào)試一個功能的時候诗眨,發(fā)現(xiàn)之前的android.net.conn.CONNECTIVITY_CHANGE的廣播始終無法收到,而adb logcat打印出來的log發(fā)現(xiàn)有其他應(yīng)用可以收到這個廣播的旦委。后來研究發(fā)現(xiàn)在Android7.0 上為了優(yōu)化后臺省電相關(guān)的東西,已經(jīng)將靜態(tài)注冊這個廣播方式取消了雏亚,7.0 版本上靜態(tài)注冊此廣播的缨硝,已經(jīng)無法收到這個廣播了。
Android 7.0 為了后臺優(yōu)化罢低,推薦使用 JobScheduler 代替 BroadcastReceiver 來監(jiān)聽網(wǎng)絡(luò)變化查辩。
如果你的應(yīng)用無法將targetSDK 降到23或者23以下,有以下兩種比較快捷的適配方式网持。
解決方式有2種:
1.改成動態(tài)注冊宜岛。
2.使用ConnectivityManager.NetworkCallback 來監(jiān)聽網(wǎng)絡(luò)。
第二種實現(xiàn)方式:
final ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
cm.requestNetwork(new NetworkRequest.Builder().build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onLost(Network network) {
super.onLost(network);
///網(wǎng)絡(luò)不可用的情況下的方法
}
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
///網(wǎng)絡(luò)可用的情況下的方法
}
});
很簡單功舀。
如果我們僅僅驗證此廣播萍倡,無需申明任何權(quán)限即可收到此廣播消息,但是往往應(yīng)用還需要訪問網(wǎng)絡(luò)等操作日杈,需要申請以下網(wǎng)絡(luò)權(quán)限遣铝。
AndroidManifest.xml中申明權(quán)限:
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permissionandroid:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/>
這幾個權(quán)限都不是危險權(quán)限佑刷,直接申明即可。存在如果不申明android.permission.CHANGE_NETWORK_STATE 這個權(quán)限的時候酿炸,應(yīng)用報錯的情況瘫絮。
總結(jié)
1.如果應(yīng)用程序的targetSDK >= N,可以采用上述兩種方案解決此問題填硕,也就是說靜態(tài)注冊android.net.conn.CONNECTIVITY_CHANGE不再起作用麦萤,需要修改成動態(tài)注冊或者使用ConnectivityManager.NetworkCallback監(jiān)聽網(wǎng)絡(luò)。
2.如果應(yīng)用程序的targetSDK<N扁眯,即使安裝在Android7.0機器上壮莹,同樣可以收到靜態(tài)注冊的廣播。