MTK平台 Android11 MtkSettings简介

一.MtkSettings启动逻辑

1.进入MtkSettings的AndroidManifest.xml,找启动Activity,activity-alias是标签别名,真正的启动是targetActivity中配置的Settings类

 <activity android:name="Settings"
                  android:label="@string/settings_label_launcher"
                  
                  android:taskAffinity="com.android.settings.root"
                  android:launchMode="singleTask"
                  android:configChanges="keyboard|keyboardHidden">
            <intent-filter android:priority="1">
                <action android:name="android.settings.SETTINGS" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                       android:value="true" />
        </activity>
        
        <!-- Alias for launcher activity only, as this belongs to each profile. -->
        <activity-alias android:name="Settings"
                android:label="@string/settings_label_launcher"
                android:taskAffinity="com.android.settings.root"
                android:launchMode="singleTask"
                android:targetActivity="Settings">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts"/>
        </activity-alias>

2.Settings.java,Settings->SettingsActivity,Settings继承自SettingsActivity,里面所有的类都只是定义,没有实现,eg:

public class Settings extends SettingsActivity {

    /*
    * Settings subclasses for launching independently.
    */
    public static class AssistGestureSettingsActivity extends SettingsActivity { /* empty */}
    public static class BluetoothSettingsActivity extends SettingsActivity { /* empty */ }
    public static class CreateShortcutActivity extends SettingsActivity { /* empty */ }
    public static class FaceSettingsActivity extends SettingsActivity { /* empty */ }
    public static class FingerprintSettingsActivity extends SettingsActivity { /* empty */ }
    public static class TetherSettingsActivity extends SettingsActivity {

3. SettingsActivity.java,查看SettingsActivity中的onCreate方法,第一次启动进入launchSettingFragment方法,这里初始化相关的Fragment,具体其他的细节可参考源码

  @Override
    protected void onCreate(Bundle savedState) {
        super.onCreate(savedState);
        Log.d(LOG_TAG, "Starting onCreate");
        long startTime = System.currentTimeMillis();

        final FeatureFactory factory = FeatureFactory.getFactory(this);

        mDashboardFeatureProvider = factory.getDashboardFeatureProvider(this);

        // Should happen before any call to getIntent()
        getMetaData();

        final Intent intent = getIntent();
        if (intent.hasExtra(EXTRA_UI_OPTIONS)) {
            getWindow().setUiOptions(intent.getIntExtra(EXTRA_UI_OPTIONS, 0));
        }

        // Getting Intent properties can only be done after the super.onCreate(...)
        final String initialFragmentName = intent.getStringExtra(EXTRA_SHOW_FRAGMENT);

        // This is a "Sub Settings" when:
        // - this is a real SubSettings
        // - or :settings:show_fragment_as_subsetting is passed to the Intent
        final boolean isSubSettings = this instanceof SubSettings ||
                intent.getBooleanExtra(EXTRA_SHOW_FRAGMENT_AS_SUBSETTING, false);

        // If this is a sub settings, then apply the SubSettings Theme for the ActionBar content
        // insets.
        // If this is in setup flow, don't apply theme. Because light theme needs to be applied
        // in SettingsBaseActivity#onCreate().
        if (isSubSettings && !WizardManagerHelper.isAnySetupWizard(getIntent())) {
            setTheme(R.style.Theme_SubSettings);
        }

        setContentView(R.layout.settings_main_prefs);

        v188HeaderTextEmporia = (V188HeaderTextEmporia) findViewById(R.id.settings_header_text);
        getSupportFragmentManager().addOnBackStackChangedListener(this);

        if (savedState != null) {
            // We are restarting from a previous saved state; used that to initialize, instead
            // of starting fresh.
            setTitleFromIntent(intent);

            ArrayList<DashboardCategory> categories =
                    savedState.getParcelableArrayList(SAVE_KEY_CATEGORIES);
            if (categories != null) {
                mCategories.clear();
                mCategories.addAll(categories);
                setTitleFromBackStack();
            }
        } else {
            launchSettingFragment(initialFragmentName, intent);
        }
@VisibleForTesting
    void launchSettingFragment(String initialFragmentName, Intent intent) {
        if (initialFragmentName != null) {
            setTitleFromIntent(intent);

            Bundle initialArguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
            switchToFragment(initialFragmentName, initialArguments, true,
                    mInitialTitleResId, mInitialTitle);
        } else {
            // Show search icon as up affordance if we are displaying the main Dashboard
            mInitialTitleResId = R.string.dashboard_title;
            switchToFragment(TopLevelSettings.class.getName(), null /* args */, false,
                    mInitialTitleResId, mInitialTitle);
        }
    }

/**
     * Switch to a specific Fragment with taking care of validation, Title and BackStack
     */
    private Fragment switchToFragment(String fragmentName, Bundle args, boolean validate,
            int titleResId, CharSequence title) {
        Log.d(LOG_TAG, "Switching to fragment " + fragmentName);
        if (validate && !isValidFragment(fragmentName)) {
            throw new IllegalArgumentException("Invalid fragment for this activity: "
                    + fragmentName);
        }
        Fragment f = Utils.getTargetFragment(this, fragmentName, args);
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.main_content, f);
        if (titleResId > 0) {
            transaction.setBreadCrumbTitle(titleResId);
        } else if (title != null) {
            transaction.setBreadCrumbTitle(title);
        }
        transaction.commitAllowingStateLoss();
        getSupportFragmentManager().executePendingTransactions();
        Log.d(LOG_TAG, "Executed frag manager pendingTransactions");
        return f;
    }

二.MtkSettings一二级菜单添加的方法

1.MtkSettings所在的目录位置

/alps/vendor/mediatek/proprietary/packages/apps/MtkSettings

2.MtkSettings常用菜单一二级效果图

3.MtkSettings一级菜单top_level_settings.xml布局介绍

1‘.布局文件

<?xml version="1.0" encoding="utf-8"?>
<!--
  Copyright (C) 2018 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.
  -->

<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:settings="http://schemas.android.com/apk/res-auto"
    android:key="top_level_settings">

