android开发关于androidsettings中的八个问题 下载本文

内容发布更新时间 : 2024/5/19 21:59:29星期一 下面是文章的全部内容请认真阅读。

android开发关于androidsettings中的八个问题

本问将回答以下八个问题,如有错误,敬请批评指正,不胜感激!(注:本文中的Settings解析基于android4.0+)问题一、Settings的主界面是怎么实现的?问题二、为什么使用hierarchyviewer 时Settings中的很多界面显示的都是SubSettings?问题三、hierarchyviewer 中显示SubSetting时如何确定我进入的是哪个fragment?问题四、点击设置界面的某一个header时,设置界面是如何切换的?问题五、Settings.java中getMetaData与getStartingFragmentClass这两个函数是否有点矛盾?问题六、Settings的shortcut是如何创建的?从shortcut进入Settings的流程是什么?问题七、为什么我从Settings的shortcut进入时,hierarchyviewer显示的就不是SubSettings(如Data usage)?问题八、Settings.java中很多继承自它的内部类都是空实现,为什么要写这些类?-----------------------------------------------------------------------------------------------------------------------------------------由于项目需要,本人就对Android中的Settings进行了解析,希望能帮到对Settings有兴趣的同志们~

-----------------------------------------------------------------------------------------------------------------------------------------问题一、Settings的主界面是怎么实现的?为了能适应平板和手机,

Settings采用了PreferenceActivity和PreferenceFragment结合的实现方式。Settings.java继承自PreferenceActivity,是Settings的主界面,它通过loadHeadersFromResource函数(api level 11)加载res/xml/settings_headers.xml来构造界面。在settings_headers.xml中声明了要在Settings主界面显示的各个header(如Sound、Display等)。Settings.HeaderAdapter将其中的header分为三类。在Settings.HeaderAdapter中的getView方法中根据header的类型使用不同的布局文件。为header划分类型的函数

static int getHeaderType(Header header) { if (header.fragment == null && header.intent == null) { return

HEADER_TYPE_CATEGORY; // 因为没有指明fragment和intent } else if (header.id == R.id.wifi_settings || header.id == R.id.bluetooth_settings || header.id == R.id.mobiledata_settings) { return

HEADER_TYPE_SWITCH; // 针对特定的三个header,分别为Wi-Fi、Bluetooth和Mobile data } else { return

HEADER_TYPE_NORMAL; } }当我们点击主界面的header后会显示与该header相关的设置界面。大部分(如Display的详细设置界面)都是通过继承

PreferenceFragment来实现的;有一部分是在

settings_headers.xml中声明<intent>,当被点击时(触发PreferenceActivity的onHeaderClick())将会通过startActivity来启动在<intent>节点中声明的targetClass(如设置中的Add account)。问题二、为什么使用hierarchyviewer 时Settings中的很多界面显示的都是SubSettings?要解决这个问题我们先要清楚为什么会写一个SubSettings.java继承自Settings.java?SubSettings.java中的注释很清楚的告诉了我们原因:Stub class for showing sub-settings; we can't use the main Settings class since for our app it is a special singleTask class。原来是因为Settings.java在声明时指定了

android:launchMode=\。我们知道,要显示Fragment的内容,我们就需要为其指定一个Activity。而Settings中的很多设置界面是由PreferenceFragment来完成的,当然也需要我们指定Activity.onBuildStartFragmentIntent函数会为我们构造一个显示Fragment的Intent对象(该函数的注释写的非常明白).Settings.java重写了这个函数(注,重写时它调用了super的该方法),在为intent对象setClass时都使用

SubSettings.java.(注:在settings_headers.xml指定了intent的header是不会触发onBuildStartFragmentIntent的)结果就是,Settings中大部分fragment都是使用的SubSettings这个Activity来显示。由于hierarchyviewer只是显示当前界面使