Android:PhoneStateListener:onCellLocationChanged

Pan*_*hal 0 android cellid phone-state-listener

当我覆盖上面提到的函数,并记录CellLocation时,我收到以下值

[425,56301,-1]

当我漫游一下时,上面的值会变为

[425,56302,-1] 和 [425,56303,-1]

这些值代表什么?我认为56301是CellId.还有两个是什么?

kam*_*uel 7

由于CellLocation可以是GsmCellLocation或CdmaCellLocation,因此您必须查看这些类.

在您的情况下,您正在使用GsmCellLocation的实例,其"toString()"实现如下:

@Override
public String toString() {
    return "["+ mLac + "," + mCid + "," + mPsc + "]";
}
Run Code Online (Sandbox Code Playgroud)

我们可以得出结论:

  • 425 - LAC - 位置区号 - 这标识了您的终端当前所在的网络区域.Cellural网络由小区组成(即,一个基站处理一个小区),并且这些小区被分组为位置区域.每个区域都有它的标识符 - LAC.
  • 56302 - CID - 小区ID - 为您的设备提供服务的小区的标识符.
  • -1 - PSC - 主扰码 - 仅限UMTS.

关于LAC

位置区域是在蜂窝网络中定义的逻辑实体,用于减少网络中的信令流量.简而言之,位置区域是一组细胞.每个位置区域由LAC标识.

当你四处走动时,你的手机正在使用不同的基站.手机总是知道它可以使用哪个基站,因为手机经常测量信号电平.

例如:如果你在一个单元格A的范围内,然后你离开了,一些新的单元格会有更好的范围,你的手机会立即注意到.但它不应该通知网络这个事实,因为它会产生大量的信令数据(服务小区经常被改变).

另一方面,当有人打电话给你时会发生什么?网络必须通知您的手机.但它不知道手机在哪里.好吧,它可以向每个基站发送消息并通过无线电广播,但同样,这将是大量的信令流量.所以网络必须知道手机在这里.

所以,我们在这里有两股力量:

  1. 每次CID更改时电话都不应通知网络(因为信令流量很大)
  2. 网络不应该在每个小区中寻找电话(同样,大量的信令流量).

位置区域是一种在这里找到良好平衡的方法.

  1. 只有当位置区域(LAC)发生变化时,电话才会在每次CID更改时通知网络.
  2. 网络不会在一个国家/地区的每个小区中"寻呼"电话,而只会在给定位置区域的每个小区中"寻呼".