Android Settings(系统设置)源码分析(一)

由于工作需求,经常要用到系统设置中的一些功能,如调用里面的一些屏保、屏幕缩放、分辨率、音频输出模式等等接口和数据,于是决定对Settings(版本:Android4.4.4)源码做一个大体的分析。

先上一张平时经常接触到的界面,即
系统设置(Settings)界面:

上面是4.2版本的,4.4的和它差不多

Settings源码位于android系统packages/apps目录下,由系统编译。

找到Settings的AndroidManifest.xml文件,找到程序入口,如下图:

发现Settings的启动类是Settings.java,如下图:

可以看出,Settings继承了PreferenceActivity,关于PreferenceActivity,可以google或者参考API。

从上面Settings的界面可以看出,左边是一些tab,右面分别是各个tab对应的内容。

进一步发现,Settings的主界面布局加载地方如下:

在资源文件xml文件夹中找到settings_headers.xml这个文件,打开如下:

内容比较多,只截取部分代码,可以看出,布局采用的是Preference Headers嵌套,左边的tab对应的都是一些相应的header
,右边的内容即为header的内容,分别对应的是一个个fragment。

至于onBuildHeaders(List<Header> headers)方法中的updateHeaderList(headers)方法有什么用呢?如下图:

找到这个方法,如下图:

它的作用是,会根据当前平台是否支持某项feature,决定是否显示相应的header。

Android 3.0之后,摒弃了传统的 PreferenceScreen
嵌套方法,而是采用了所谓的Preference Headers
方法,该方法的要点是:在主屏中通过 headers xml
文件布局列出所有的主题设置项,而每个主题设置的详细设置则由各自指定的 PreferenceFragment
负责,而各自的 PreferenceFragment
可以如传统的PreferenceActivity一样布局自身的 PreferenceScreen。

另外,为了能够显示出 headers
中的布局列表,需要在继承的PreferenceActivity
类中实现 onBuildHeaders()
回调方法:

     @Override
     public voidonBuildHeaders(List<Header> target) {
         loadHeadersFromResource(R.xml.preference_headers, target);
     }

优点:

方便同一个应用在不同屏幕大小的设备中进行适配,比如,采用 preference headers
布局之后,系统设置应用在 phone
和 pad
中的显示方式分别为分页显示和同一页面显示;采用 headers
可以降低 preference
布局文件的耦合度,把原本需要写在同一个xml文件中的布局各自独立开来,各自进行控制和维护而互不影响。

时间: 2024-10-08 15:37:29

Android Settings(系统设置)源码分析(一)的相关文章

Android 开源项目源码分析第一期正式发布

由 Trinea 发起.几十名 Android 开发者参与的Android 开源项目源码分析第一期正式发布. 从简介.总体设计.流程图.详细设计全方面分析开源库源码,第一期包括 10 个著名开源库及 5 个公共技术点的全面介绍. 分析文档 作者 Volley 源码解析 grumoon Universal Image Loader 源码分析 huxian99 Dagger 源码解析 扔物线 EventBus 源码解析 Trinea xUtils 源码解析 Caij ViewPagerindicat

android 网络框架 源码分析

android 网络框架 源码分析 导语: 最近想开发一个协议分析工具,来监控android app 所有的网络操作行为, 由于android 开发分为Java层,和Native层, 对于Native层我们只要对linux下所有网络I/O接口进行拦截即可,对于java 层,笔者对android 网络框架不是很了解,所以这个工具开发之前,笔者需要对android 的网络框架进行一个简单的分析. 分析结论: 1. android 的网络框架都是基于Socket类实现的 2. java 层Socket

Android -- 消息处理机制源码分析(Looper,Handler,Message)

android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道,因此我没将其作为核心类.下面一一介绍: Looper Looper的字面意思是“循环者”,它被设计用来使一个普通线程变成Looper线程.所谓Looper线程就是循环工作的线程.在程序开发中(尤其是GUI开发中),我们经常会需要一个线程不断循环,一旦有新任务则执行,执行完继续等待下一个任务,这就是Lo

子墨庖丁Android的ActionBar源码分析 (一)实例化

如果你从事过Android客户端开发,相信你对ActionBar这套框架并不陌生,或者说你并不了解它,但是你应该时不时的要跟它打交道.抛开ActionBar的实现不说,ActionBar实际上是对Android的TitleBar行为的抽象,这种框架可以适用于这种模式的应用,是对需要的行为视图的抽象.当然或许你也和我一样,对ActionBar的实现效率并不满意,因为你打开它的视图,你会发现它的实现非常的ugly.不过我们庆幸的看到的是,ActionBar在设计的时候就并不是以一个强类型的姿态存在,

Android网络框架源码分析一---Volley

转载自 http://www.jianshu.com/p/9e17727f31a1?utm_campaign=maleskine&utm_content=note&utm_medium=mobile_author_hots&utm_source=recommendation 公司最近新起了一个项目,对喜欢尝鲜的我们来说,好处就是我们可以在真实的项目中想尝试一些新技术,验证想法.新项目对网络框架的选取,我们存在三种方案: 1.和我们之前的项目一样,使用Loader + HttpCli

Android分包MultiDex源码分析

概述 Android开发者应该都遇到了64K最大方法数限制的问题,针对这个问题,google也推出了multidex分包机制,在生成apk的时候,把整个应用拆成n个dex包(classes.dex.classes2.dex.classes3.dex),每个dex不超过64k个方法.使用multidex,在5.0以前的系统,应用安装时只安装main dex(包含了应用启动需要的必要class),在应用启动之后,需在Application的attachBaseContext中调用MultiDex.i

[Android]简略的Android消息机制源码分析

相关源码 framework/base/core/java/andorid/os/Handler.java framework/base/core/java/andorid/os/Looper.java framework/base/core/java/andorid/os/Message.java framework/base/core/java/andorid/os/MessageQueue.java libcore/luni/src/main/java/java/lang/ThreadLo

Android消息机制源码分析

本篇主要介绍Android中的消息机制,即Looper.Handler是如何协同工作的: Looper:主要用来管理当前线程的消息队列,每个线程只能有一个Looper Handler:用来将消息(Message)插入到当前线程的消息队列,并负责分发Looper中的消息,将消息发送到当前线程执行 具体关系图如下所示: 接下来我们来分析一下Looper和Handler的源码,了解一下其中的奥妙. 首先我们从一个程序运行的入口来分析,源码如下: public static void main(Stri

Android init进程——源码分析

概述 Android本质上是一个基于Linux内核的开源操作系统,与我现在用的Ubuntu系统类似,但是所有的Android设备都是运行在ARM处理器(ARM源自进阶精简指令集机器,源自ARM架构)上,而像Ubuntu操作系统是x86(x86是一系列的基于intel 8086 CPU计算机微处理器指令集架构)系统.不过既然Android也是基于Linux内核的系统,那么基本的启动过程也应该符合Linux的规则.下图基本描述了当你按下电源开关后Android设备的执行步骤: 一个完整的Linux系