1

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

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

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

  • LTE 的变化会一直且只会触发onCellInfoChanged吗?
  • GSM/CDMA 更改是否会保留在较旧的回调中?
  • 一个与另一个重叠吗?(即 LTE 或 GS​​M/CDMA 都会触发旧的和新的。)

很可能不同的 OEM 会有不同的实现(叹气!),但我希望每个人都应该遵循一些指导方针。

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

谢谢, 塞布

4

1 回答 1

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。同样,它需要更仔细的查看,但这应该给你一个很好的起点。您也可以尝试使用模拟器进行模拟。

于 2014-01-28T08:05:43.023 回答