Android系統---Settings
最近在研究Android的Settings原始碼,先看一下原始碼的目錄結構。大概967左右個檔案,是不是及其頭疼而且無從下手?待我娓娓道來~~~~~
1,初識Settings
首先,這麼多檔案,到底哪個檔案是主介面呢?在Settings目錄下找到Androidmanifest.xml清單配置檔案,找到首先啟動的activity:
-
<activity android:name="Settings" android:label="@string/settings_label_launcher" android:taskAffinity="com.android.settings"
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <action android:name="android.settings.SETTINGS" />
- <category android:name="android.intent.category.DEFAULT" />
-
<category android:name="android.intent.category.LAUNCHER"
- </intent-filter>
- </activity>
可以看到,設定的主介面是Settings.Java(package com.android.settings;),
- publicclass Settings extends PreferenceActivity
- implements ButtonBarHandler, OnAccountsUpdateListener {
- .....
-
<pre name="code"class="java"
- .....
- }
所對應的xml檔案為Settings_headers.xml(res\xml\)檔案。在此摘列出xml檔案的一部分。
- <preference-headers
- xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- WIRELESS and NETWORKS -->
- <header android:id="@+id/wireless_section"
- android:title="@string/header_category_wireless_networks" />
- <!-- Wifi -->
- <header
- android:id="@+id/wifi_settings"
- android:fragment="com.android.settings.wifi.WifiSettings"
- android:title="@string/wifi_settings_title"
- android:icon="@drawable/ic_settings_wireless" />
- <!-- MobileData -->
- <header
- android:id="@+id/mobiledata_settings"
- android:icon="@drawable/stat_notify_mobile_data"
- android:title="@string/data_usage_enable_mobile">
- <intent
- android:action="android.intent.action.MAIN"
- android:targetPackage="com.android.phone"
- android:targetClass="com.android.phone.MobileNetworkSettings" />
- </header>
- .........
- </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中已經寫明:
- /**
- *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載入fragment,因為,我們的程式啟動模式是singleTask
- */
- publicclass SubSettings extends Settings {
- @Override
- publicboolean onNavigateUp() {
- finish();
- returntrue;
- }
- @Override
- protectedboolean isValidFragment(String fragmentName) {
- returntrue;
- }
- }
對Setting原始碼的分析可以分兩個步驟進行入手,
第一,headers列表的載入
第二,header的點選事件的處理
解決以上兩個問題後,就可以開始對不同模組進行分析
2,設定介面佈局,載入headers
(1),載入xml佈局檔案
可以使用兩種方式載入xml檔案佈局
方法一:
- loadHeadersFromResource(R.xml.settings_headers, headers);
- addPreferencesFromResource(R.xml.fragmented_preferences_inner);
- 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方法中:
- if (getIntent().hasExtra(EXTRA_UI_OPTIONS)) {
- getWindow().setUiOptions(getIntent().getIntExtra(EXTRA_UI_OPTIONS, 0));
- }
以上這段程式碼用於佈局actionbar,即頂部的導航欄佈局,如果獲取到的intent中的數值為
ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW,即表示,當螢幕較窄時導航欄有一部分會顯示在底部。
- mAuthenticatorHelper = new AuthenticatorHelper();
- mAuthenticatorHelper.updateAuthDescriptions(this);
- mAuthenticatorHelper.onAccountsUpdated(this, null);
- getMetaData();
- privatevoid getMetaData() {
- try {
- //獲取到配置檔案Androidmanifest.xml檔案中<meta-data.../>節點下的資料
- ActivityInfo ai = getPackageManager().getActivityInfo(getComponentName(),
- PackageManager.GET_META_DATA);
- //如果沒有資訊,則返回
- if (ai == null || ai.metaData == null) return;
- //獲取到header所對應的id
- mTopLevelHeaderId = ai.metaData.getInt(META_DATA_KEY_HEADER_ID);
- //獲取到header所對應的fragment檔案
- mFragmentClass = ai.metaData.getString(META_DATA_KEY_FRAGMENT_CLASS);
- // Check if it has a parent specified and create a Header object
- //檢查一下是否有parent,若有,就創建出來
- //parent的title
- finalint parentHeaderTitleRes = ai.metaData.getInt(META_DATA_KEY_PARENT_TITLE);
- //parent的fragment
- String parentFragmentClass = ai.metaData.getString(META_DATA_KEY_PARENT_FRAGMENT_CLASS);
- if (parentFragmentClass != null) {
- mParentHeader = new Header();
- mParentHeader.fragment = parentFragmentClass;
- if (parentHeaderTitleRes != 0) {
- mParentHeader.title = getResources().getString(parentHeaderTitleRes);
- }
-
相關推薦
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