基于修改原生设置Widget的总结文档

一、上层设置中关于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类中,会对窗口小部件对应的项进行状态追踪,以控制小部件的显示状态和对应的功能实现。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值