我是在Android开发组上发布的。我希望我能在这里得到一些反馈。
PhoneStateListener
的回调onCellLocationChanged
和onSignalStrengthsChanged
是我想要处理GSM和CDMA中的小区和信号数据变化的goto方法。使用API 17+,我可以看到有一个新的回调(onCellInfoChanged
)用于处理单元格和信号的变化。
查看文档,我不清楚引入这个新回调可以得到什么。
onCellInfoChanged
吗?很可能不同的OEM会有不同的实现(叹息!),但我希望每个人都应遵循这些指导原则。
任何人都可以对此有所了解吗?
谢谢, Sebouh
答案 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。再次,它需要更仔细的外观,但这应该给你一个良好的起点。 您也可以尝试使用模拟器模拟它。