梳理WiFi的流程
直接参考设置中WiFi的流程
启动设置
am start com.android.settings/.Settings
先梳理设置中代码结构
选自设置中对WiFi操作的步骤
private WifiManager mWifiManager;
mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
frameworks/base/wifi/java/android/net/wifi/WifiManager.java
IWifiManager mService;
public WifiManager(Context context, IWifiManager service) {
mContext = context;
mService = service;
init();
}
WifiManager的核心是IWifiManager接口,通过Binder在服务端实现
public final class WifiService extends IWifiManager.Stub
展开Context的一系列调用,WiFi服务是如何注册的
//Context.java
public abstract Object getSystemService(String name);
//ContextImp.java
@Override
public Object getSystemService(String name) {
ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name);
return fetcher == null ? null : fetcher.getService(this);
}
private static final HashMap<String, ServiceFetcher> SYSTEM_SERVICE_MAP =
new HashMap<String, ServiceFetcher>();
private static void registerService(String serviceName, ServiceFetcher fetcher) {
if (!(fetcher instanceof StaticServiceFetcher)) {
fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++;
}
SYSTEM_SERVICE_MAP.put(serviceName, fetcher);
}
registerService(WIFI_SERVICE, new ServiceFetcher() {
public Object createService(ContextImpl ctx) {
IBinder b = ServiceManager.getService(WIFI_SERVICE);
IWifiManager service = IWifiManager.Stub.asInterface(b);
return new WifiManager(ctx.getOuterContext(), service);
}});
protected void startWifiService(int factoryTest) {
boolean disableNetwork = SystemProperties.getBoolean("config.disable_network", false);
if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
if (!disableNetwork) {
try {
Slog.i(TAG, "Wi-Fi Service");
wifi = new WifiService(context);
ServiceManager.addService(Context.WIFI_SERVICE, wifi);
} catch (Throwable e) {
reportWtf("starting Wi-Fi Service", e);
}
try {
Slog.i(TAG, "Connectivity Service");
connectivity = new ConnectivityService(
context, networkManagement, networkStats, networkPolicy);
ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);
networkStats.bindConnectivityManager(connectivity);
networkPolicy.bindConnectivityManager(connecti