2

我正在开发一个在运行 Android 7.0 的特定平板电脑上使用的应用程序。我正在使用 aService发送周期性DatagramPackets。我只能使用移动网络ConnectivityManager我使用和检查连接NetworkInfo状态DetailedState。我使用以下代码获取网络状态:

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
DetailedState networkState = activeNetwork.getDetailedState();
  • 如果平板电脑已插入并且屏幕打开或关闭,我将获得CONNECTED状态。
  • 如果桌面被拔掉并且屏幕打开,我会得到 CONNECTED 状态。
  • 如果桌面被拔掉并且屏幕关闭,我会进入BLOCKED状态。

在我的平板电脑中,流量节省程序已关闭。以防万一,我已经运行测试以验证屏幕关闭时没有限制,即使网络被阻塞,cm.getRestrictBackgroundStatus()总是返回 1,即RESTRICT_BACKGROUND_STATUS_DISABLED 。

那么,为什么网络被封锁了呢?我的应用程序需要特殊权限吗?我的平板电脑需要特殊配置吗?

4

2 回答 2

1

这是正常行为。当您的屏幕被锁定时,它会使用打盹模式。打盹模式关闭互联网通信和所有后台服务。您需要唤醒您的设备,然后才能使用互联网进行所有操作。文件资料

于 2020-07-22T14:48:34.800 回答
1

为了提供完整的解决方案,我将回答我的问题。

为什么网络被封锁?

正如 Stanislav Kireev 提供的文档所指出的,这种BLOCKED网络状态的发生是因为设备处于打盹状态。此设备状态不允许从 Android 6.0(API 级别 23)开始访问互联网。

但是文档还说“系统提供了一个可配置的应用程序白名单,这些应用程序部分免于打盹和应用待机优化”。有关更详细的说明,您可以阅读对其他用例的支持部分。您可以通过代码或配置系统将您的应用添加到白名单中。

我的应用程序需要特殊权限吗?

如果您需要从代码中将您的应用添加到白名单,您需要在清单文件中添加权限:

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>

并将此代码添加到您的活动中:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    String packageName = getPackageName();
    PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
    if (!pm.isIgnoringBatteryOptimizations(packageName)) {
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
        intent.setData(Uri.parse("package:" + packageName));
        startActivity(intent);
    }
}

我从这个答案中得到了这个解决方案。

我的平板电脑需要特殊配置吗?

如果需要,您可以从Settings > Battery > 3 dot > Battery optimization添加您的应用。在选择列表中选择所有应用,选择您的应用并选择不优化选项。

我从这个答案中得到了这个解决方案(它有更详细的解释)。

于 2020-07-24T14:39:07.197 回答