您的位置:首页 > 移动开发 > Android开发

Android开发 Settings源代码分析(1)

2016-06-28 15:22 567 查看
1.Android Settings源码的路径为:

android\packages\apps\Settings

2.settings主界面UI布局

Settings的启动类为:

/**
* Top-level settings activity to handle single pane and double pane UI layout.
*/
public class Settings extends PreferenceActivity
implements ButtonBarHandler, OnAccountsUpdateListener {


从继承关系可以看出,Settings类继承于PreferenceActivity,因此具有Preference的一些属性和结构。

从Google settings的UI看出,左边是一些tab,右边是tab对应的内容,那么这些tab以及tab对应的内容主要是什么,以及如何显示的呢?

对于tab的显示,对应的code为:

/**
* Populate the activity with the top-level headers.
*/
@Override
public void onBuildHeaders(List<Header> headers) {
if (!onIsHidingHeaders()) {
loadHeadersFromResource(R.xml.settings_headers, headers);
updateHeaderList(headers);
}
}


loadHeadersFromResource(R.xml.settings_headers, headers);这个就是加载一些数据出来。

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
 http://www.apache.org/licenses/LICENSE-2.0 
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

<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" />
<!-- Bluetooth -->
<header
android:id="@+id/bluetooth_settings"
android:fragment="com.android.settings.bluetooth.BluetoothSettings"
android:title="@string/bluetooth_settings_title"
android:icon="@drawable/ic_settings_bluetooth2" />

<!-- Data Usage -->
<header
android:id="@+id/data_usage_settings"
android:fragment="com.android.settings.DataUsageSummary"
android:title="@string/data_usage_summary_title"
android:icon="@drawable/ic_settings_data_usage" />

<!-- Operator hook -->
<header
android:fragment="com.android.settings.WirelessSettings"
android:id="@+id/operator_settings">
<intent android:action="com.android.settings.OPERATOR_APPLICATION_SETTING" />
</header>

<!-- Other wireless and network controls -->
<header
android:id="@+id/wireless_settings"
android:title="@string/radio_controls_title"
android:breadCrumbTitle="@string/wireless_networks_settings_title"
android:fragment="com.android.settings.WirelessSettings"
android:icon="@drawable/empty_icon" />

<!-- DEVICE -->
<header android:id="@+id/device_section"
android:title="@string/header_category_device" />

<!-- Home -->
<header
android:id="@+id/home_settings"
android:icon="@drawable/ic_settings_home"
android:fragment="com.android.settings.HomeSettings"
android:title="@string/home_settings" />

<!-- Sound -->
<header
android:id="@+id/sound_settings"
android:icon="@drawable/ic_settings_sound"
android:fragment="com.android.settings.SoundSettings"
android:title="@string/sound_settings" />

<!-- Display -->
<header
android:id="@+id/display_settings"
android:icon="@drawable/ic_settings_display"
android:fragment="com.android.settings.DisplaySettings"
android:title="@string/display_settings" />

<!-- Storage -->
<header
android:id="@+id/storage_settings"
android:fragment="com.android.settings.deviceinfo.Memory"
android:icon="@drawable/ic_settings_storage"
android:title="@string/storage_settings" />

<!-- Battery -->
<header
android:id="@+id/battery_settings"
android:fragment="com.android.settings.fuelgauge.PowerUsageSummary"
android:icon="@drawable/ic_settings_battery"
android:title="@string/power_usage_summary_title" />

<!-- Application Settings -->
<header
android:fragment="com.android.settings.applications.ManageApplications"
android:icon="@drawable/ic_settings_applications"
android:title="@string/applications_settings"
android:id="@+id/application_settings" />

<!-- Manage users -->
<header
android:fragment="com.android.settings.users.UserSettings"
android:icon="@drawable/ic_settings_multiuser"
android:title="@string/user_settings_title"
android:id="@+id/user_settings" />

<!-- Manage NFC payment apps -->
<header
android:fragment="com.android.settings.nfc.PaymentSettings"
android:icon="@drawable/ic_settings_nfc_payment"
android:title="@string/nfc_payment_settings_title"
android:id="@+id/nfc_payment_settings" />

<!-- Manufacturer hook -->
<header
android:fragment="com.android.settings.WirelessSettings"
android:id="@+id/manufacturer_settings">
<intent android:action="com.android.settings.MANUFACTURER_APPLICATION_SETTING" />
</header>

<!-- PERSONAL -->
<header android:id="@+id/personal_section"
android:title="@string/header_category_personal" />

<!-- Location -->
<header
android:fragment="com.android.settings.location.LocationSettings"
android:icon="@drawable/ic_settings_location"
android:title="@string/location_settings_title"
android:id="@+id/location_settings" />

<!-- Security -->
<header
android:fragment="com.android.settings.SecuritySettings"
android:icon="@drawable/ic_settings_security"
android:title="@string/security_settings_title"
android:id="@+id/security_settings" />

<!-- Language -->
<header
android:id="@+id/language_settings"
android:fragment="com.android.settings.inputmethod.InputMethodAndLanguageSettings"
android:icon="@drawable/ic_settings_language"
android:title="@string/language_settings" />

<!-- Backup and reset -->
<header
android:fragment="com.android.settings.PrivacySettings"
android:icon="@drawable/ic_settings_backup"
android:title="@string/privacy_settings"
android:id="@+id/privacy_settings" />

<!--  ACCOUNTS section -->
<header
android:id="@+id/account_settings"
android:title="@string/account_settings" />

<header
android:id="@+id/account_add"
android:title="@string/add_account_label"
android:icon="@drawable/ic_menu_add_dark">
<intent
android:action="android.settings.ADD_ACCOUNT_SETTINGS"/>
</header>

<!-- SYSTEM -->
<header android:id="@+id/system_section"
android:title="@string/header_category_system" />

<!-- Date & Time -->
<header
android:id="@+id/date_time_settings"
android:fragment="com.android.settings.DateTimeSettings"
android:icon="@drawable/ic_settings_date_time"
android:title="@string/date_and_time_settings_title" />

<!-- Accessibility feedback -->
<header
android:id="@+id/accessibility_settings"
android:fragment="com.android.settings.accessibility.AccessibilitySettings"
android:icon="@drawable/ic_settings_accessibility"
android:title="@string/accessibility_settings" />

<!-- Print -->
<header
android:id="@+id/print_settings"
android:fragment="com.android.settings.print.PrintSettingsFragment"
android:icon="@*android:drawable/ic_print"
android:title="@string/print_settings" />

<!-- Development -->
<header
android:id="@+id/development_settings"
android:fragment="com.android.settings.DevelopmentSettings"
android:icon="@drawable/ic_settings_development"
android:title="@string/development_settings_title" />

<!-- About Device -->
<header
android:id="@+id/about_settings"
android:fragment="com.android.settings.DeviceInfoSettings"
android:icon="@drawable/ic_settings_about"
android:title="@string/about_settings" />

</preference-headers>


从上述xml可以看出,header的内容是通过fragment来显示,定义了每一个header对应的fragment。

下面是我显示的一些数据:

// Show only these settings for restricted users
private int[] SETTINGS_FOR_RESTRICTED = {
R.id.wireless_section,
R.id.wifi_settings,
R.id.bluetooth_settings,
R.id.data_usage_settings,
R.id.wireless_settings,
R.id.device_section,
R.id.sound_settings,
R.id.display_settings,
R.id.storage_settings,
R.id.application_settings,
R.id.battery_settings,
R.id.personal_section,
R.id.location_settings,
R.id.security_settings,
R.id.language_settings,
R.id.user_settings,
R.id.account_settings,
R.id.account_add,
R.id.system_section,
R.id.date_time_settings,
R.id.about_settings,
R.id.accessibility_settings,
R.id.print_settings,
R.id.nfc_payment_settings,
R.id.home_settings
};


这些是我不显示的数据:

//not show these items
private int[] SETTINGS_FOR_REMOVED = {
R.id.data_usage_settings,
R.id.operator_settings,
R.id.wireless_settings,

R.id.home_settings,
R.id.sound_settings,
R.id.display_settings,
R.id.storage_settings,
R.id.battery_settings,
R.id.user_settings,

R.id.location_settings,
R.id.security_settings,

R.id.account_settings,
R.id.account_add,

R.id.accessibility_settings,
R.id.print_settings,
R.id.development_settings
};


在private void updateHeaderList(List
target)函数中,会根据当前平台是否支持某项feature,决定是否显示对应的header,如果不想要那个就可以remove:

private void updateHeaderList(List<Header> target) {
final boolean showDev = mDevelopmentPreferences.getBoolean(
DevelopmentSettings.PREF_SHOW,
android.os.Build.TYPE.equals("eng"));
int i = 0;

final UserManager um = (UserManager) getSystemService(Context.USER_SERVICE);
mHeaderIndexMap.clear();
while (i < target.size()) {
Header header = target.get(i);
// Ids are integers, so downcasting
int id = (int) header.id;
if (id == R.id.operator_settings || id == R.id.manufacturer_settings) {
Utils.updateHeaderToSpecificActivityFromMetaDataOrRemove(this, target, header);
} else if (id == R.id.wifi_settings) {
// Remove WiFi Settings if WiFi service is not available.
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI)) {
target.remove(i);
}
} else if (id == R.id.bluetooth_settings) {


下面图片就是我显示的数据。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android开发