亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android 7.0 監(jiān)聽網絡變化的示例代碼

 更新時間:2018年03月22日 13:51:58   作者:xingjm8511  
這篇文章主要介紹了Android 7.0 監(jiān)聽網絡變化的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Android7.0前,Android系統前網絡切換時,會發(fā)廣播,業(yè)務只要監(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設備前,當網絡切換時,能收到消息。而在Android7.0及以上設備,則無法收到。

Android7.0 行為變更上明確說明

Android 7.0 移除了三項隱式廣播,因為隱式廣播會在后臺頻繁啟動已注冊偵聽這些廣播的應用。刪除這些廣播可以顯著提升設備性能和用戶體驗。

為緩解這些問題,Android 7.0 應用了以下優(yōu)化措施:

面向 Android 7.0 開發(fā)的應用不會收到 CONNECTIVITY_ACTION 廣播,即使它們已有清單條目來請求接受這些事件的通知。在前臺運行的應用如果使用 BroadcastReceiver 請求接收通知,則仍可以在主線程中偵聽 CONNECTIVITY_CHANGE。
應用無法發(fā)送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 廣播。此項優(yōu)化會影響所有應用,而不僅僅是面向 Android 7.0 的應用。

解決辦法

1. 大家都知道,注冊廣播有兩種方式,一種是在AndroidManifest.xml中,另一種通過register方法。

Android文檔中描述,通過在AndroidManifest.xml中注冊方式,App在前后臺都無法接收到廣播。而通過register的方式,當App在運行時,是可以接收到廣播的。

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();
    }
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • android開發(fā)教程之卸載sd卡對MediaServer的處理

    android開發(fā)教程之卸載sd卡對MediaServer的處理

    Android中如果MediaServer訪問SD卡上的音頻文件,卸載SD卡的時候,就會kill掉MediaServer,卸載SD卡上必要條件就是沒有進程訪問SD卡上的資源文件。Kill掉MediaServer的進程后,MediaServer會重新啟動。
    2014-02-02
  • android 監(jiān)聽SD卡文件變化的實現代碼

    android 監(jiān)聽SD卡文件變化的實現代碼

    這篇文章主要介紹了android 監(jiān)聽SD卡文件變化的實現代碼,需要的朋友可以參考下
    2017-11-11
  • Flutter實現Text完美封裝

    Flutter實現Text完美封裝

    本文詳細講解了Flutter實現Text完美封裝,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以收藏下,方便下次瀏覽觀看
    2021-11-11
  • Kotlin淺析null操作方法

    Kotlin淺析null操作方法

    Kotlin對比于Java的一個最大的區(qū)別就是它致力于消除空引用所帶來的危險。在Java中,如果我們嘗試訪問一個空引用的成員可能就會導致空指針異常NullPointerException(NPE)的出現。在Kotlin語言中就解決了這個問題,下面來看看它是如何做到的
    2022-08-08
  • Android開發(fā)之使用通知欄顯示提醒信息的方法

    Android開發(fā)之使用通知欄顯示提醒信息的方法

    這篇文章主要介紹了Android開發(fā)之使用通知欄顯示提醒信息的方法,涉及Notification的使用及通知欄信息設置技巧,需要的朋友可以參考下
    2016-01-01
  • Android ListView出現異常解決辦法

    Android ListView出現異常解決辦法

    這篇文章主要介紹了Android ListView出現異常ListView:The content of the adapter has changed but ListView did not receive a notification解決辦法的相關資料,需要的朋友可以參考下
    2016-11-11
  • Android懸浮按鈕的使用方法

    Android懸浮按鈕的使用方法

    這篇文章主要為大家詳細介紹了Android懸浮按鈕的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • android圖像繪制(一)多種方法做圖像鏡像

    android圖像繪制(一)多種方法做圖像鏡像

    在android中做圖像鏡像有很多方法,今天算是學習了,感興趣的朋友可以參考下
    2013-01-01
  • Android SD卡上文件操作及記錄日志操作實例分析

    Android SD卡上文件操作及記錄日志操作實例分析

    這篇文章主要介紹了Android SD卡上文件操作及記錄日志操作的方法,涉及Android針對SD卡與文件操作的相關技巧,需要的朋友可以參考下
    2016-01-01
  • Android基礎之隱藏標題欄/設置為全屏/橫豎屏切換

    Android基礎之隱藏標題欄/設置為全屏/橫豎屏切換

    大家好,本篇文章主要講的是Android基礎之隱藏標題欄/設置為全屏/橫豎屏切換,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12

最新評論