我有一个非常烦人的问题,我不明白发生了什么:
我们正在编写一个库,它通过蓝牙建立一个套接字。之后,我们在本地主机上注册一个服务器。现在有几个应用程序正在建立与本地主机的连接并发送/接收数据。服务器正在 bundle 连接并通过蓝牙处理通信。
我们从Android 7.0开始遇到这个问题; NetD
经常破坏我们到本地主机的套接字。我们可以在 Logcat 中看到以下输出:
> 06-23 12:38:17.576 522 2676 I Netd : Destroyed 3 sockets for UidRanges{ 10000-2147483647 } skip={1001 1027 10010 10013 10018 10021
> 10035 10037 10064 10081} in 1.2 ms
所有设备都运行 Stock Roms,我在以下方面对其进行了测试:
- 三星 S7
- 三星 S8
- 连结 5x
- 三星 S6
- 谷歌像素
我很确定,这是一种电池节省机制,因为它不会在设备充电时发生。
我希望任何人都可以帮助我了解这里发生的事情。
最佳答案
我认为问题出在 Android 6.0 API 级别 23 中引入的新 Doze
功能,enhanced in Android 7.0 .
Doze improves battery life by deferring CPU and network activities when a user leaves a device unplugged, stationary, and with the screen turned off. Android 7.0 brings further enhancements to Doze by applying a subset of CPU and network restrictions while the device is unplugged with the screen turned off, but not necessarily stationary, for example, when a handset is traveling in a user’s pocket.
打瞌睡限制
在打瞌睡时,以下限制适用于您的应用:
- 网络访问已暂停。
- 系统忽略唤醒锁。
- 标准的 AlarmManager 警报(包括 setExact() 和 setWindow())被推迟到下一个维护窗口。
- 如果您需要设置在打瞌睡时触发的警报,请使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()。
- 使用 setAlarmClock() 设置的闹钟会继续正常触发——系统会在这些闹钟触发前不久退出打盹模式。
- 系统不执行 Wi-Fi 扫描。
- 系统不允许同步适配器运行。
- 系统不允许JobScheduler运行
话虽如此,从技术上讲,您有两种选择 - 拥抱 Doze,与它抗争。
拥抱打瞌睡
查看Optimizing for Doze and App Standby
打瞌睡
dumpsys deviceidle disable
的组合,将 idle_to
和 max_idle_to
设置为 1 秒(并将相关的比例因子设置为 1)将有助于禁用它。引用这个xda-developers post .
关于java - 当设备未连接到充电器时,NetD 会销毁 socket ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44721418/