我正在编写包含两个元素的简单应用程序 - 服务和活动。活动仅用于启动和停止服务。服务用途PhoneStateListener
获取有关当前 CellID、LAC 和 RSSI(信号强度)的信息并将其记录到文件中。
当手机未休眠时一切正常。我注意到,关闭屏幕并闲置几分钟后,我的PhoneStateListener
不再被调用。我尝试将 PARTIAL_WAKE_LOCK (以及其他类型的锁)添加到我的服务中,但我想这会导致严重的电池消耗,不应该以这种方式使用。另一方面,它并没有真正帮助我。我的另一个尝试是使用计时器并取消注册/注册我的PhoneStateListener
在指定的时间间隔内。出乎意料的是,看起来这种方式有助于刷新 CellId 和 LAC(所以我猜onCellLocationChanged()
从我的听众那里被呼叫),但信号强度仍然没有更新。
我没有尝试使用BroadcastReciever
,但在深入研究主题并阅读 SO 上的线程之后,我认为这对我不起作用。
总而言之,我的问题是:为什么PhoneStateListener
手机睡眠时不调用方法?有什么方法(比如强制手机唤醒或使用不同的机制)来有效地克服这种行为?
当屏幕关闭时,Android 会停止通知手机和信号变化。它通过在 RIL 级别禁用 URC 通知来实现这一点。据我所知,不打开屏幕就无法获取更新。广播接收器的工作方式没有任何不同。
因此,如果对您来说实用,我建议您在想要检查这些值时打开屏幕。您可以通过获取唤醒锁并提供标志来做到这一点:ACQUIRE_CAUSES_WAKEUP | SCREEN_DIM_WAKE_LOCK
Edit:重新注册监听器实际上会触发要执行的位置更改,但它不会传递当前的单元格信息,只会传递屏幕关闭之前最后一个已知的单元格信息。要获取当前的小区信息,您仍然需要打开屏幕。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)