PhoneStateListener onSignalStrengthsChanged停止在Service中调用

时间:2011-12-05 12:33:51

标签: android service

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

手机没有睡觉时一切正常。我注意到在关闭屏幕和几分钟不活动后,我的PhoneStateListener不再被调用。我尝试将PARTIAL_WAKE_LOCK(以及其他类型的锁)添加到我的服务中,但我想这会导致严重的电池耗尽,不应该以这种方式使用。另一方面,它并没有真正帮助我。我的另一个尝试是使用Timer并在指定的时间间隔内注销/注册我的PhoneStateListener。出乎意料的是,看起来这种方式有助于刷新CellId和LAC(所以我猜测来自我的监听器的onCellLocationChanged()),但信号强度仍然没有更新。

我没有尝试使用BroadcastReciever,但是经过深入研究主题和阅读线索后,我不认为这对我有用。

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

2 个答案:

答案 0 :(得分:7)

当屏幕关闭时,android会停止通知细胞和信号变化。它是通过在RIL级别禁用URC通知来实现的。据我所知,如果不打开屏幕,就无法获得更新。广播接收器的工作方式不同。

因此,如果它对您来说很实用,我建议您在检查这些值时启用屏幕。您可以通过获取唤醒锁并提供标志来执行此操作:ACQUIRE_CAUSES_WAKEUP | SCREEN_DIM_WAKE_LOCK

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

答案 1 :(得分:1)

一开始就打电话:

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" />