     <!--网络和互联网-->
     <Preference
        android:key="top_level_network"
        android:title="@string/network_dashboard_title"
        android:summary="@string/summary_placeholder"	
	    android:layout="@layout/dashboard_tile"
        android:order="-120"
        android:fragment="com.android.settings.network.NetworkDashboardFragment"
        settings:controller="com.android.settings.network.TopLevelNetworkEntryPreferenceController"/>

    <!--已连接的设备-->
    <Preference
        android:key="top_level_connected_devices"
        android:title="@string/connected_devices_dashboard_title"
        android:summary="@string/summary_placeholder"
        android:icon="@drawable/ic_homepage_connected_device"
	    android:layout="@layout/dashboard_tile"
        android:order="-110"
        android:fragment="com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment"
        settings:controller="com.android.settings.connecteddevice.TopLevelConnectedDevicesPreferenceController"/>

    <!--应用和通知-->
    <Preference
        android:key="top_level_apps_and_notifs"
        android:title="@string/app_and_notification_dashboard_title"
        android:summary="@string/app_and_notification_dashboard_summary"
        android:icon="@drawable/ic_homepage_apps"
	    android:layout="@layout/dashboard_tile"
        android:order="-100"
        android:fragment="com.android.settings.applications.AppAndNotificationDashboardFragment"/>

    <!--电池-->
    <Preference
        android:key="top_level_battery"
        android:title="@string/power_usage_summary_title"
        android:summary="@string/summary_placeholder"
        android:icon="@drawable/ic_homepage_battery"
        android:fragment="com.android.settings.fuelgauge.PowerUsageSummary"
	    android:layout="@layout/dashboard_tile"
        android:order="-90"
        settings:controller="com.android.settings.fuelgauge.TopLevelBatteryPreferenceController"/>
    
    <Preference
        android:key="date_time_settings"
        android:title="@string/date_and_time"
	    android:layout="@layout/dashboard_tile"
        android:order="-60"
        android:fragment="com.android.settings.datetime.DateTimeSettings"/>	

    <Preference
        android:key="language_input_settings"
        android:title="@string/language_settings"
	android:layout="@layout/dashboard_tile"	
        android:order="-55"
        android:fragment="com.android.settings.language.LanguageAndInputSettings"/>

    <!--存储-->
     <Preference
        android:key="top_level_storage"
        android:title="@string/storage_settings"
        android:summary="@string/summary_placeholder"
        android:icon="@drawable/ic_homepage_storage"
	    android:layout="@layout/dashboard_tile"
        android:order="-60"
        android:fragment="com.android.settings.deviceinfo.StorageSettings"
        settings:controller="com.android.settings.deviceinfo.TopLevelStoragePreferenceController"/>

