【发布时间】:2013-08-31 09:34:16
【问题描述】:
Android 是否会在本机方法运行时进入深度睡眠(CPU 睡眠)?
如果是这样,
本机方法能否使用 C 调用获取唤醒锁?
当有数据可用于阻塞套接字读取的本机方法时,手机会自动唤醒吗?
当有数据可用于阻塞 select 或 epoll 的本机方法时,手机会自动唤醒吗?
如果Android在本机方法调用期间不考虑休眠,我如何确保手机可以进入休眠状态,直到本机代码中创建的套接字之一准备好接收数据?
一些背景:
Android 网站的JNI tips 建议“Android 不会暂停执行本机代码的线程。如果正在进行垃圾收集,或者调试器已发出暂停请求,Android 将在下次进行 JNI 调用时暂停线程。” - 它似乎是对单个线程暂停的引用,而不是将手机置于暂停/睡眠模式。除此之外,我找不到任何关于挂起/睡眠行为的特定 cmets。
【问题讨论】:
-
我的怀疑是,代码在本机运行而不是在 dvm 下运行这一事实对睡眠行为没有影响 - 与此相关的任何内容都将在 UI 线程上交付,无论如何都必须正确处理。至于在接收到数据时唤醒,这实际上取决于特定网络接口在睡眠时的处理方式。像谷歌云消息这样花哨的东西应该会导致与其 API 一致的唤醒,但期望一些随机持久的 TCP 连接突然有流量来唤醒它似乎更令人怀疑,尽管在某些实现中可能有效?
标签: java android c sockets java-native-interface