天天看点

PhoneStateListener回调接口和Connectivity广播监听实际比较

平台:展讯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、实战中,最好可以双管齐下,同时获取二者的状态进行处理;