    <!--隐私权-->
    <Preference
        android:key="top_level_privacy"
        android:title="@string/privacy_dashboard_title"
        android:summary="@string/privacy_dashboard_summary"
        android:icon="@drawable/ic_homepage_privacy"
	    android:layout="@layout/dashboard_tile"	
        android:order="-55"
        android:fragment="com.android.settings.privacy.PrivacyDashboardFragment"/>

    <!--位置信息-->
    <Preference
        android:key="top_level_location"
        android:title="@string/location_settings_title"
        android:summary="@string/location_settings_loading_app_permission_stats"
        android:icon="@drawable/ic_homepage_location"
        android:order="-50"
	    android:layout="@layout/dashboard_tile"	
        android:fragment="com.android.settings.location.LocationSettings"
        settings:controller="com.android.settings.location.TopLevelLocationPreferenceController"/>

    <!--安全-->
    <Preference
        android:key="top_level_security"
        android:title="@string/security_settings_title"
        android:summary="@string/summary_placeholder"
        android:icon="@drawable/ic_homepage_security"
        android:order="-40"
	    android:layout="@layout/dashboard_tile"	
        android:fragment="com.android.settings.security.SecuritySettings"
        settings:controller="com.android.settings.security.TopLevelSecurityEntryPreferenceController"/>

    <!--账号-->
    <Preference
        android:key="top_level_accounts"
        android:title="@string/account_dashboard_title"
        android:summary="@string/summary_placeholder"
        android:icon="@drawable/ic_homepage_accounts"
        android:order="-30"
	    android:layout="@layout/dashboard_tile"	
        android:fragment="com.android.settings.accounts.AccountDashboardFragment"
        settings:controller="com.android.settings.accounts.TopLevelAccountEntryPreferenceController"/>

    <!--无障碍-->
    <Preference
        android:key="top_level_accessibility"
        android:title="@string/accessibility_settings"
        android:summary="@string/accessibility_settings_summary"
        android:icon="@drawable/ic_homepage_accessibility"
        android:order="-20"
	    android:layout="@layout/dashboard_tile"	
        android:fragment="com.android.settings.accessibility.AccessibilitySettings"
        settings:controller="com.android.settings.accessibility.TopLevelAccessibilityPreferenceController"/>

    <!--系统-->
    <Preference
        android:key="top_level_system"
        android:title="@string/header_category_system"
        android:summary="@string/summary_placeholder"
        android:order="10"
	    android:layout="@layout/dashboard_tile"	
        android:fragment="com.android.settings.system.SystemDashboardFragment"/>

    <!--恢复出厂设置 -->
    <Preference
        android:key="factory_reset"
        android:title="@string/master_clear_title"
        settings:keywords="@string/keywords_factory_data_reset"
        settings:userRestriction="no_factory_reset"
        settings:useAdminDisabledSummary="true"
	    android:layout="@layout/dashboard_tile"	
	    android:order="15"	
        android:fragment="com.android.settings.MasterClear" />

    <!--关于手机 -->
    <Preference
        android:key="top_level_about_device"
        android:title="@string/about_settings"
        android:order="20"
	    android:layout="@layout/dashboard_tile"	
        android:fragment="com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment"/>
    

</PreferenceScreen>

2‘.Preference元素的通用XML属性

android:key  //唯一标识,SharedPreferences也将通过此Key值进行数据保存,也可以通过key值获取保存的信息
android:defaultValue //默认值, eg: CheckPreference的默认值可为"true",默认为选中状态
android:enabled  //表示该Preference是否可用状态
android:title //每个Preference在PreferenceScreen布局上显示的标题——大标题
android:summary //每个Preference在PreferenceScreen布局上显示的概述——小标题(可以没有)
android:persistent //表示Preference元素所对应的值是否写入sharedPreferen文件中,如果是true,则表示写入;否则,则表示不写入该Preference元素的值。
android:layout //preferenceactivity的偏好布局,用于填充view
android:dependency //表示一个Preference(用A表示)的可用状态依赖另外一个Preference(用B表示,相当于是父类),B可用,则A可用;B不可用,则A不可用。
android:disableDependentsState //与android:dependency相反。B可用,则A不可用;B不可用,则A可用
android:icon //偏好图标,对于偏好选择图标必须是一个引用到另一个资源的形式或以packagetypename主题属性
android:order //表示偏好顺序,值越大,优先级越高,菜单越靠前
android:widgetLayout //可以做小部部件部分的布局
android:selectable //偏好是否是可选的
android:fragment //使用时,可以碎片化PreferenceActivity

3’.Preference配置注意项

配置文件Preference时,order优先级控制一级菜单显示,优先级值越大,优先级越高,菜单越靠前,如果需要增加一级菜单,则需要在top_level_settings.xml中添加对应的Preference项即可 

4'.MtkSettings一级菜单Preference点击跳转事件,添加key, "mobile_network_settings"

1’'.给 Preference 指定 Intent 属性,这里可以分为 action 和 targetPackage+targetClass 两种方式,eg:

<Preference
        android:key="mobile_network_settings"
        android:title="title1"
        android:summary="summary1"
        android:icon="@drawable/ic_homepage_network"
        android:order="25">
        <intent android:action="com.example.test.mobile"/>
    </Preference>


