我正在编写包含两个元素的简单应用程序-服务和 Activity 。 Activity 仅用于启动和停止服务。服务使用PhoneStateListener
获取有关当前CellID,LAC和RSSI(信号强度)的信息,并将它们记录到文件中。
手机不 sleep 时,一切正常。我注意到在关闭屏幕和几分钟不 Activity 之后,我的PhoneStateListener
不再被调用。我尝试将PARTIAL_WAKE_LOCK(以及其他类型的锁)添加到我的服务中,但是我猜想这会导致严重的电池消耗,因此不应以这种方式使用。另一方面,它并没有真正帮助我。我的另一种尝试是使用Timer并以指定的时间间隔注销/注册我的PhoneStateListener
。出乎意料的是,这种方式似乎有助于刷新CellId和LAC(因此我想调用了来自我的监听器的onCellLocationChanged()
),但信号强度仍未更新。
我没有尝试使用BroadcastReciever
,但是在深入研究主题并阅读了SO上的线程后,我认为这对我不起作用。
总而言之,我的问题是:为什么手机在 sleep 状态下不调用PhoneStateListener
方法?有什么方法(例如强制电话唤醒或使用其他机制)有效地克服此行为?
最佳答案
当屏幕关闭时,Android会停止通知有关单元格和信号更改的信息。通过在RIL级别禁用URC通知来实现。据我所知,不打开屏幕就无法获取更新。广播接收器不会有任何不同的工作。
因此,如果您愿意,我建议您在每次检查这些值时都打开屏幕。您可以通过获取唤醒锁并提供标志来做到这一点:ACQUIRE_CAUSES_WAKEUP | SCREEN_DIM_WAKE_LOCK
编辑:重新注册监听器实际上会触发位置更改的执行,但是它不会传递当前的单元格信息,只会传递屏幕关闭之前的最后一个已知的单元格信息。要获取当前的单元格信息,您仍然需要打开屏幕。