我没有测试是否,但从代码中可以看出两者都会被调用。
我使用 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。同样,它需要更仔细的查看,但这应该给你一个很好的起点。您也可以尝试使用模拟器进行模拟。