Setting模块的热点
首先来说布局的加载
启动的lancher的activity是SettingActivity,这个Activity中的oncreate()方法的最后
else{
//No UP affordanceif we are displaying the main Dashboard
mDisplayHomeAsUpEnabled= false;
//Show Search affordance
mDisplaySearch= true;
mInitialTitleResId= R.string.dashboard_title;
switchToFragment(DashboardSummary.class.getName(),null,false,false,
mInitialTitleResId,mInitialTitle,false);
}
会去启动一个DashboardSummary,在这个Fragment的onResume()方法中的sendRebuildUI();
这个方法实际是在发送一个消息,在这个Fragment中创建了一个Handler,在不断的迭代消息,接收到消息后
执行rebuildUI(context);方法,这个方法中的
List<DashboardCategory>categories =
((SettingsActivity)context).getDashboardCategories(true);
然后在这个方法内部buildDashboardCategories(mCategories);这个方法内部
loadCategoriesFromResource(R.xml.dashboard_categories,categories,this);
加载布局,这个方法实际是去解析xml
总结:首先是创建了一个集合privateArrayList<DashboardCategory>mCategories=newArrayList<DashboardCategory>();然后遍历这个Xml,然后把属性放入这个集合。
回到这个rebuildUI(context)方法,newDashboardTileView对象,将集合中的数据添加到这个对象
最终每个选项会是一个DashboardTileView对象,在这个对象中自身有一个监听事件,进入不同的Fragment
首先这个热点这个在TetherSettings类中
在Oncreate方法中使用addPreferencesFromResource(R.xml.tether_prefs);这个方法中执行了
setPreferenceScreen(mPreferenceManager.inflateFromResource(getActivity(),
preferencesResId,getPreferenceScreen()));
这个方法中的参数mPreferenceManager.inflateFromResource(getActivity(),preferencesResId,getPreferenceScreen())
首先getPreferenceScreen()方法得到的是自定义控件,也就是R.xml.tether_prefs的的自定义控件
setPreferenceScreen()方法是在设置这个控件显示,
在这个R.xml.tether_prefs布局中有两个便携式wifi热点的控件,
<PreferenceScreenxmlns:android="http://schemas.android.com/apk/res/android">
<SwitchPreference
android:key="usb_tether_settings"
android:title="@string/usb_tethering_button_text" USB
android:persistent="false"/>
<SwitchPreference
android:key="enable_wifi_ap"
android:title="@string/wifi_tether_checkbox_text" 便携式Wifi热点
android:persistent="false"/>
<com.android.settings.HotspotPreference
android:key="enable_wifi_ap_ext"
android:title="@string/wifi_tether_checkbox_text" 便携式Wifi热点
android:persistent="false"/>
<Preference
android:key="wifi_ap_ssid_and_security"
android:title="@string/wifi_tether_configure_ap_text" 便携式WIFI设置
android:persistent="false"/>
<!-- -->
<SwitchPreference
android:key="enable_bluetooth_tethering"
android:title="@string/bluetooth_tether_checkbox_text" 蓝牙
android:persistent="false"/>
</PreferenceScreen>
通过判断显示那一个便携式wifi热点,相应的移除另一个
布局显示完后,
通过这个对象ConnectivityManager得到蓝牙wifiUSB的列表
mUsbRegexs= cm.getTetherableUsbRegexs();
mWifiRegexs= cm.getTetherableWifiRegexs();
mBluetoothRegexs= cm.getTetherableBluetoothRegexs();
根据相应列表的长度移除控件,根据mWifiApEnabler的值初始化便携式WIFI热点(没有卡)
最后得到配置的应用程序??
mProvisionApp= getResources().getStringArray(
com.android.internal.R.array.config_mobile_hotspot_provision_app);
在onstart()方法中注册广播,
最后更新状态,更新蓝牙和USB状态
updateState();
响应事件:
三个响应时间
蓝牙USB onPreferenceTreeClick(PreferenceScreen screen, Preferencepreference)
便携式WIFI onPreferenceChange(Preference preference, Object value)
便携式WIFI热点设置onPreferenceTreeClick()// onCreateDialog() onClick(DialogInterface dialogInterface,intbutton)
蓝牙USB
startProvisioningIfNecessary()
都会去执行这个方法,只是参数不同
在这个方法中会去startActivityForResult()或者这个startTethering()
在执行startActivityForResult()的回调方法onActivityResult()
当打开成功他会利用scheduleRecheckAlarm()方法开启TetherService
然后接着执行startTethering()这个方法,将控件打开
当打开失败时,他会将蓝牙或者USB开关关闭
便携式WIFI热点设置
跟上面一样也是在onPreferenceTreeClick()中去判断的
elseif(preference == mCreateNetwork){//
showDialog(DIALOG_AP_SETTINGS);
}
这个方法会去创建SettingsDialogFragment,并执行它的show方法,show方法是将这个创建的Fragment加入,在这个SettingsDialogFragment的oncreate()方法中回去创建一个WifiApDialog,创建的Dialog的代码在TetherSettings类中的onCreateDialog()方法中,这个方法创建了WifiApDialog,
弹出的对话框是WifiApDialog,在这个类中的如下方法解析Xml
protectedvoidonCreate(Bundle savedInstanceState) {
booleanmInit = true;
mView= getLayoutInflater().inflate(R.layout.wifi_ap_dialog,null);
Spinner mSecurity = ((Spinner)mView.findViewById(R.id.security));
mSsid= (TextView) mView.findViewById(R.id.ssid);//名称
mPassword= (EditText) mView.findViewById(R.id.password);//密码
SpinnermSecurity = ((Spinner) mView.findViewById(R.id.security));//安全性的下拉列表
finalSpinner mChannel = (Spinner)mView.findViewById(R.id.choose_channel);//频段的下拉列表
setButton(BUTTON_SUBMIT,context.getString(R.string.wifi_save), mListener);
setButton(DialogInterface.BUTTON_NEGATIVE,context.getString(R.string.wifi_cancel),mListener);//Dialog的按钮
当数据填写好后,用户点击保存会执行一个Onclick()方法,这个方法在TetherSettings类中
publicvoid onClick(DialogInterfacedialogInterface, int button) {
if(button == DialogInterface.BUTTON_POSITIVE){
mWifiConfig= mDialog.getConfig();
if(mWifiConfig!= null){
if(mWifiManager.getWifiApState()== WifiManager.WIFI_AP_STATE_ENABLED){
mWifiManager.setWifiApEnabled(null,false);
mWifiManager.setWifiApEnabled(mWifiConfig,true);
} else{
mWifiManager.setWifiApConfiguration(mWifiConfig);
}
intindex = WifiApDialog.getSecurityTypeIndex(mWifiConfig);
mCreateNetwork.setSummary(String.format(getActivity().getString(CONFIG_SUBTEXT),
mWifiConfig.SSID,
mSecurityType[index]));
}
}
}
从这段代码中我们可以看到利用WifiManager对象wifi热点进行设置,最后再更新这个wifi热点的值,
这个dialog中的数据全部存储在WifiConfiguration对象中,利用wifiMagener将WifiConfiguration对象传下去,在显示的时候得到这个对象就可以显示了。
对于preference控件有自己的存储数据的方法,自动保存
http://www.it165.net/pro/html/201410/23922.html