Android p 刷新wifi列表流程
1.WifiTracker.java:: 在广播接收器中接收到WifiManager.WIFI_STATE_CHANGED_ACTION,WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION,WifiManager.LINK_CONFIGURATION_CHANGED_ACTION,WifiManager.RSSI_CHANGED_ACTION这几种广播均会调用fetchScansAndConfigsAndUpdateAccessPoints ->updateAccessPoints(这里会将scanresult转换为accesspoint并进行排序)->conditionallyNotifyListeners->mListener.onAccessPointsChanged(WifiListenerExecutor::onAccessPointsChanged:: runAndLog(mDelegatee::onAccessPointsChanged,mDelegatee就是WifiListener,WifiListener::onAccessPointsChanged)
2.WifiSettings:: WifiSettings实现了WifiTracker.WifiListener,因此调用的是onAccessPointsChanged->updateAccessPointsDelayed->view.postDelayed(mUpdateAccessPointsRunnable, 300 /* delay milliseconds */)->updateAccessPointPreferences->final List accessPoints = mWifiTracker.getAccessPoints(返回return new ArrayList<>(mInternalAccessPoints),private final List mInternalAccessPoints = new ArrayList<>(),因此每刷新一次wifi列表,即调用一次updateAccessPointPreferences都会new accesspoint,都会走accesspoint构造函数)
3.AccessPoint:: public AccessPoint(Context context, Bundle savedState)->update(mConfig, mInfo, mNetworkInfo)->mAccessPointListener.onAccessPointChanged(this)
4.WifiSettings:: wifisettings实现了AccessPointListener接口,因此调用的是onAccessPointChanged->((AccessPointPreference) tag).refresh()
5.AccessPointPreference:: refresh(Updates the title and summary icon; may indirectly call notifyChanged()),刷新图标调用了updateIcon->mIconInjector.getIcon(level),比如wifi信号强度