Android 7.0 監(jiān)聽網(wǎng)絡(luò)變化的示例代碼
Android7.0前,Android系統(tǒng)前網(wǎng)絡(luò)切換時(shí),會(huì)發(fā)廣播,業(yè)務(wù)只要監(jiān)聽廣播即可。
public class NetChangeReceiver extends BroadcastReceiver {
private static final String ANDROID_NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equalsIgnoreCase(ANDROID_NET_CHANGE_ACTION)){
Toast.makeText(context, "Net Changed", Toast.LENGTH_SHORT).show();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.outman.example.androidtest">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".NetChangeReceiver">
<intent-filter >
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
</application>
</manifest>
上面代碼,在Android7.0設(shè)備前,當(dāng)網(wǎng)絡(luò)切換時(shí),能收到消息。而在Android7.0及以上設(shè)備,則無(wú)法收到。
Android7.0 行為變更上明確說(shuō)明
Android 7.0 移除了三項(xiàng)隱式廣播,因?yàn)殡[式廣播會(huì)在后臺(tái)頻繁啟動(dòng)已注冊(cè)偵聽這些廣播的應(yīng)用。刪除這些廣播可以顯著提升設(shè)備性能和用戶體驗(yàn)。
為緩解這些問(wèn)題,Android 7.0 應(yīng)用了以下優(yōu)化措施:
面向 Android 7.0 開發(fā)的應(yīng)用不會(huì)收到 CONNECTIVITY_ACTION 廣播,即使它們已有清單條目來(lái)請(qǐng)求接受這些事件的通知。在前臺(tái)運(yùn)行的應(yīng)用如果使用 BroadcastReceiver 請(qǐng)求接收通知,則仍可以在主線程中偵聽 CONNECTIVITY_CHANGE。
應(yīng)用無(wú)法發(fā)送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 廣播。此項(xiàng)優(yōu)化會(huì)影響所有應(yīng)用,而不僅僅是面向 Android 7.0 的應(yīng)用。
解決辦法
1. 大家都知道,注冊(cè)廣播有兩種方式,一種是在AndroidManifest.xml中,另一種通過(guò)register方法。
Android文檔中描述,通過(guò)在AndroidManifest.xml中注冊(cè)方式,App在前后臺(tái)都無(wú)法接收到廣播。而通過(guò)register的方式,當(dāng)App在運(yùn)行時(shí),是可以接收到廣播的。
Note: A BroadcastReceiver registered with Context.registerReceiver() continues to receive these broadcasts while the app is running.
public class MainActivity extends Activity {
private NetChangeReceiver netChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
netChangeReceiver = new NetChangeReceiver();
registerReceiver(netChangeReceiver, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(netChangeReceiver);
}
}
2. 提供了一種更穩(wěn)定的方式
Monitoring Network Connectivity While the App is Running
Apps that are running can still listen for CONNECTIVITY_CHANGE with a registered BroadcastReceiver. However, the ConnectivityManager API provides a more robust method to request a callback only when specified network conditions are met.NetworkRequest objects define the parameters of the network callback in terms of NetworkCapabilities. You create NetworkRequest objects with the NetworkRequest.Builder class. registerNetworkCallback() then passes the NetworkRequest object to the system. When the network conditions are met, the app receives a callback to execute the onAvailable() method defined in its ConnectivityManager.NetworkCallback class.
The app continues to receive callbacks until either the app exits or it calls unregisterNetworkCallback().
public class MainActivity extends Activity {
private ConnectivityManager.NetworkCallback networkCallback;
private ConnectivityManager connectivityManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
networkCallback = new NetworkCallbackImpl();
NetworkRequest.Builder builder = new NetworkRequest.Builder();
NetworkRequest request = builder.build();
connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
connectivityManager.registerNetworkCallback(request, networkCallback);
}
@Override
protected void onDestroy() {
super.onDestroy();
connectivityManager.unregisterNetworkCallback(networkCallback);
}
private class NetworkCallbackImpl extends ConnectivityManager.NetworkCallback {
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
Toast.makeText(getBaseContext(), "onAvailable", Toast.LENGTH_SHORT).show();
}
@Override
public void onLosing(Network network, int maxMsToLive) {
super.onLosing(network, maxMsToLive);
Toast.makeText(getBaseContext(), "onLosing", Toast.LENGTH_SHORT).show();
}
@Override
public void onLost(Network network) {
super.onLost(network);
Toast.makeText(getBaseContext(), "onLost", Toast.LENGTH_SHORT).show();
}
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities);
Toast.makeText(getBaseContext(), "onCapabilitiesChanged", Toast.LENGTH_SHORT).show();
}
@Override
public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
super.onLinkPropertiesChanged(network, linkProperties);
Toast.makeText(getBaseContext(), "onLinkPropertiesChanged", Toast.LENGTH_SHORT).show();
}
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android利用MPAndroidChart繪制曲線圖表的基礎(chǔ)教程
最近在項(xiàng)目中要用到曲線圖,于是在網(wǎng)上找了很多很多,有AChartengine,MPAndroidChart,helloChart等等,我還用過(guò)基于html5的jsChart來(lái)做過(guò),不過(guò)最終還是選擇了MPAndroidChart來(lái)做本文介紹了Android利用MPAndroidChart繪制曲線圖表的基礎(chǔ)教程,需要的朋友可以參考下。2018-03-03
Android仿QQ、新浪相冊(cè)的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android仿QQ、新浪相冊(cè)的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
Android使用SoundPool實(shí)現(xiàn)播放音頻
這篇文章主要為大家詳細(xì)介紹了Android使用SoundPool實(shí)現(xiàn)播放音頻,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
Android開發(fā)中DatePicker日期與時(shí)間控件實(shí)例代碼
本文通過(guò)實(shí)例代碼給大家介紹了Android開發(fā)中DatePicker日期與時(shí)間控件,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-08-08
SQLiteStudio優(yōu)雅調(diào)試Android手機(jī)數(shù)據(jù)庫(kù)Sqlite(推薦)
這篇文章主要介紹了SQLiteStudio優(yōu)雅調(diào)試Android手機(jī)數(shù)據(jù)庫(kù)Sqlite的相關(guān)資料,需要的朋友可以參考下2017-11-11
OpenHarmony實(shí)現(xiàn)屏幕亮度動(dòng)態(tài)調(diào)節(jié)方法詳解
大家在拿到dayu之后,都吐槽說(shuō),會(huì)經(jīng)常熄屏,不利于調(diào)試,那么有沒有一種辦法,可以讓app不熄屏呢,答案是有的,今天我們就來(lái)揭秘一下,如何控制屏幕亮度2022-11-11
Android RecyclerView詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了Android RecyclerView詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-01-01
Android編程實(shí)現(xiàn)抽屜效果的方法詳解
這篇文章主要介紹了Android編程實(shí)現(xiàn)抽屜效果的方法,結(jié)合具體實(shí)例形式分析了Android實(shí)現(xiàn)抽屜效果的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-05-05

