1.WLAN
基础:
NetworkDashboardFragment.java => network_and_internet.xml
fragment : WifiSettings.java => WifiSettings2.java
controller :
final WifiMasterSwitchPreferenceController wifiPreferenceController = new WifiMasterSwitchPreferenceController(context, metricsFeatureProvider);
WLAN开关
WifiMasterSwitchPreferenceController.java
[implements] LifecycleObserver | OnResume | OnPause | OnStart | OnStop
创建 WifiEnabler 对象【很重要】
mWifiEnabler = new WifiEnabler( mContext, new MasterSwitchController(mWifiPreference), mMetricsFeatureProvider);WifiEnabler.java
包含 Switch开关 - SwitchWidgetController,可操控 isChecked | isEnabled
mSwitchWidget.setListener(this); //注册回调,回调:onSwitchToggled()
onSwitchToggled()=> 通过aidl,mWifiManager-开关Wifi注册广播接收器,收到
WifiManager.WIFI_STATE_CHANGED_ACTION后,更新Switch状态MasterSwitchController.java [extends SwitchWidgetController.java]
WLAN开关-Switch具体对应的PreferenceController
onPreferenceChange()=> switch状态变化时,会回调 WifiEnabler的onSwitchToggled (true|false)
public MasterSwitchController(MasterSwitchPreference preference) { mPreference = preference; }MasterSwitchPreference.java [extends RestrictedPreference.java]
WLAN开关-Switch具体对应的Preference
包含成员变量:Switch mSwitch
注册switch 的点击事件,并最终调用到
onPreferenceChange()
WifiSettings2-开关
WifiSettings2 : WLAN开关Preference,点击后跳转的Fragment
创建 WifiEnabler 【包括 switch开关 逻辑】
private WifiEnabler createWifiEnabler() { final SettingsActivity activity = (SettingsActivity) getActivity(); return new WifiEnabler( activity, new SwitchBarController(activity.getSwitchBar()), mMetricsFeatureProvider); }com.android.settings.widget 【包名,不是应用开发的 SwitchBar】 SwitchBar | SwitchBarController
SwitchBar.java
开关对象,注册监听,开启/关闭 swtich时,更新背景(绿/灰)
setTextViewLabelAndBackground() 【更新背景】
onCheckedChanged()=> 回调 SwitchBarController的
onSwitchChanged()=> 回调 mListener的
onSwitchToggled() 【WifiEnabler::onSwitchToggled()】SwitchBarController.java [ extends SwitchWidgetController.java ]
生命周期 startListening() => 注册回调接口
mSwitchBar.addOnSwitchChangeListener(this);
onSwitchChanged()=> 回调 mListener的onSwitchToggled()【注册回调和WLAN开关一样,在WifiEnabler中】
WifiSettings2-list展示
WifiSettings2.java
两个回调方法:
- onWifiStateChanged()
- onWifiEntriesChanged()
onWifiEntriesChanged() => updateWifiEntryPreferencesDelayed() 【显示进度条,异步执行Runnable任务】
=> 异步任务:【 updateWifiEntryPreferences() 】
已连接网络: mConnectedWifiEntryPreferenceCategory
- 点击事件: launchNetworkDetailsFragment ( pref )
- 跳转 WifiNetworkDetailsFragment2.java
WifiEntries: mWifiEntryPreferenceCategory
- 点击事件: connect() => ConfigureWifiEntryFragment.java => WifiConfigController2.java
- 触发
onWifiEntriesChanged(),从而更新两个 PreferenceCategory添加网络Pref点击事件: launchAddNetworkFragment()
wifi列表每个项:
- ConnectedWifiEntryPreference.java
- LongPressWifiEntryPreference.java
- WifiEntryPreference.java
2.已连接设备
connected_devices.xml
其他设备-USB
调用关系:
// ConnectedDeviceDashboardFragment.java use(ConnectedDeviceGroupController.class).init(this); // ConnectedDeviceGroupController.java // init()方法:创建一系列Updater对象(new): ConnectedBluetoothDeviceUpdater | ConnectedUsbDeviceUpdater | connectedDockUpdater // displayPreference()方法: mConnectedUsbDeviceUpdater.initUsbPreference(context); //创建Preference【usb连接的Preference】 //onStart()|onStop()中,注册|注销 BroadcastReceiver // ConnectedUsbDeviceUpdater.java // 构造方法 ConnectedUsbDeviceUpdater(Context context, DashboardFragment fragment, DevicePreferenceCallback devicePreferenceCallback, UsbBackend usbBackend) { mFragment = fragment; // ConnectedDeviceDashboardFragment mDevicePreferenceCallback = devicePreferenceCallback; //传入ConnectedDeviceGroupController,其实现了该接口 mUsbBackend = usbBackend; mUsbReceiver = new UsbConnectionBroadcastReceiver(context, mUsbConnectionListener, mUsbBackend); mMetricsFeatureProvider = FeatureFactory.getFactory(mFragment.getContext()) .getMetricsFeatureProvider(); } // initUsbPreference()方法,创建Preference //点击事件:跳转 UsbDetailsFragment new SubSettingLauncher(mFragment.getContext()) .setDestination(UsbDetailsFragment.class.getName()) .setTitleRes(R.string.device_details_title) .setSourceMetricsCategory(mFragment.getMetricsCategory()) .launch(); ////////////////////////// UsbDetailsFragment extends DashboardFragment{} // USB偏好设置页 /*【重要】*/UsbConnectionBroadcastReceiver extends BroadcastReceiver implements LifecycleObserver,OnResume,OnPause{} // UsbDetailsFragment中 使用 UsbConnectionBroadcastReceiver: this.getSettingsLifecycle().addObserver(mUsbReceiver); // 未使用过:疑问点 import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.core.lifecycle.events.OnResume;// USB 的用途 : 文件传输|USB网络共享|不进行数据传输... // UsbDetailsFragment.java : createControllerList()【赋值给成员变量:mControllers】 //mControllers: USB受控于: | USB的用途 ...[PreferenceCategory] new UsbDetailsFunctionsController(context, fragment, usbBackend); /*【重要】*/ UsbDetailsFunctionsController extends UsbDetailsController implements RadioButtonPreference.OnClickListener{}
UsbDetailsFunctionsController.java
创建 RadioButtonPreference :
UsbDetailsFunctionsController.java :
- 成员变量 FUNCTIONS_MAP : Map<Long,Integer> 【五个键值对,UsbManager.FUNCTION_NONE ...】
- refresh() =调用=> getProfilePreference() 【创建Preference,并add进 mProfilesContainer】
UsbDetailsFragment.java:
- 成员变量 mUsbConnectionListener:UsbConnectionBroadcastReceiver.UsbConnectionListener
- UsbConnectionListener 回调方法:
onUsbConnectionChanged();会调用controller.refresh() 【mControllers里取值】
UsbConnectionBroadcastReceiver.java:
收到广播后,调用
mUsbConnectionListener.onUsbConnectionChanged( mConnected, mFunctions, mPowerRole,mDataRole);
RadioButtonPreference 点击事件
UsbDetailsFunctionsController.java :: onRadioButtonClicked()
mUsbBackend对象:setCurrentFunctions() | getCurrentFunctions()mUsbManager.setCurrentFunctions(functions); mUsbManager.getCurrentFunctions();
UsbManager::setCurrentFunctions() ==具体实现==> UsbService::setCurrentFunctions()
=> UsbDeviceManager::setCurrentFunctions() 【mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS, functions);】
=> UsbDeviceManager::setEnabledFunctions(functions, false);
=> setUsbConfig()
=> setCurrentUsbFunctionsCb() 【内部类UsbGadgetCallback 的方法】
=> updateUsbStateBroadcastIfNeeded(functions);【发送广播 action: UsbManager.ACTION_USB_STATE】
config:
- 文件传输 【5
- USB网络共享 【33
- MIDI 【9
- PTP 【17
- 仅充电(不进行数据传输) 【1
//疑问:如何导入的类?
import android.hardware.usb.gadget.V1_0.IUsbGadget; import android.hardware.usb.gadget.V1_0.IUsbGadgetCallback;
新设备配对-蓝牙
<com.android.settingslib.RestrictedPreference android:key="add_bt_devices" android:title="@string/bluetooth_pairing_pref_title" android:fragment="com.android.settings.bluetooth.BluetoothPairingDetail" settings:controller="com.android.settings.connecteddevice.AddDevicePreferenceController"/>BluetoothPairingDetail
设备名称:BluetoothDeviceRenamePreferenceController.java 【onAttach() 中声明】
footer: mFooterPreference
可用的设备:
BluetoothProgressCategory mAvailableDevicesCategory;
生命周期:onAttach() => onActivityCreated() => onStart()
onStart() => updateBluetooth() => updateContent()
=> enableScanning() =...=> startScanning()
//开始扫描-停止扫描 void startScanning() { if (!mBluetoothAdapter.isDiscovering()) { mBluetoothAdapter.startDiscovery(); } } void stopScanning() { if (mBluetoothAdapter.isDiscovering()) { mBluetoothAdapter.cancelDiscovery(); } }搜索到的蓝牙设备:
搜索到蓝牙:发送广播
android.bluetooth.device.action.FOUNDBluetoothEventManager.java
【 内部类:BluetoothBroadcastReceiver】
- 收到广播,进行处理【handler.onReceive(context, intent, device);】
- intent中 保存有 BluetoothDevice对象(device)
【内部类:DeviceFoundHandler implements Handler】
onReceive()方法中,创建 CachedBluetoothDevice 对象
cachedDevice = mDeviceManager.addDevice(device);CachedBluetoothDeviceManager.java【mDeviceManager::addDevice()】
// BluetoothDevice:搜索到的蓝牙设备,表示新蓝牙设备 // CachedBluetoothDevice:平板已经缓存过的蓝牙设备 public CachedBluetoothDevice addDevice(BluetoothDevice device) { CachedBluetoothDevice newDevice; final LocalBluetoothProfileManager profileManager = mBtManager.getProfileManager(); synchronized (this) { newDevice = findDevice(device); //如果新设备已经是缓存过的蓝牙设备,返回null; //否则添加进mCachedDevices列表 if (newDevice == null) { newDevice = new CachedBluetoothDevice(mContext, profileManager, device); mHearingAidDeviceManager.initHearingAidDeviceIfNeeded(newDevice); if (!mHearingAidDeviceManager.setSubDeviceIfNeeded(newDevice)) { mCachedDevices.add(newDevice); mBtManager.getEventManager().dispatchDeviceAdded(newDevice); } } } return newDevice; }关键方法:
mBtManager.getEventManager().dispatchDeviceAdded(newDevice);调用回到 BluetoothEventManager::dispatchDeviceAdded()
void dispatchDeviceAdded(CachedBluetoothDevice cachedDevice) { for (BluetoothCallback callback : mCallbacks) { callback.onDeviceAdded(cachedDevice); } } //callback对象:BluetoothDeviceUpdaterDeviceListPreferenceFragment::onDeviceAdded()
public void onDeviceAdded(CachedBluetoothDevice cachedDevice) { ... if (mFilter.matches(cachedDevice.getDevice())) { createDevicePreference(cachedDevice); } }BluetoothPairingDetail.java 的onStart() 【注册callback对象[回调方法]】
//父类: DeviceListPreferenceFragment.java @Override public void onStart() { super.onStart(); if (mLocalManager == null || isUiRestricted()) return; mLocalManager.setForegroundActivity(getActivity()); mLocalManager.getEventManager().registerCallback(this); } // mLocalManager.getEventManager() 即获取 BluetoothEventManager对象 // registerCallback(this): BluetoothEventManager的mCallbacks列表添加元素 // 最终调用自己的 onDeviceAdded() 方法点击事件:DeviceListPreferenceFragment::onPreferenceTreeClick()
=> onDevicePreferenceClick(btPreference); => btPreference.onClicked(); //BluetoothDevicePreference.java