在工作中調(diào)試一個(gè)功能的時(shí)候,發(fā)現(xiàn)之前的android.net.conn.CONNECTIVITY_CHANGE的廣播始終無(wú)法收到,而adb logcat打印出來(lái)的log發(fā)現(xiàn)有其他應(yīng)用可以收到這個(gè)廣播的。后來(lái)研究發(fā)現(xiàn)在Android7.0 上為了優(yōu)化后臺(tái)省電相關(guān)的東西,已經(jīng)將靜態(tài)注冊(cè)這個(gè)廣播方式取消了,7.0 版本上靜態(tài)注冊(cè)此廣播的,已經(jīng)無(wú)法收到這個(gè)廣播了。
Android 7.0 為了后臺(tái)優(yōu)化,推薦使用 JobScheduler 代替 BroadcastReceiver 來(lái)監(jiān)聽(tīng)網(wǎng)絡(luò)變化。
如果你的應(yīng)用無(wú)法將targetSDK 降到23或者23以下,有以下兩種比較快捷的適配方式。
解決方式有2種:
1.改成動(dòng)態(tài)注冊(cè)。
2.使用ConnectivityManager.NetworkCallback 來(lái)監(jiān)聽(tīng)網(wǎng)絡(luò)。
第二種實(shí)現(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ò)可用的情況下的方法
}
});
很簡(jiǎn)單。
如果我們僅僅驗(yàn)證此廣播,無(wú)需申明任何權(quán)限即可收到此廣播消息,但是往往應(yīng)用還需要訪(fǎng)問(wèn)網(wǎng)絡(luò)等操作,需要申請(qǐng)以下網(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"/>
這幾個(gè)權(quán)限都不是危險(xiǎn)權(quán)限,直接申明即可。存在如果不申明android.permission.CHANGE_NETWORK_STATE 這個(gè)權(quán)限的時(shí)候,應(yīng)用報(bào)錯(cuò)的情況。
總結(jié)
1.如果應(yīng)用程序的targetSDK >= N,可以采用上述兩種方案解決此問(wèn)題,也就是說(shuō)靜態(tài)注冊(cè)android.net.conn.CONNECTIVITY_CHANGE不再起作用,需要修改成動(dòng)態(tài)注冊(cè)或者使用ConnectivityManager.NetworkCallback監(jiān)聽(tīng)網(wǎng)絡(luò)。
2.如果應(yīng)用程序的targetSDK<N,即使安裝在Android7.0機(jī)器上,同樣可以收到靜態(tài)注冊(cè)的廣播。