android - PhoneStateListener onSignalStrengthsChanged 停止在服务中被调用

标签 android service

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

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

我没有尝试使用 BroadcastReciever,但在深入研究主题并阅读 SO 上的线程后,我认为它不适合我。

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

最佳答案

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

因此,如果对您来说可行,我建议您在需要检查这些值时打开屏幕。您可以通过获取唤醒锁并提供标志来做到这一点:ACQUIRE_CAUSES_WAKEUP | SCREEN_DIM_WAKE_LOCK

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

关于android - PhoneStateListener onSignalStrengthsChanged 停止在服务中被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8385372/

相关文章:

android - 使用android espresso访问自定义可扩展列表中的 child

android - Caused by : java. lang.OutOfMemoryError: Failed to allocate a 35624972 byte allocation with 4194304 free bytes and 28MB 直到OOM

android - Android中存储音频文件的目录

Android - 如果应用程序终止,远程服务也会终止

objective-c - 如何将Cocoa应用程序分解为可重用的功能部分?

android确定设备是否为从右到左的语言/布局

android - 下载线程中的 PARTIAL_WAKE_LOCK 与 SCREEN_DIM_WAKE_LOCK

service - CRM 2011使用C#连接到organization.svc

c# - Windows 服务可以在未登录的情况下启动应用程序吗?

javascript - 使用 Android 从 JavaScript 代码进行 AES 加密