PhoneStateListener onSignalStrengthsChanged停止在服务中被调用

我正在写简单的应用程序包含两个元素 – 服务和活动。 活动仅用于启动和停止服务。 服务使用PhoneStateListener获取有关当前CellID,LAC和RSSI(信号强度)的信息并将其logging到文件中。

一切正常,而手机不睡觉。 我注意到,closures屏幕和几分钟的不活动后,我的PhoneStateListener不再被调用。 我尝试添加PARTIAL_WAKE_LOCK(和其他types的锁)到我的服务,但我想它会导致严重的电池消耗,不应该以这种方式使用。 另一方面,它并没有真正帮助我。 我另一个尝试是使用计时器和取消注册/注册我的PhoneStateListener在指定的时间间隔。 意外的是,看起来这种方式帮助刷新CellId和LAC(所以我想我的侦听器onCellLocationChanged()被调用),但信号强度仍然没有更新。

我没有尝试使用BroadcastReciever ,但经过一些挖掘话题和阅读线索,所以我不认为这会对我有用。

总结一下,我的问题是:为什么PhoneStateListener方法在手机处于睡眠状态时不会被调用? 有没有办法(比如强迫手机唤醒或使用不同的机制)来有效地克服这种行为?

Solutions Collecting From Web of "PhoneStateListener onSignalStrengthsChanged停止在服务中被调用"

当屏幕closures时,android停止通知关于单元格和信号的变化。 它通过禁用RIL级别上的URC通知来实现。 据我所知,如果不打开屏幕就无法获得更新。 广播接收机不会有任何不同的工作。

所以,如果这对你来说是可行的,那么我build议在你想检查这些值的时候打开屏幕。 您可以通过获取唤醒锁并提供标志来实现:ACQUIRE_CAUSES_WAKEUP | SCREEN_DIM_WAKE_LOCK

编辑:重新注册监听器实际上会触发位置改变被执行,但是它不会传递当前的单元格信息,只是屏幕closures之前的最后一个已知的单元格信息。 要获取当前的单元格信息,您仍然需要打开屏幕。

在开始时打电话:

 PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "call_lock"); 

最后:

 wakeLock.release(); 

你需要权限:

 <uses-permission android:name="android.permission.WAKE_LOCK" />