    <Preference
        android:key="mobile_network_settings"
        android:title="title2"
        android:summary="summary2"
        android:icon="@drawable/ic_homepage_network"
        android:order="30">
        <intent
            android:targetPackage="com.example.test"
            android:targetClass="com.example.test.mobile.MainActivity" />
    </Preference>

2''.DashboardFragment.java中onPreferenceTreeClick拦截点击事件处理,包名:(com.android.settings.dashboard),继承关系为:

DashboardFragment->SettingsPreferenceFragment->InstrumentedPreferenceFragment->PreferenceFragmentCompat,eg:拦截key为mobile_network_settings的事件

@Override
    public boolean onPreferenceTreeClick(Preference preference) {
        if(preference.getKey().equals("mobile_network_settings")){
            Toast.makeText(mContext,R.string.mobile_insert_sim_card,Toast.LENGTH_LONG).show();
            return true;
        }

        final Collection<List<AbstractPreferenceController>> controllers =
                mPreferenceControllers.values();
        for (List<AbstractPreferenceController> controllerList : controllers) {
            for (AbstractPreferenceController controller : controllerList) {
                if (controller.handlePreferenceTreeClick(preference)) {
                    // log here since calling super.onPreferenceTreeClick will be skipped
                    writePreferenceClickMetric(preference);
                    return true;
                }
            }
        }


        return super.onPreferenceTreeClick(preference);
    }

4.MtkSettings二级菜单添加的方法,这里以display为例

1'.找到对应的二级菜单xml,display_settings.xml

2'.添加或者隐藏相应的preference菜单

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2016 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.
-->

<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:settings="http://schemas.android.com/apk/res-auto"
    android:key="display_settings_screen"
    android:title="@string/display_settings"
    settings:keywords="@string/keywords_display"
    settings:initialExpandedChildrenCount="5">

  
      <!--M: Add MiraVision Settings entrance -->
    <Preference
        android:key="mira_vision"
        android:title="@string/mira_vision_title"
        android:summary="@string/mira_vision_summary">
        <intent android:action="com.android.settings.MIRA_VISION" />
    </Preference>
  
    <com.android.settingslib.RestrictedPreference
        android:key="brightness"
        android:title="@string/brightness"
        settings:keywords="@string/keywords_display_brightness_level"
        settings:useAdminDisabledSummary="true"
        settings:userRestriction="no_config_brightness">
        <intent android:action="com.android.intent.action.SHOW_BRIGHTNESS_DIALOG" />
    </com.android.settingslib.RestrictedPreference>
    
    <com.android.settings.display.darkmode.DarkModePreference
        android:key="dark_ui_mode"
        android:title="@string/dark_ui_mode"
        android:fragment="com.android.settings.display.darkmode.DarkModeSettingsFragment"
        android:widgetLayout="@null"
        settings:widgetLayout="@null"
        settings:controller="com.android.settings.display.DarkUIPreferenceController"
        settings:keywords="@string/keywords_dark_ui_mode"/>

    <com.android.settings.display.NightDisplayPreference
        android:key="night_display"
        android:title="@string/night_display_title"
        android:fragment="com.android.settings.display.NightDisplaySettings"
        android:widgetLayout="@null"
        settings:widgetLayout="@null"/>

    <!-- Cross-listed item, if you change this, also change it in power_usage_summary.xml -->
    <Preference
        android:key="auto_brightness_entry"
        android:title="@string/auto_brightness_title"
        android:summary="@string/summary_placeholder"
        android:fragment="com.android.settings.display.AutoBrightnessSettings"
        settings:controller="com.android.settings.display.AutoBrightnessPreferenceController"/>

    <com.android.settingslib.RestrictedPreference
        android:key="wallpaper"
        android:title="@string/wallpaper_settings_title"
        settings:keywords="@string/keywords_display_wallpaper"
        settings:useAdminDisabledSummary="true"
        settings:controller="com.android.settings.display.WallpaperPreferenceController">
    </com.android.settingslib.RestrictedPreference>

    <!-- Cross-listed item, if you change this, also change it in power_usage_summary.xml -->
    <com.android.settings.display.TimeoutListPreference
        android:key="screen_timeout"
        android:title="@string/screen_timeout"
        android:summary="@string/summary_placeholder"
        android:entries="@array/screen_timeout_entries"
        android:entryValues="@array/screen_timeout_values"
        settings:keywords="@string/keywords_screen_timeout" />

    <Preference
        android:key="adaptive_sleep_entry"
        android:title="@string/adaptive_sleep_title"
        android:summary="@string/summary_placeholder"
        android:fragment="com.android.settings.display.AdaptiveSleepSettings"
        settings:controller="com.android.settings.display.AdaptiveSleepPreferenceController" />

    <SwitchPreference
        android:key="auto_rotate"
        android:title="@string/accelerometer_title"
        settings:keywords="@string/keywords_auto_rotate"
        settings:controller="com.android.settings.display.AutoRotatePreferenceController" />

    <Preference
        android:key="color_mode"
        android:title="@string/color_mode_title"
        android:fragment="com.android.settings.display.ColorModePreferenceFragment"
        settings:controller="com.android.settings.display.ColorModePreferenceController"
        settings:keywords="@string/keywords_color_mode" />

    <SwitchPreference
        android:key="display_white_balance"
        android:title="@string/display_white_balance_title"
        android:summary="@string/display_white_balance_summary"
        settings:controller="com.android.settings.display.DisplayWhiteBalancePreferenceController" />

    <SwitchPreference
        android:key="peak_refresh_rate"
        android:title="@string/peak_refresh_rate_title"
        android:summary="@string/peak_refresh_rate_summary"
        settings:controller="com.android.settings.display.PeakRefreshRatePreferenceController" />

    <Preference
        android:key="font_size"
        android:title="@string/title_font_size"
        android:fragment="com.android.settings.display.ToggleFontSizePreferenceFragment"
        settings:controller="com.android.settings.display.FontSizePreferenceController" />

    <com.android.settings.display.ScreenZoomPreference
        android:key="display_settings_screen_zoom"
        android:title="@string/screen_zoom_title"
        android:fragment="com.android.settings.display.ScreenZoomSettings"/>

    <SwitchPreference
        android:key="show_operator_name"
        android:title="@string/show_operator_name_title"
        android:summary="@string/show_operator_name_summary" />

    <Preference
        android:key="screensaver"
        android:title="@string/screensaver_settings_title"
        android:fragment="com.android.settings.dream.DreamSettings" />

    
    <Preference
        android:key="lockscreen_from_display_settings"
        android:title="@string/lockscreen_settings_title"
        android:fragment="com.android.settings.security.LockscreenDashboardFragment"
        settings:keywords="@string/keywords_ambient_display_screen"
        settings:controller="com.android.settings.security.screenlock.LockScreenPreferenceController" />
    
	
	<!--M: Add Always on display switch -->
    <SwitchPreference
        android:key="always_on_display"
        android:title="@string/aod_title"
        android:summary="@string/aod_summary" />
		
    <SwitchPreference
        android:key="camera_gesture"
        android:title="@string/camera_gesture_title"
        android:summary="@string/camera_gesture_desc" />

    <SwitchPreference
        android:key="lift_to_wake"
        android:title="@string/lift_to_wake_title" />

    <SwitchPreference
        android:key="tap_to_wake"
        android:title="@string/tap_to_wake"
        android:summary="@string/tap_to_wake_summary" />

    <ListPreference
        android:key="theme"
        android:title="@string/device_theme"
        android:summary="@string/summary_placeholder" />

    <Preference
        android:key="vr_display_pref"
        android:title="@string/display_vr_pref_title"
        android:fragment="com.android.settings.display.VrDisplayPreferencePicker" />

    <!--M: Add Font Style -->
    <Preference
        android:key="font_setting"
        android:title="@string/font_setting_title" >
        <intent android:action="com.lovelyfonts.activity.mainTab" />
    </Preference>

    <!-- M: add for HDMI settings begin -->
    <Preference
        android:fragment="com.mediatek.hdmi.HdmiSettings"
        android:key="hdmi_settings"
        android:summary="@string/hdmi_settings_summary"
        android:title="@string/hdmi_settings" />
    <!-- M: MTK add for HDMI settings end -->
</PreferenceScreen>
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值