簡體   English   中英

當應用程序處於前台時,檢測Android 7.0 Nougat上的連接更改

[英]Detect connectivity changes on Android 7.0 Nougat when app is in foreground

Nougat改變了它處理CONNECTIVITY_CHANGED意圖的方式(基本上忽略它,迫使開發人員使用作業調度程序)所以這讓我感到疑惑:

如果我有一個正在檢索某些數據的應用程序(我檢查了手機是否在線時,我做了請求,但用戶在移動,手機連接到不同的WiFi接入點,例如)它失敗了,我如何檢測到連接已經恢復並且我重新嘗試取出數據?

所以在這種情況下我的應用程序在前台,我認為Chrome(用於Android)具有類似的功能。

我需要自己輪詢嗎? 或者當時是否允許某些事件?

雖然可以使用Andromeda的答案,但該解決方案並非谷歌的預期選擇。 您的問題是當連接丟失並且您需要在網絡服務返回時恢復操作時該怎么辦。

雖然CONNECTIVITY_CHANGE在技術上有效,但對於這個特定的需求來說總是有點破解,一旦你的應用程序進入后台,它就會停止在Nougat中工作。 您真正應該使用的是作業調度程序API。 Google為我們提供了許多具有不同要求和功能的選項。

  1. 的jobscheduler

在Lollipop中添加了JobScheduler並添加了一個調度程序,可以等待網絡連接來安排作業。 它甚至可以取決於連接類型,檢查未計量或非漫游連接。 此選項沒有向后兼容性,但無需Google Play服務。

  1. GCM網絡管理員

GcmNetworkManager是Lollipop之前版本的JobScheduler功能的直接端口,但它需要Google Play服務。 Firebase Job Dispatcher主要棄用了GcmNetworkManager。

  1. Firebase Job Dispatcher

Firebase JobDispatcher提供了另一種方法來為Lollipop之前的版本安排作業,Lollipop默認使用Google Play服務,但可以配置為不需要此依賴項。

  1. WorkManager中

我剛剛編輯了這篇文章,補充說谷歌用WorkManager替換了以前的三個作業調度程序,幾乎在所有方面都優於其他作業調度程序。 您可以為要運行的作業設置所需的網絡類型。 你甚至可以一個接一個地把工作連在一起。

所有這些選項都將以電池友好的方式滿足您的需求,即使設備從打盹模式中短暫喚醒,您的工作仍將安排。

以下是Google提供的各種選項的更多信息:

https://developer.android.com/topic/performance/scheduling.html https://developer.android.com/topic/performance/background-optimization.html#sched-jobs

根據文件

針對Android 7.0(API級別24)及更高級別的應用,如果他們在清單中聲明其廣播接收器,則不會收到CONNECTIVITY_ACTION廣播。 如果應用程序使用Context.registerReceiver()注冊其BroadcastReceiver並且該上下文仍然有效,則仍會收到CONNECTIVITY_ACTION廣播。

正在運行的應用程序仍然可以在主線程上偵聽CONNECTIVITY_CHANGE ,如果它們請求使用BroadcastReceiver進行通知。

https://developer.android.com/about/versions/nougat/android-7.0-changes.html

在我的情況下,我已經使用服務中的CONNECTIVITY_CHANGE過濾器訂閱廣播並且它正在工作。

如何讓Service保持活力是另一回事:)

public class ConnectivityReceiver
{

public static boolean getWifiStatus(Context context)
{
    // To get System Connectivity status
    ConnectivityManager cm = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);


    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    if (null != activeNetwork)
    {
        // Check For Wifi Status
        if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
            return true;
        else
            return false;
    }

    return false;
}

public class NetworkMgr extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    ConnectivityReceiver cf = new ConnectivityReceiver();
    boolean status = cf.getWifiStatus(context);

    if(status)
    {
        Toast.makeText(context,"Wifi Connection is On.", Toast.LENGTH_SHORT).show();
    }
    else
    {
        Toast.makeText(context,"Wifi Connection is Off.", Toast.LENGTH_SHORT).show();
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM