我无法让运行 4.1.2 的 Note 2 或运行 2.2 的 Nexus One 在屏幕关闭的情况下保持“足够清醒”以继续处理 UDP 广播数据包。我尝试了各种唤醒锁和权限(见下文),它在 2.3 上的 Desire HD、2.1 上的华为 U8110(T-Mobile 脉冲 mini)和 2.2.1 上的三星 Galaxy Mini 上运行良好。
它确实直接接收到其 IP/端口的新 TCP 连接并对其进行操作,但不广播 UDP 数据包。如果我点击电源按钮唤醒屏幕,它会立即响应广播。强制屏幕保持打开状态(PowerManager.SCREEN_DIM_WAKE_LOCK 或更高版本)确实让它一直在听,但这不切实际。
我正在获取唤醒锁:
powerManager.newWakeLock(PARTIAL_WAKE_LOCK)
wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL)
wifiManager.createMulticastLock()
并声明权限:
android.permission.INTERNET
android.permission.WAKE_LOCK
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.ACCESS_WIFI_STATE
android.permission.CHANGE_WIFI_STATE
系统 Wifi 睡眠策略是“从不”。
工作设备全部超时,但仍响应 UDP 广播。
在调试器的线程视图中,我可以看到它仍然在 DatagramSocket.receive() 处阻塞,而在工作设备上返回一个数据包,然后记录到 logcat。
所有设备都运行相同的 .apk。