1. 程式人生 > >Android系統---Settings

Android系統---Settings

最近在研究Android的Settings原始碼,先看一下原始碼的目錄結構。大概967左右個檔案,是不是及其頭疼而且無從下手?待我娓娓道來~~~~~

1,初識Settings

首先,這麼多檔案,到底哪個檔案是主介面呢?在Settings目錄下找到Androidmanifest.xml清單配置檔案,找到首先啟動的activity:

  1. <activity android:name="Settings" android:label="@string/settings_label_launcher" android:taskAffinity="com.android.settings"
     android:launchMode="singleTask">  
  2.  <intent-filter>  
  3.   <action android:name="android.intent.action.MAIN" />   
  4.   <action android:name="android.settings.SETTINGS" />   
  5.   <category android:name="android.intent.category.DEFAULT" />   
  6.   <category android:name="android.intent.category.LAUNCHER"
     />   
  7.   </intent-filter>  
  8.   </activity>  

可以看到,設定的主介面是Settings.Java(package com.android.settings;),

  1. publicclass Settings extends PreferenceActivity  
  2.         implements ButtonBarHandler, OnAccountsUpdateListener {  
  3.          .....  
  4. <pre name="code"class="java"
    > loadHeadersFromResource(R.xml.settings_headers, headers);//載入佈局
  5.          .....  
  6. }  

所對應的xml檔案為Settings_headers.xml(res\xml\)檔案。在此摘列出xml檔案的一部分。

  1. <preference-headers  
  2.         xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <!-- WIRELESS and NETWORKS -->  
  4.     <header android:id="@+id/wireless_section"
  5.         android:title="@string/header_category_wireless_networks" />  
  6.     <!-- Wifi -->  
  7.     <header  
  8.         android:id="@+id/wifi_settings"
  9.         android:fragment="com.android.settings.wifi.WifiSettings"
  10.         android:title="@string/wifi_settings_title"
  11.         android:icon="@drawable/ic_settings_wireless" />  
  12.     <!-- MobileData -->  
  13.     <header  
  14.         android:id="@+id/mobiledata_settings"
  15.         android:icon="@drawable/stat_notify_mobile_data"
  16.         android:title="@string/data_usage_enable_mobile">  
  17.         <intent  
  18.             android:action="android.intent.action.MAIN"
  19.             android:targetPackage="com.android.phone"
  20.             android:targetClass="com.android.phone.MobileNetworkSettings" />  
  21.     </header>  
  22. .........  
  23. </preference-headers>  

每個可以選擇和點選的item基本有四個屬性,以WiFi_header為例

id:對應的id

fragment:點選之後的fragment:WifiSettings

title:header的主標題,即在Settings主介面顯示的文字:WLAN

icon:header的圖示,即顯示在文字左側的圖示

