【问题标题】:Some devices don't receive UDP broadcasts when screen off某些设备在屏幕关闭时不接收 UDP 广播
【发布时间】:2013-10-30 03:34:42
【问题描述】:

我无法让运行 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。

【问题讨论】:

  • 你是在一个单独的线程中制作的,并且在屏幕关闭时线程还在运行吗?
  • 是的。我认为它仍在运行,它在 DDMS 的线程视图中,并且在屏幕关闭时似乎没有改变。它看起来和 TCP 监听线程一样。

标签: android udp broadcast wakelock


【解决方案1】:

有同样问题的其他人的更新:

Google 似乎认为这应该可以正常工作:

http://code.google.com/p/android/issues/detail?id=34278

Nexus One 太旧了,所以我想没人在乎。

但我在三星的开发者论坛上问过 Note 2。他们也不在乎:

http://developer.samsung.com/forum/board/thread/view.do?boardName=General&messageId=247968#postId247968

我目前的解决方法是在用户首选项中提供一个选项来获取完整的唤醒锁而不是部分唤醒锁。我添加了代码来覆盖我的 UI,黑屏在点击时消失;尽管背光仍然亮着,但这并不那么烦人,并且可以防止潜在的屏幕烧伤。关闭其他灯(电容式按钮)应该是可行的,但恕我直言,让用户知道他们的手机实际上仍处于完全唤醒状态是“好”的。
它会停止设备的正常锁屏超时。手动按下电源按钮将锁定但会关闭屏幕并因此停止接收 UDP,唤醒时锁定屏幕将永远保持打开状态,直到用户解锁。
所以这提供了糟糕的用户体验,但这是我发现的最好的。

欢迎提出任何建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多