当应用程序处于前台时,检测Android 7.0 Nougat上的连接更改

时间:2016-08-29 15:44:25

标签: android android-7.0-nougat

Nougat改变了它处理CONNECTIVITY_CHANGED意图的方式(基本上忽略了它,迫使开发人员使用作业调度程序)所以这让我感到疑惑:

如果我有一个正在检索某些数据的应用程序(我检查了手机在我执行请求时是否在线但是用户正在移动并且手机连接到不同的wifi接入点,例如)并且它失败了,我如何检测到连接已经恢复并且我会重新尝试取出数据?

所以在这种情况下我的应用程序在前台,我认为Chrome(用于Android)具有类似的功能。

我是否需要自己进行投票?或者当时是否允许某些事件?

4 个答案:

答案 0 :(得分:10)

虽然可以使用Andromeda的答案,但该解决方案并非Google的预期选择。您的问题是当连接丢失并且您需要在网络服务返回时恢复操作时该怎么做。

虽然CONNECTIVITY_CHANGE在技术上有效,但对于这个特定需求总是有点黑客攻击,一旦你的应用程序进入后台,它就会停止在Nougat工作。您真正应该使用的是作业调度程序API。 Google为我们提供了许多具有不同要求和功能的选项。

  1. 的jobscheduler
  2. 在Lollipop中添加了JobScheduler,并添加了一个可以等待网络连接来安排作业的调度程序。它甚至可以取决于连接类型,检查未计量或非漫游连接。此选项没有向后兼容性,但无需Google Play服务。

    1. GCM网络管理员
    2. GcmNetworkManager是Lollipop之前版本的JobScheduler功能的直接端口,但它需要Google Play服务。 Firebase Job Dispatcher已经大部分弃用了GcmNetworkManager。

      1. Firebase Job Dispatcher
      2. Firebase JobDispatcher提供了另一种方法来为Lollipop之前的版本安排作业,Lollipop默认使用Google Play服务,但可以配置为不需要此依赖项。

        1. 的WorkManager
        2. 我刚刚编辑了这篇文章,补充说Google用WorkManager取代了之前的三个作业调度程序,几乎在所有方面都优于其他作业调度程序。您可以为要运行的作业设置所需的网络类型。你甚至可以一个接一个地把工作连在一起。

          所有这些选项都将以电池友好的方式满足您的需求,即使设备从打盹模式中短暂唤醒,您的作业仍会安排。

          以下是Google提供的各种选项的更多信息:

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

答案 1 :(得分:5)

根据doc

针对Android 7.0(API级别24)及更高版本的应用如果在清单中声明其广播接收器,则不会收到CONNECTIVITY_ACTION广播。如果应用向CONNECTIVITY_ACTION注册BroadcastReceiver且该上下文仍然有效,则仍会收到Context.registerReceiver()次广播。

答案 2 :(得分:4)

正在运行的应用程序仍然可以在主线程上监听CONNECTIVITY_CHANGE,如果他们请求使用BroadcastReceiver进行通知。

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

答案 3 :(得分:0)

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