分析這兩個檔案可以總結下Settings的佈局,Settings主介面顯示藉助PreferenceActivity,Preference意為偏愛偏好,特點是利用鍵值對記錄使用者上次的選擇,在下次進入到該介面時直接讀取上次的選擇無須再進行配置。Activity意為介面,preferenceactivity結合兩者。每行屬於一個header,相當於listview中的item,每一個header又有fragment與之對應,而fragment的載入依賴於Activity,所依賴的Activity為SubSettings.java(package com.android.settings;//繼承與Settings),在Subsetting.java中已經寫明:

  1. /** 
  2.  *Stub class for showing sub-settings; we can't use the main Settings class 
  3.  * since for our app it is a special singleTask class. 
  4.  * 不能直接使用Settings.java載入fragment,因為,我們的程式啟動模式是singleTask 
  5.  */
  6. publicclass SubSettings extends Settings {  
  7.     @Override
  8.     publicboolean onNavigateUp() {  
  9.         finish();  
  10.         returntrue;  
  11.     }  
  12.     @Override
  13.     protectedboolean isValidFragment(String fragmentName) {  
  14.         returntrue;  
  15.     }  
  16. }   

對Setting原始碼的分析可以分兩個步驟進行入手,

第一,headers列表的載入

第二,header的點選事件的處理

解決以上兩個問題後,就可以開始對不同模組進行分析

2,設定介面佈局,載入headers

(1),載入xml佈局檔案

可以使用兩種方式載入xml檔案佈局

方法一:

  1. loadHeadersFromResource(R.xml.settings_headers, headers);  
方法二:
  1. addPreferencesFromResource(R.xml.fragmented_preferences_inner);   
(2),定義adapter載入並顯示headers
  1. privatestaticclass HeaderAdapter extends ArrayAdapter<Header> {  

設定介面佈局的介面卡adapter,有以下幾種type

 i>,HEADER_TYPE_CATEGORY:無焦點,不可以點選

 ii>,HEADER_TYPE_BUTTON:帶有button的header,button的visibility(可見性)有條件(可自行設定)

 iii>,HEADER_TYPE_NORMAL:正常的可獲取焦點可點選的不帶button的header

3,Settings.java原始碼分析(部分提取)

(1),onCreate方法中:

  1. if (getIntent().hasExtra(EXTRA_UI_OPTIONS)) {  
  2.             getWindow().setUiOptions(getIntent().getIntExtra(EXTRA_UI_OPTIONS, 0));  
  3.         }  

以上這段程式碼用於佈局actionbar,即頂部的導航欄佈局,如果獲取到的intent中的數值為

ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW,即表示,當螢幕較窄時導航欄有一部分會顯示在底部。

  1. mAuthenticatorHelper = new AuthenticatorHelper();  
  2.         mAuthenticatorHelper.updateAuthDescriptions(this);  
  3.         mAuthenticatorHelper.onAccountsUpdated(thisnull);  
這段程式碼屬於配置一些認證或者更新賬戶資訊,一般不做修改
  1. getMetaData();  
檢視方法原始碼可以看到:方法是獲取到配置檔案Androidmanifest.xml中<meta-data.../>節點下的資料
  1. privatevoid getMetaData() {  
  2.         try {  
  3.             //獲取到配置檔案Androidmanifest.xml檔案中<meta-data.../>節點下的資料
  4.            ActivityInfo ai = getPackageManager().getActivityInfo(getComponentName(),  
  5.                     PackageManager.GET_META_DATA);  
  6.             //如果沒有資訊,則返回
  7.            if (ai == null || ai.metaData == nullreturn;  
  8.             //獲取到header所對應的id
  9.             mTopLevelHeaderId = ai.metaData.getInt(META_DATA_KEY_HEADER_ID);  
  10.            //獲取到header所對應的fragment檔案
  11.             mFragmentClass = ai.metaData.getString(META_DATA_KEY_FRAGMENT_CLASS);  
  12.             // Check if it has a parent specified and create a Header object
  13.            //檢查一下是否有parent,若有,就創建出來
  14.             //parent的title
  15.            finalint parentHeaderTitleRes = ai.metaData.getInt(META_DATA_KEY_PARENT_TITLE);  
  16.            //parent的fragment
  17.            String parentFragmentClass = ai.metaData.getString(META_DATA_KEY_PARENT_FRAGMENT_CLASS);  
  18.             if (parentFragmentClass != null) {  
  19.                 mParentHeader = new Header();  
  20.                 mParentHeader.fragment = parentFragmentClass;  
  21.                 if (parentHeaderTitleRes != 0) {  
  22.                     mParentHeader.title = getResources().getString(parentHeaderTitleRes);  
  23.                 }  
  24. 相關推薦

    Android系統---Settings

    最近在研究Android的Settings原始碼,先看一下原始碼的目錄結構。大概967左右個檔案,是不是及其頭疼而且無從下手?待我娓娓道來~~~~~ 1,初識Settings 首先,這麼多檔案,到底哪個檔案是主介面呢?在Settings目錄下找到Androidmanifes

    Android 系統 Settings 啟動流程詳解

    Settings簡介   Settings 是 Android 系統自帶的一個很重要的應用,給使用者提供了操作 Android 系統功能的介面。它裡面包含了 Wireless & network,device,personal 以及 system 等幾

    Android系統Settings設定模組

    Settings設定模組UI介紹 FrameWork開發之路首先得玩得轉系統APP,個人是在Android5.0的基礎上進行定製,Settings模組分為兩個部分: packages\app\Settings 下的APP程式碼部分 fram

    Android系統settings裡新增設定選項

    目的:在通話設定選單下,新增一dect設定選單,裡面再新增一checkBOxPreference 來使能硬體模組。 ------------------------- 目前做的專案,需要在系統settings裡面新增一選項來使能硬體模組,裡面涉及到的preference知識

    android-如何在系統settings裡新增設定選項

    版本:2.3.1 目的:在通話設定選單下,新增一dect設定選單,裡面再新增一checkBOxPreference 來使能硬體模組。 ------------------------- 目前做的專案,需要在系統settings裡面新增一選項來使能硬體模組,裡面涉及到的pre

    Android中的android.provider.Settings.System系統屬性設定

    Content Provider中的Setting.System表格記憶體儲了很多系統屬性的值,以鍵值對的形式存在! 可以對如下的變數進行設定 通過如下的函式可以對其進行讀寫: static void (ContentResolver cr, Configurati

    Android系統設定settings應用學習(一)--允許未知來源應用安裝

     settings,是Android系統應用--設定的原始碼,包名稱為:com.android.settings  安全設定程式碼:SecuritySettings.java /* * Copyright (C) 2007 The Android Open Source

    【分享】迅為iTOP4412開發板-Android系統屏幕旋轉設置

    原生 android4 代碼 豎屏 == watermark ont 分辨率 軟件 1.1概述 Android4.0,Androd4.4源代碼能夠編譯成手機模式和平板模式,訊為iTop4412 開發平臺 的Android系統默認編譯為平板模式。客戶須要依據自己的產品

    改動android 系統時間

    nbsp pop -m andro shel content data popu 命令 命令如 date -s "yyyymmdd.[[[hh]mm]ss]" 直接在CRT上執行,舉例:date -s "20120801.120503" 但在adb shell下

    Android核心服務解析篇(三)——Android系統的啟動

    onf med cin gets get lld 系統屬性 基本 安裝模塊 從大的方面來說。Android系統的啟動能夠分為兩個部分:第一部分是Linux核心的啟動,第二部分是Android系統的啟動。第一部分主要包含系統引導,核心和驅動程序等,因為它們不屬於本篇要講的

    高速改動android系統默認日期方法

    port odi -a 個推 post setting moved ast 是不是 高速改動android系統默認日期方法 在android系統的設備上,都有一個默認的開始日期,看過非常多設備,有些設備在沒有聯網的時候沒有同步到系統時間的時候,竟然默

    【樹莓派】樹莓派刷Android系統

    net 文章 圖文 str 鍵盤操作 左右移動 ima 工具 解決 樹莓派3安裝Android TV系統圖文教程 http://www.mz6.net/news/android/6866.html 樹莓派3 Android TV系統怎樣安裝?樹莓派3一個重要用途就是當智

    調用aNDROID系統自帶功能

    ont hao123 provide music content vid uri android系統 系統 CONTENTpROVIDER%E5%9F%BA%E7%A1%80%E4%B9%8BURI http://music.hao123.com/songlist/495

    安卓 logcat設置 Android logcat Settings

    設置 mail auth set src log img 安卓 author 安卓 logcat設置 Android logcat Settings 作者:韓夢飛沙 Author:han_meng_fei_sha 郵箱:[email protected]/

    Android系統編譯出錯

    android 編譯出錯在Android7.1編譯過程中出現如下錯誤:Starting build with ninjaninja: Entering directory `.‘ [ 0% 8/30301] Ensure Jack server is installed and startedJack

    Android系統默認語言改為中文

    android targe base center lang rda 16px oca 語言 第一種方法:修改 build/tools/buildinfo.shecho "ro.product.locale.language=zh"echo "ro.product.loca

    如何直接打開android系統的wifi設置頁面,防止intent劫持

    art intent pre fonts mark bsp androi 希望 andro 在android的app開發中,經常會遇到需要跳轉至系統設置頁面的需求。但是當你使用以下代碼時: 如 Intent intent = new Intent(Settings.ACT

    Android系統版本、Platform版本、SDK版本、gradle修改

    wearable versions 應用 示例 tro tex ria col ide 雖然之前分析了gradle,但是在eclipse導入Android studio的時候,各個版本出現的問題還是很模糊,下面對各種版本進行一下說明: 參考資料: https://

    Android系統啟動流程(一)解析init進程啟動過程

    option 寫入 android change failed miss 通知 target sna 前言 作為“Android框架層”這個大系列中的第一個系列,我們首先要了解的是Android系統啟動流程,在這個流程中會涉及到很多重要的知識點,這個系列我們就來一一講解它們

    Android系統常用URI

    詳細 dia strong esc trac roc contract raw body android系統常用URI android系統管理聯系人的URI如下: ContactsContract.Contacts.CONTENT_URI 管理聯系人的Uri Contact