平台:展讯8761;android版本:7.0
PhoneStateListener设置监听的方法(当然这里传subid的方法是系统隐藏的):
public void setPhoneListen(boolean isOpen) {
try {
if (mPhoneStateListener == null) {
int subid = TGTSystemManager.getSubId();
logd("subid=" + subid);
if (subid < ) {
subid = TGTSystemManager.getSubId();
logd("subid=" + subid);
}
mPhoneStateListener = new PhoneStateListener(subid){
@Override
public void onDataConnectionStateChanged(int state, int networkType) {
super.onDataConnectionStateChanged(state, networkType);
logd("state = " + state);
procedureDataState(state);
TGTConfig.networkTypeKeep = networkType <= ? TGTConfig.networkTypeKeep : networkType;
}
};
}
if (tm == null) {
tm = UniversalUtil.getTelephonyManager(App.getContext());
}
TGTConfig.dateStateKeep = -;
TGTConfig.networkTypeKeep = -;
if (isOpen) {
tm.listen(mPhoneStateListener,
PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
} else {
tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
}
} catch (Exception e) {
}
}
private void procedureDataState(int state){
//在这里处理数据连接的状态
}
注册Connectivity广播监听的方法:
private void registerReceiver(){
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
context.registerReceiver(mReceiver, filter);
}
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Bundle extras = intent.getExtras();
switch (action){
case ConnectivityManager.CONNECTIVITY_ACTION:
logd(action + "==>" + printBundle(extras));
break;
}
}
private String printBundle(Bundle bundle) {
StringBuilder sb = new StringBuilder();
for (String key : bundle.keySet()) {
if (key.equals(WifiManager.EXTRA_WIFI_STATE)) {
sb.append("{key:" + key + ", value:" + bundle.getInt(key)+"}");
} else {
sb.append("{key:" + key + ", value:" + bundle.get(key)+"}");
}
}
return sb.toString();
}
};
实测效果:
1、Connectivity广播发生在网络状态变更时,且每次注册就会立即受到一个状态,日志如下:
android.net.conn.CONNECTIVITY_CHANGE==>{key:networkInfo, value:[type: MOBILE[LTE], state: CONNECTED/CONNECTED, reason: (unspecified), extra: ctlte, failover: false, available: true, roaming: false, metered: false]}{key:networkType, value:0}{key:inetCondition, value:0}{key:extraInfo, value:ctlte}
2、PhoneStateListener每次注册也会立即有状态回调,且每次有很多重复的状态回调;
3、PhoneStateListener比Connectivity广播的速度快,也就说先收到,但是Connectivity广播过来往往意味着网络实际可用;
4、实战中,最好可以双管齐下,同时获取二者的状态进行处理;