一、上层设置中关于GPS的显示逻辑
首先在Settings.java文件中的回调方法onBuildHeaders(List<Header> headers)中加载位于res/xml目录下的settings_headers.xml文件,该文件定义了所有设置选项,可以搜到id为location_settings的<header>标签,进而找到com.android.settings.LocationSettings类。在该类的createPreferenceHierarchy()方法中,加载了res/xml/location_settings.xml文件,并初始化了mNetWork、mGps和mAssistedGps等选项。
在回调函数onPreferenceTreeClick中,针对每一个选项进行点击处理,以mGps为例:
boolean enabled = mGps.isChecked();
Settings.Secure.setLocationProviderEnabled(getContentResolver(),
LocationManager.GPS_PROVIDER, enabled);
if (mAssistedGps != null) {
mAssistedGps.setEnabled(enabled);
}
由上代码我们可以知道,上层对于Gps的开关控制实际上就是向数据库中更新标识值。在LocationManagerService.java文件中的initialize()方法中有如下代码:
// listen for settings changes
ContentResolver resolver = mContext.getContentResolver();
Cursor settingsCursor = resolver.query(Settings.Secure.CONTENT_URI, null,
"(" + Settings.System.NAME + "=?)",
new String[]{Settings.Secure.LOCATION_PROVIDERS_ALLOWED},
null);
mSettings = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, mLocationHandler);
SettingsObserver settingsObserver = new SettingsObserver();
mSettings.addObserver(settingsObserver);
上段代码会从数据库中获取包含Settings.Secure.LOCATION_PROVIDERS_ALLOWED字段值(也就是上层修改的值)的Cursor,并会对其进行监听,该值的变化会触发回调函数update()进而调用updateProvidersLocked()方法。在此方法中会根据isEnabled和shouldBeEnabled这两个bool值来进行更新判断,其中isEnabled是通过native方法native_init()获得的,而shouldBeEnabled则是从Settings中获得。在mProvidersByName中取得对象并赋值给LocationProviderInterface接口类型的变量p,此时p实际上就是GpsLocationProvider类的对象,该类中会通过jni方式来与native层进行通信交互。
二、设置中AppWidget管理相关
系统自带的窗口小部件用于管理wifi连接、蓝牙和GPS开关等,其相关代码位于Settings/src/com/android/settings/widget/SettingsAppWidgetProvider.java类中,从Settings应用下的AndroidManifest.xml文件中可以发现SettingsAppWidgetProvider实际上是一个receiver,通过<meta-data>标签可以找到res/xml/appwidget_info.xml文件,该配置文件中定义了窗口小部件的基本信息,包括布局文件layout/widget.xml(仅是LinearLayout的嵌套)。
在SettingsAppWidgetProvider类中定义了BUTTON_WIFI、BUTTON_BRIGHTNESS、BUTTON_SYNC、BUTTON_GPS和BUTTON_BLUETOOTH五个私有静态int型成员变量,用来标识小部件对应项的id,在buildUpdate()中通过上述id注册对应监听,在onReceive()方法中会根据此id来进行触发响应。
该类中还有GpsStateTracker等内部类,对应实例化了的成员变量sGpsState等。在XXXStateTracker类中,会对窗口小部件对应的项进行状态追踪,以控制小部件的显示状态和对应的功能实现。
首先在Settings.java文件中的回调方法onBuildHeaders(List<Header> headers)中加载位于res/xml目录下的settings_headers.xml文件,该文件定义了所有设置选项,可以搜到id为location_settings的<header>标签,进而找到com.android.settings.LocationSettings类。在该类的createPreferenceHierarchy()方法中,加载了res/xml/location_settings.xml文件,并初始化了mNetWork、mGps和mAssistedGps等选项。
在回调函数onPreferenceTreeClick中,针对每一个选项进行点击处理,以mGps为例:
boolean enabled = mGps.isChecked();
Settings.Secure.setLocationProviderEnabled(getContentResolver(),
LocationManager.GPS_PROVIDER, enabled);
if (mAssistedGps != null) {
mAssistedGps.setEnabled(enabled);
}
由上代码我们可以知道,上层对于Gps的开关控制实际上就是向数据库中更新标识值。在LocationManagerService.java文件中的initialize()方法中有如下代码:
// listen for settings changes
ContentResolver resolver = mContext.getContentResolver();
Cursor settingsCursor = resolver.query(Settings.Secure.CONTENT_URI, null,
"(" + Settings.System.NAME + "=?)",
new String[]{Settings.Secure.LOCATION_PROVIDERS_ALLOWED},
null);
mSettings = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, mLocationHandler);
SettingsObserver settingsObserver = new SettingsObserver();
mSettings.addObserver(settingsObserver);
上段代码会从数据库中获取包含Settings.Secure.LOCATION_PROVIDERS_ALLOWED字段值(也就是上层修改的值)的Cursor,并会对其进行监听,该值的变化会触发回调函数update()进而调用updateProvidersLocked()方法。在此方法中会根据isEnabled和shouldBeEnabled这两个bool值来进行更新判断,其中isEnabled是通过native方法native_init()获得的,而shouldBeEnabled则是从Settings中获得。在mProvidersByName中取得对象并赋值给LocationProviderInterface接口类型的变量p,此时p实际上就是GpsLocationProvider类的对象,该类中会通过jni方式来与native层进行通信交互。
二、设置中AppWidget管理相关
系统自带的窗口小部件用于管理wifi连接、蓝牙和GPS开关等,其相关代码位于Settings/src/com/android/settings/widget/SettingsAppWidgetProvider.java类中,从Settings应用下的AndroidManifest.xml文件中可以发现SettingsAppWidgetProvider实际上是一个receiver,通过<meta-data>标签可以找到res/xml/appwidget_info.xml文件,该配置文件中定义了窗口小部件的基本信息,包括布局文件layout/widget.xml(仅是LinearLayout的嵌套)。
在SettingsAppWidgetProvider类中定义了BUTTON_WIFI、BUTTON_BRIGHTNESS、BUTTON_SYNC、BUTTON_GPS和BUTTON_BLUETOOTH五个私有静态int型成员变量,用来标识小部件对应项的id,在buildUpdate()中通过上述id注册对应监听,在onReceive()方法中会根据此id来进行触发响应。
该类中还有GpsStateTracker等内部类,对应实例化了的成员变量sGpsState等。在XXXStateTracker类中,会对窗口小部件对应的项进行状态追踪,以控制小部件的显示状态和对应的功能实现。