PhoneStateListener - 我对onCellInfoChanged有什么期望?

时间:2014-01-21 07:35:04

标签: android telephony phone-state-listener lte

我是在Android开发组上发布的。我希望我能在这里得到一些反馈。

PhoneStateListener的回调onCellLocationChangedonSignalStrengthsChanged是我想要处理GSM和CDMA中的小区和信号数据变化的goto方法。使用API​​ 17+,我可以看到有一个新的回调(onCellInfoChanged)用于处理单元格和信号的变化。

查看文档,我不清楚引入这个新回调可以得到什么。

  • LTE会一直变化,只会触发onCellInfoChanged吗?
  • GSM / CDMA是否会更换旧回调?
  • 是否与另一个重叠? (即新旧触发LTE或GSM / CDMA。)

很可能不同的OEM会有不同的实现(叹息!),但我希望每个人都应遵循这些指导原则。

任何人都可以对此有所了解吗?

谢谢, Sebouh

1 个答案:

答案 0 :(得分:0)

我没有测试是否但是从代码看起来它们都会被调用。

我使用SDK Manager下载了Android 4.3(API 18)的代码源。 以下观察使我认为两者都会被称为。 触发这些事件的类是:com.android.server.TelephonyRegistry

它通知听众:

public void listen(String pkgForDebug, IPhoneStateListener callback, int events, boolean notifyNow)

同一个函数以非独占方式调用这两种类型的通知(Location和CellInfo)。

第256行:

if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_LOCATION)) {
    try {
             if (DBG_LOC) Slog.d(TAG, "listen: mCellLocation=" + mCellLocation);
             r.callback.onCellLocationChanged(new Bundle(mCellLocation));
        } catch (RemoteException ex) {
             remove(r.binder);
        }
    }

即使在新的LTE手机上也会调用onCellLocationChanged,因为上述代码中没有任何内容可以阻止这种情况。这需要仔细检查没有上层过滤事件本身

在相同代码的第300行:

if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_INFO)) {
     try {
         if (DBG_LOC) Slog.d(TAG, "listen: mCellInfo=" + mCellInfo);
          r.callback.onCellInfoChanged(mCellInfo);
     } catch (RemoteException ex) {
          remove(r.binder);
     }
}

代码中还有其他东西看起来像CDMA将调用更新的API。例如,com.android.internal.telephony.cdma.CdmaLteServiceStateTracker似乎正在处理CDMA和LTE。再次,它需要更仔细的外观,但这应该给你一个良好的起点。 您也可以尝试使用模拟器模拟它。