Processus de démarrage des paramètres Android11

1. Page d'accueil des paramètres système (menu de premier niveau) :

1、Paramètres

La raison pour laquelle une activité vide est définie ici est que les applications externes peuvent accéder directement à l'interface XX_SettingsActivity, car s'il ne s'agit que d'un fragment, l'extérieur ne peut pas accéder à l'interface du fragment. Lors du passage à XX_SettingsActivity, sa classe parent sera exécutée . Méthode dans SettingsActivity.java, et en fonction des informations d'enregistrement de XX_SettingsActivity dans le fichier manifeste et de sa valeur de métadonnées, recherchez le fragment (XX_Settings) correspondant à XX_SettingsActivity, affichez l'interface du fragment et implémentez la porte dérobée.

2、AndroidManifest.xml

L'interface principale Activity de Settings utilise Settings.java et la sous-interface Activity utilise SubSettings.java. Les classes internes de Settings et SubSetting sont toutes des activités vides (les sept méthodes de cycle de vie ne sont pas remplacées) et elles sont toutes héritées de ParamètresActivité.

À partir du fichier AndroidManifest.xml, nous savons que la page principale est .homepage.SettingsHomepageActivity.

Prenons l'exemple de WifiSettings

3、SettingsHomepageActivity

①onCréer

②showFragment

L'implémentation du chargement du fragment est implémentée dans la méthode d'encapsulation.

4、TopLevelSettings

TopLevelSettings hérite de la classe abstraite DashboardFragment, implémente la méthode abstraite getPreferenceScreenResId() et renvoie le fichier de configuration des préférences pour compléter la configuration statique.

Une autre chose importante dans la classe TopLevelSettings est que la méthode onAttach() de la classe parent DashboardFragment est appelée dans la méthode onAttach(). Cette méthode est principalement utilisée pour charger des contrôleurs de préférences.

5、top_level_settings.xml

La balise principale est une balise <PreferenceScreen>, qui contient plusieurs balises <Preference>. Chaque balise <Préférence> correspond à chaque élément de paramètre sur la page d'accueil.

clé

La clé primaire de l'élément de configuration

titre

Le titre de l'élément de configuration

résumé

Vous voulez le texte sous le titre

icône

icône avant

commande

Utilisé pour le tri, plus la valeur est petite, plus le classement est élevé.

fragment

Cliquez sur l'élément pour accéder à l'interface

manette

Le contrôleur de l'élément contrôle l'affichage de son contenu, sa disponibilité, et peut également contrôler ses événements de clic, etc.

5、DashboardFragment

①onCreatePreferences

②actualiserTouteslesPréférences

③displayResourceTiles

La méthode addPreferencesFromResource ajoute toutes les préférences sous préférenceScreen à ArrayList, puis construit et génère un PreferenceGroupAdapter basé sur cette collection, et définit enfin cet adaptateur sur la liste pour terminer la liaison des données et ainsi terminer le chargement de l'interface.

④refreshDashboardTiles

⑤onAttach

    @Override 
    public void onAttach(Context context) { 
        super.onAttach(context); 
        mSuppressInjectedTileKeys = Arrays.asList(context.getResources().getStringArray( 
                R.array.config_suppress_injected_tile_keys)); 
        mDashboardFeatureProvider = FeatureFactory.getFactory (contexte). 
                getDashboardFeatureProvider(contexte); 
        // Charger les contrôleurs de préférences à partir du code 
        //从代码加载首选项控制器
        final List<AbstractPreferenceController> controllersFromCode = 
                createPreferenceControllers(context); 
        // Charger les contrôleurs de préférences à partir de la définition XML 
        // Charger les contrôleurs de préférences à partir de la définition XML
        final List<BasePreferenceController> controllersFromXml = PreferenceControllerListHelper 
                .getPreferenceControllersFromXml(context, getPreferenceScreenResId()); 
        // Filtre les contrôleurs basés sur XML 
        au cas où un contrôleur similaire serait déjà créé à partir du code. 
        final List<BasePreferenceController> uniqueControllerFromXml = 
                PreferenceControllerListHelper.filterControllers( 
                        contrôleursFromXml, contrôleursFromCode); 
        // Ajouter des contrôleurs uniques à la liste. 
        //Ajouter des contrôleurs uniques à la liste 
        if (controllersFromCode != null) { 
            mControllers.addAll(controllersFromCode);
 
        }
        mControllers.addAll(uniqueControllerFromXml); 

        // Et connectez-vous au cycle de vie. 
        //并与生命周期联系起来。
        final Lifecycle lifecycle = getSettingsLifecycle(); 
        uniqueControllerFromXml.forEach(controller -> { 
            if (instance de contrôleur de LifecycleObserver) { 
                lifecycle.addObserver((LifecycleObserver) contrôleur); 
            } 
        }); 
        // Définit la catégorie de métriques pour BasePreferenceController. 
        //为 BasePreferenceController 设置指标类别. 
        final int metricCategory = getMetricsCategory(); 
        mControllers.forEach(contrôleur -> { 
            if (instance de contrôleur de BasePreferenceController) {
                ((Contrôleur BasePreferenceController)).setMetricsCategory(metricCategory); 
            } 
        }); 

        mPlaceholderPreferenceController = 
                nouveau DashboardTilePlaceholderPreferenceController (context); 
        mControllers.add(mPlaceholderPreferenceController); 
        pour (contrôleur AbstractPreferenceController : mControllers) { 
            addPreferenceController(controller); 
        } 
    }

2. Mise en œuvre du menu secondaire des paramètres du système

1、Sous-paramètres

L'interface de menu secondaire Activity des paramètres système est la classe SubSettings. Bien que la classe SubSettings soit une activité, il s'agit d'une activité vide. Elle n'hérite pas du cycle de vie Activity7.

2、SettingsActivity

①onCréer

Fichier de mise en page : settings_main_prefs

Fragment de démarrage

②getMetaData

Prenons WifiSettingsActivity comme exemple

③getIntent

④getStartingFragmentClass

⑤launchSettingFragment

⑥switchToFragment

3、settings_main_prefs.xml

Le fichier de mise en page est constitué des balises <SwitchBar> et <FrameLayout> et <RelativeLayout>. La balise <RelativeLayout> est masquée par défaut. D'après l'identifiant de la balise <FrameLayout>, on peut juger que cette balise est le contenu principal de l'interface de la barre de menu secondaire.

 3. Charger la luminosité par défaut

1、top_level_settings.xml

2、AndroidManifest.xml

3、DisplaySettings

①getPreferenceScreenResId

②buildPreferenceControllers

4、display_settings.xml

5、AutoBrightnessPreferenceController

6、BrightnessLevelPreferenceController

①obtenir la luminosité actuelle

②convertirLinearToGammaFloat

7、Z:\k630_64\vendor\tinno\k630_64\trunk\etc\settings-config.xml

<setting type="system" name="screen_brightness_float" value="0.35896719"/>

8、/data/system/users/0/settings_system.xml

< identifiant du paramètre ="491" nom ="screen_brightness_float" valeur ="0.3597016" package ="android" defaultValue ="0.35896719" defaultSysSet ="true" />
 

4. Ajustement de la police

1、display_settings

2、FontSizePreferenceController

3、ToggleFontSizePreferenceFragment

4、values-zh-rCN/arrays.xml

5、arrays.xml

6、Z:\k630_64\vendor\tinno\k630_64\trunk\etc\settings-config.xml

<setting type="system" name="font_scale" value="1.0"/>

5. Expiration de l'écran

1、TimeoutPreferenceController

2、arrays.xml

3、Z:\k630_64\vendor\tinno\k630_64\trunk\etc\settings-config.xml

6. Afficher la puissance en temps réel

1、top_level_settings.xml

2、AndroidManifest.xml

3、TopLevelBatteryPreferenceController

L'élément de configuration est configuré avec le contrôleur TopLevelBatteryPreferenceController, qui hérite de AbstractPreferenceController. Cette classe abstraite est utilisée pour gérer uniformément tous les éléments de menu (tels que l'affichage ou le masquage, l'écoute des événements de clic, etc.).

public class TopLevelBatteryPreferenceController extends BasePreferenceController implémente 
        LifecycleObserver, OnStart, OnStop { 

    // Diffusion du changement de batterie 
    private final BatteryBroadcastReceiver mBatteryBroadcastReceiver; 
    // Élément de configuration actuel 
    private Preference mPreference; 
    // Informations sur la batterie 
    private BatteryInfo mBatteryInfo; 

    // Initialisation de la diffusion du changement de batterie 
    public TopLevelBatteryPreferenceController (contexte contextuel , String préférenceKey) { 
        super(context, préférenceKey); 
        mBatteryBroadcastReceiver = new BatteryBroadcastReceiver(mContext); 
        mBatteryBroadcastReceiver.setBatteryChangedListener(type -> { 
            BatteryInfo.getBatteryInfo(mContext, info -> {
                mBatteryInfo = infos ; 
                updateState (mPréférence); 
            }, vrai /* chaîne courte */); 
        }); 
    } 

    // Fonctionnement 
    @Override 
    public int getAvailabilityStatus() { 
        return mContext.getResources().getBoolean(R.bool.config_show_top_level_battery) 
                ? DISPONIBLE : UNSUPPORTED_ON_DEVICE ; 
    } 

    @Override 
    public void displayPreference(PreferenceScreen screen) { 
        super.displayPreference(screen); 
        // Utilisation de la fonction 
        mPreference = screen.findPreference(getPreferenceKey()); 
    } 

    @Override 
    public void onStart() { 
        // Enregistre la diffusion 
        mBatteryBroadcastReceiver .register ();
    } 

    @Override 
    public void onStop() { 
        // Annule l'enregistrement de la diffusion 
        mBatteryBroadcastReceiver.unRegister(); 
    } 

    @Override 
    public CharSequence getSummary() { 
        // Renvoie l'aperçu de la batterie 
        return getDashboardLabel(mContext, mBatteryInfo); 
    } 

    // Récupère les informations sur la batterie 
    static CharSequence getDashboardLabel (contexte contextuel, informations BatteryInfo) { 
        if (info == null || context == null) { 
            return null; 
        } 
        Étiquette CharSequence ; 
        if (!info.discharge && info.chargeLabel != null) { 
            label = info.chargeLabel;
        } else if (info.remainingLabel == null) { 
            label = info.batteryPercentString; 
        } else { 
            label = context.getString(R.string.power_remaining_settings_home_page, 
                    info.batteryPercentString, 
                    info.remainingLabel); 
        } 
        étiquette de retour ; 
    } 
}

4. Résumé

  1. Initialiser la diffusion du changement de puissance dans la méthode de construction
  2. Enregistrer et désenregistrer les diffusions dans onStart() et onStop()
  3. Une fois la diffusion du changement de puissance reçue, les informations de puissance sont enregistrées dans mBatteryInfo.
  4. Exécutez ensuite updateState(), qui appellera getSummary() pour définir les informations sur l'élément de configuration actuel.
  5. Dans getSummary(), analysez les informations d'alimentation enregistrées par mBatteryInfo

7. Fournisseur de système

Les données de configuration du système Android sont stockées dans /data/data/com.android.providers.settings/databases/settings.db

Y a-t-il une valeur par défaut

Lorsque vous recherchez la valeur par défaut d'un commutateur, vous devez d'abord comprendre s'il existe une valeur par défaut pour le commutateur et si l'état du commutateur a un statut enregistré (généralement, l'état est stocké dans la base de données des paramètres). Conditions de jugement : La valeur par défaut ne peut être trouvée qu'une fois que l'état du commutateur est toujours enregistré après le redémarrage ou que l'état du commutateur est restauré à sa valeur par défaut après la réinitialisation (restauration des paramètres d'usine) .

L'état du commutateur est toujours enregistré après le redémarrage, ce qui signifie que l'état est stocké dans la base de données. Après la réinitialisation, l'état du commutateur revient à la valeur par défaut, indiquant que l'état a une valeur par défaut.

Par exemple, les commutateurs Wiif, les commutateurs Bluetooth, les commutateurs GPS, etc. ont tous des valeurs par défaut et les valeurs d'état sont enregistrées dans la base de données.

Quant au commutateur de point d'accès WiFi, l'état n'est pas enregistré après le redémarrage, alors ne perdez pas vos efforts pour trouver sa valeur par défaut ou sa valeur de stockage d'état.

Modifier la valeur par défaut

La plupart de l'état du commutateur est stocké dans la base de données de SettingProvider. Il existe trois fichiers liés à la valeur d'état.

  1. /frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java : la valeur d'état est stockée dans ce fichier
  2. /frameworks/base/packages/SettingsProvider/res/values/defaults.xml : définit la valeur par défaut de l'état du commutateur
  3. /frameworks/base/core/java/android/provider/Settings.java : définit la clé correspondant au stockage de la valeur par défaut de chaque état du commutateur.
  4. Z:\k630_64\vendor\tinno\k630_64\trunk\etc\settings-config.xml Les valeurs par défaut pour la luminosité, la taille de la police, l'écran de verrouillage et d'autres paramètres sont définies ici

Prenons l'exemple du délai d'expiration de l'écran

1、TimeoutPreferenceController

    @Override 
    public void updateState (Préférence de préférence) { 
        final TimeoutListPreference timeoutListPreference = (TimeoutListPreference) préférence ; 
        //Le système SCREEN_OFF_TIMEOUT contient FALLBACK_SCREEN_TIMEOUT_VALUE 
        final long currentTimeout = Settings.System.getLong(mContext.getContentResolver(), 
                SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE); 
    }

2、DatabaseHelper

Toutes les valeurs par défaut ne sont pas définies en lisant defaults.xml, et certaines sont définies directement dans DatabaseHelper.java.

Par exemple, loadSetting(stmt, Settings.Secure.ADB_ENABLED, 1); Ce commutateur de débogage ADB est écrit directement dans le fichier de base de données.

Concernant le commutateur de débogage USB, vous pouvez également le définir dans le fichier systemui/usb/StorageNotification.java de systemui pour déterminer s'il existe un numéro IMEI.

Lors de l'analyse du code, si vous constatez que cet élément est introuvable dans defaults.xml, recherchez directement dans le fichier DatabaseHelper.java.

private void loadSystemSettings(SQLiteDatabase db) { 
    //数据库名
    private static final String DATABASE_NAME = "settings.db"; 
    
    SQLiteStatement stmt = null ; 
    essayez { 
        stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)" 
                + " VALUES(?,?);"); 


        //SCREEN_OFF_TIMEOUT设置def_screen_off_timeout 
        //def_screen_off_timeout etdefaults.xml中
        loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT, 
                R.integer.def_screen_off_timeout); 
        ..... 
            

private void loadIntegerSetting(SQLiteStatement stmt, String key, int resid) { 
            // 
            loadSetting(stmt, key,
            Integer.toString(mContext.getResources().getInteger(resid))); 
        } 
} 
    
private void loadSetting (SQLiteStatement stmt, clé de chaîne, valeur de l'objet) { 
    // 
    stmt.bindString (1, clé); 
    stmt.bindString(2, value.toString()); 
    stmt.execute(); 
} 
    
..... 
    
chaîne finale statique PARTNER_SETTINGS_PATH ="etc/settings-config.xml"; 
private void updateSystemSecureSettings (SQLiteDatabase db) {   
    FileReader settingsReader ; 
    final File settingsFile = new File (Environment.getRootDirectory(), PARTNER_SETTINGS_PATH); 
    essayez { 
        settingsReader = new FileReader (settingsFile);
    } catch (FileNotFoundException e) {
        Log.w(TAG, "Impossible d'ouvrir" + Environment.getRootDirectory() + "/" + PARTNER_SETTINGS_PATH); 
        retour; 
    }

3、defaults.xml

<resources> 
    <bool name="def_dim_screen">true</bool> 
    //对应SCREEN_OFF_TIMEOUT 
    <integer name="def_screen_off_timeout">15000</integer> 
    <integer name="def_sleep_timeout">-1</integer> 
    <bool name ="def_airplane_mode_on">faux</bool> 
    ......

4、Settings.java

        /** 
         * Le temps en millisecondes avant que l'appareil ne se mette en veille ou ne commence 
         * à rêver après une période d'inactivité. Cette valeur est également connue sous le nom de 
         * délai d'expiration de l'activité de l'utilisateur, car l'écran n'est pas nécessairement éteint 
         * à son expiration. 
         * 
         * <p> 
         * Cette valeur est limitée par le délai d'expiration maximum défini par 
         * {@link android.app.admin.DevicePolicyManager#setMaximumTimeToLock(ComponentName, long)}. 
         */ 
        //使用adb命令获取得到,区分大小写:screen_off_timeout 
        public static final String SCREEN_OFF_TIMEOUT = "screen_off_timeout";

5、settings-config.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ressources> 
	<setting type="global" name="auto_time" value="1"/> 
	<setting type="global" name="auto_time_zone" value="1"/> 
	<setting type="system" name="time_12_24" value="24"/> 
	<setting type="system" name="date_format" value="jj/MM/aaaa"/> 
	< paramètre type="system" name="accelerometer_rotation" value="0"/> 
    //屏幕锁定时间
	<setting type="system" name="screen_off_timeout" value="120000"/> 
	<setting type="system" name =" effets_sound_enabled "value="0"/> 
        <setting type="system" name="haptic_feedback_enabled" value="0"/> 
        <setting type="system" name="dtmf_tone" value="0"/> 
        <setting type="system" name="lockscreen_sounds_enabled" value="0"/> 
	<setting type="system" name="screen_brightness" value="56"/> 
    
	<setting type="system" name="screen_brightness_mode" value="1"/> 
    //字体大小
    <setting type="system" name="font_scale" value="1.0"/ 
	> <setting type="system" name="status_bar_show_battery_percent" value="1"/> 
	<setting type="global" name="install_non_market_apps" value="0"/> 
	<setting type="secure" nom ="backup_enabled" value="0"/> 
	<setting type="secure" name="charger_sounds_enabled" value="0"/> 
    //屏幕亮度
	<setting type="system" name="screen_brightness_float" value="0.35896719 "/>
	<setting type="secure" name="backup_transport" value="com.google.android.backup/.BackupTransportService"/> 
	<!--
	<setting type="secure" name="default_input_method" value="com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME"/> 
	<setting type="secure" name="enabled_input_methods" valeur ="com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME:com.google.android.googlequicksearchbox/com.google.android.voicesearch.ime.VoiceInputMethodService:com.google.android.inputmethod. pinyin/.PinyinIME"/> 
	<setting type="system" name="ipo_setting" value="0"/> 
        <setting type="global" name="device_name" value="K630"/>
	<setting type="system" name="lowrawapp_optimize_white_packages" value="com.tencent.mm,com.tencent.mobileqq,com.facebook.katana,com.whatsapp,com.skype.rover,com.snapchat.android,com .tnmb.bootclean,com.ape.cubes,com.ape.folio,com.ape.retailmode,com.tinno.autotesttool,com.tinno.fieldtester,com.antutu.ABenchMark,com.antutu.benchmark.full,it .telecomitalia.cubovision,it.telecomitalia.selectedbytim,com.telecomitalia.cubomusica"/> 
	<setting type="system" name="lowrawapp_optimize_limit_num" value="4"/> 
	<setting type="system" name="lowrawapp_optimize_limit_sum" value="6"/> 
	<setting type="system" name="lowrawapp_optimize_Custom_packages" value="com.kugou.android"/> 
	<setting type="system" name="lowrawapp_optimize_cpuload_normal" value="12.5"/>
	<setting type="system" name="lowrawapp_optimize_cpuload_high" value="13.5"/> 
	<setting type="system" name="lowrawapp_optimize_cpuload_ultrahigh" value="16.5"/> 
	<setting type="system" name="lowrawapp_optimize_topPss_large" value="260000"/> 
	<setting type="system" name="lowrawapp_optimize_topPss_resume" value="150000"/> < 
	setting type="system" name="lowrawapp_optimize_topPss_ultralarge" value="340000"/> 
	--> 
    <! -- FEATURE_SINGLE_HAND hsg 20190904--> 
    <setting type="global" name="enable_single_hand" value="1" /> 
    <!-- TINNO FIN --> 
</ressources>

6.Valeur par défaut

valeur

signification

clé

def_dim_screen

0=non 1=oui : s'il faut diminuer progressivement la luminosité de l'écran

Paramètres.System.DIM_SCREEN

def_screen_off_timeout

Combien de secondes l'écran s'éteint-il après aucune opération ?

Paramètres.System.SCREEN_OFF_TIMEOUT

def_sleep_timeout

Le nombre de secondes de mise en veille après aucune opération (cette valeur est plus longue que le temps d'extinction de l'écran, car l'écran sera éteint avant de se mettre en veille)

Paramètres.Secure.SLEEP_TIMEOUT

def_airplane_mode_on

Le mode avion est-il activé par défaut ?

Paramètres.Global.AIRPLANE_MODE_ON

def_theater_mode_on

Le mode cinéma est-il activé par défaut ?

Paramètres.Global.THEATER_MODE_ON

def_airplane_mode_radios

Liste des commutateurs qui seront désactivés lorsque le mode avion est activé (incluant généralement Bluetooth, Wi-Fi, NFC, etc.)

Paramètres.Global.AIRPLANE_MODE_RADIOS

avion_mode_toggleable_radios

Liste des commutateurs que les utilisateurs peuvent activer manuellement en mode avion

Paramètres.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS

def_auto_time

1=oui, 0=non Synchronisation automatique de la date, de l'heure et du fuseau horaire à partir du réseau

Paramètres.Global.AUTO_TIME

def_auto_time_zone

1=oui, 0=non S'il faut synchroniser automatiquement le fuseau horaire à partir du réseau

Paramètres.Global.AUTO_TIME_ZONE

def_accelerometer_rotation

1=oui, 0=non S'il faut activer la rotation automatique (c'est-à-dire s'il faut faire pivoter la direction de l'écran en fonction du capteur d'accélération)

Paramètres.Système.ACCELEROMETER_ROTATION

def_screen_brightness

Luminosité par défaut de l'écran (plage de valeurs comprise entre 0 et 255)

Paramètres.Système.SCREEN_BRIGHTNESS

def_screen_brightness_automatic_mode

S'il faut activer le réglage automatique de la luminosité de l'écran

Paramètres.System.SCREEN_BRIGHTNESS_MODE

def_window_animation_scale

1=oui, 0=pas de mise à l'échelle de l'animation de la fenêtre

Paramètres.System.WINDOW_ANIMATION_SCALE

def_window_transition_scale

1=oui, 0=pas de transparence de la fenêtre

Paramètres.System.TRANSITION_ANIMATION_SCALE

def_haptic_feedback

Qu'il s'agisse d'activer le retour tactile, je ne sais pas ce que cela signifie.

Paramètres.System.HAPTIC_FEEDBACK_ENABLED

def_bluetooth_on

0 = désactivé 1 = activé Si le Bluetooth doit être activé par défaut

Paramètres.Global.BLUETOOTH_ON

def_wifi_display_on

0 = désactivé. 1 = activé. S'il faut activer l'affichage Wi-Fi.

Paramètres.Global.WIFI_DISPLAY_ON

def_install_non_market_apps

S'il faut autoriser l'installation d'applications qui ne sont pas téléchargées depuis l'App Store : 1 = Autoriser l'installation via les packages d'installation, 0 = Ne pas autoriser l'installation via les packages d'installation

Paramètres.Secure.INSTALL_NON_MARKET_APPS

def_package_verifier_enable

Effectuez une vérification du certificat avant d'installer l'application, 1 vérifie, 0 ne vérifie pas

Paramètres.Global.PACKAGE_VERIFIER_ENABLE

def_location_providers_allowed

S'il faut activer le GPS. Si la chaîne est nulle, le GPS ne sera pas activé par défaut. Vous devez également utiliser LOCATION_MODE pour juger.

Paramètres.Secure.LOCATION_PROVIDERS_ALLOWED

assisted_gps_enabled

S'il faut activer les applications GPS auxiliaires

Paramètres.Global.ASSISTED_GPS_ENABLED

def_netstats_enabled

S'il faut activer les statistiques de trafic

Paramètres.Global.NETSTATS_ENABLED

def_usb_mass_storage_enabled

S'il faut activer le stockage de masse USB

Paramètres.Global.USB_MASS_STORAGE_ENABLED

def_wifi_on

Le wifi est-il activé par défaut ?

Paramètres.Global.WIFI_ON

def_wifi_sleep_policy

Que le wifi soit en veille (basculement avec le réseau mobile) est 0-jamais, 1-uniquement lorsqu'il est branché, 2-toujours

Paramètres.Global.WIFI_SLEEP_POLICY

def_networks_available_notification_on

S'il faut avertir l'utilisateur d'ouvrir le réseau

Paramètres.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON

def_backup_enabled

0-désactivé, 1-activé s'il faut activer la sauvegarde des paramètres

Paramètres.Secure.BACKUP_ENABLED

def_backup_transport

Transférer des fichiers pour la sauvegarde ou la récupération

Paramètres.Secure.BACKUP_TRANSPORT

def_notification_pulse

Lorsqu'une notification arrive, le voyant LED doit-il clignoter à plusieurs reprises ?

Paramètres.System.NOTIFICATION_LIGHT_PULSE

def_mount_play_notification_snd

S'il faut écouter la sonnerie de notification lorsqu'un événement survient

Paramètres.Secure.MOUNT_PLAY_NOTIFICATION_SND

def_mount_ums_autostart

S'il faut démarrer automatiquement le système de détection d'hôte

Paramètres.Secure.MOUNT_UMS_AUTOSTART

def_mount_ums_prompt

S'il faut afficher une notification lorsque l'hôte est détecté

Settings.Secure.MOUNT_UMS_PROMPT

def_mount_ums_notify_enabled

Settings.Secure.MOUNT_UMS_NOTIFY_ENABLED

当开启ums时是否显示通知

def_power_sounds_enabled

电量过低时是否铃声通知

Settings.Global.POWER_SOUNDS_ENABLED

def_low_battery_sound

低电量时播放的铃声文件来源

Settings.Global.LOW_BATTERY_SOUND

def_dock_sounds_enabled

当插拔电源时是否播放声音

Settings.Global.DOCK_SOUNDS_ENABLED

def_desk_dock_sound

插上电源时播放的音频文件

Settings.Global.DESK_DOCK_SOUND

def_desk_undock_sound

拔下电源时播放的音频文件

Settings.Global.DESK_UNDOCK_SOUND

def_car_dock_sound

使用车载电源充电时播放的音频文件

Settings.Global.CAR_DOCK_SOUND

def_car_undock_sound

当从车载电源拔下时播放的音频文件

Settings.Global.CAR_UNDOCK_SOUND

def_lockscreen_sounds_enabled

当解锁或是锁屏时是否播放声音

Settings.System.LOCKSCREEN_SOUNDS_ENABLED

def_lock_sound

锁屏时播放的音频文件

Settings.Global.LOCK_SOUND

def_unlock_sound

解锁时播放的音频文件

Settings.Global.UNLOCK_SOUND

def_trusted_sound

在未解锁的情况下设备进入到可信任状态时播放的音频文件

Settings.Global.TRUSTED_SOUND

def_wireless_charging_started_sound

开启无线充电时播放声音

Settings.Global.WIRELESS_CHARGING_STARTED_SOUND

def_lockscreen_disabled

第一次开机时默认不锁屏(若要彻底去掉锁屏页面还需要在别的方法中设置)

Settings.System.LOCKSCREEN_DISABLED

def_device_provisioned

设备是否已经被配置(该参数考虑的时多用户不同时刻使用同一个设备的情况)

Settings.Global.DEVICE_PROVISIONED

def_dock_audio_media_enabled

使用dock音频输出媒体

Settings.Global.DOCK_AUDIO_MEDIA_ENABLED

def_vibrate_in_silent

静音模式下是否允许震动

Settings.System.VIBRATE_IN_SILENT

def_accessibility_script_injection

是否增强js的屏幕阅读性

Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION

def_accessibility_speak_password

访问模式下是否语音播报密码

Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD

def_low_battery_sound_timeout

当经过一定时间后,如果低电量提醒为播放声音,则灭屏

Settings.Global.LOW_BATTERY_SOUND_TIMEOUT

def_lock_screen_show_notifications

是否在锁屏界面显示通知

Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS

def_lock_screen_allow_private_notifications

允许在锁屏界面上显示私有通知,就像是解锁状态下一样

Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS

def_wifi_scan_always_available

设置-wlan-高级-随时扫描开关

Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE

7、adb命令获取/修改/设置值

C:\Users\jiabao.guan>adb shell settings get system screen_off_timeout
60000

C:\Users\jiabao.guan>adb shell settings put system guan 66
C:\Users\jiabao.guan>adb shell settings get system guan
66

C:\Users\jiabao.guan>adb shell settings put system screen_off_timeout 120000
C:\Users\jiabao.guan>adb shell settings get system screen_off_timeout
120000

八、添加辅助菜单

测试目标:

为系统设置最底部增加一项菜单项(title:辅助功能),进入辅助功能菜单项,设置一个<SwitchPreference>项(高对比度字体),和两个<Preference>项(颜色调整和多彩屏幕)。

1、top_level_settings.xml

在res/xml/top_level_settings.xml配置文件中增加一个<Preference>标签,并为<Preference>标签设置相关属性(fragment属性和controller属性需要配置该类的全限定类名)。

    <Preference
        android:key="assistant_function"
        android:title="@string/assistant_function"
        android:summary="@string/assistant_summary"
        android:icon="@drawable/ic_homepage_support"
        android:order="30"
        android:fragment="com.android.settings.assistant.AssistantFunctionDashboardFragment"
        settings:controller="com.android.settings.assistant.AssistantFunctionPreferenceController"/>

2、assistant

配置好后创建com.android.settings.assistant包,在该包下创建这两个类。(AssistantFunctionDashboardFragment类和AssistantFunctionPreferenceController类)

3、AssistantFunctionDashboardFragment

package com.android.settings.assistant;

import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.SearchIndexableRaw;
import com.android.settings.wiosfeature.firebase.ServiceUtils;
import android.content.Context;
import android.os.Bundle;
import androidx.preference.Preference;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
import android.provider.SearchIndexableResource;
import java.util.ArrayList;
import java.util.List;
import android.util.Log;

/**
 * @Author : 柒
 * @Time : 2022/8/24 14:17
 */
public class AssistantFunctionDashboardFragment extends SettingsPreferenceFragment {

    private static final Object TAG = "AssistantFunctionDashboardFragment";
    private Context mContext;

    @Override
    public int getMetricsCategory() {
        return MetricsProto.MetricsEvent.SETTINGS_SYSTEM_CATEGORY;
    }

    //创建二级菜单
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        super.onCreatePreferences(savedInstanceState, rootKey);
        addPreferencesFromResource(R.xml.assistant_function);
    }


    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext = context;
    }

    // 为每个二级菜单项设置点击事件
    @Override
    public boolean onPreferenceTreeClick(Preference preference) {
        String key = preference.getKey();
        android.util.Log.i("AssistantFunctionDashboardFragment", "guan+onPreferenceTreeClick: " + key);
        switch (key){
            case "color_adjustment":
                android.util.Log.i("AssistantFunctionDashboardFragment", "guan+color_adjustment: " + key);
                break;
            case "colorful_screen":
                android.util.Log.i("AssistantFunctionDashboardFragment", "guan+colorful_screen: " + key);
                break;
        }
        return true;
    }

    /**
     * For Search.
     */
    public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
            new BaseSearchIndexProvider(R.xml.assistant_function) {
                @Override
                protected boolean isPageSearchEnabled(Context context) {
                    return super.isPageSearchEnabled(context);
                }

                @Override
                public List<SearchIndexableResource> getXmlResourcesToIndex(Context context, boolean enabled) {
                    return super.getXmlResourcesToIndex(context, enabled);
                }

            };
}

4、AssistantFunctionPreferenceController

package com.android.settings.assistant;

import com.android.settings.core.BasePreferenceController;
import android.content.Context;
/**
 * @Author : 柒
 * @Time : 2022/8/24 14:17
 */
public class AssistantFunctionPreferenceController extends BasePreferenceController {


    //调用父类的构造方法
    public AssistantFunctionPreferenceController(Context context, String preferenceKey) {
        super(context, preferenceKey);
    }

    //实现该菜单项的显示
    @Override
    public int getAvailabilityStatus() {
        return AVAILABLE;
    }
}

5、AssistantFunctionDashboardActivity

在Settings目录下创建

package com.android.settings;

/**
 * @Author : 柒
 * @Time : 2022/8/24 15:11
 */
public class AssistantFunctionDashboardActivity extends SettingsActivity{
}

6、assistant_function.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:settings="http://schemas.android.com/apk/res-auto"
    android:title="@string/assistant_function"
    android:key="assistant_function_key">

    <SwitchPreference
        android:key="high_contrast_font"
        android:title="@string/high_contrast_font"
        android:summary="@string/high_contrast_font_summary"
        />

    <Preference
        android:key="color_adjustment"
        android:title="@string/color_adjustment"
        android:summary="@string/color_adjustment_summary"/>

    <Preference
        android:key="colorful_screen"
        android:title="@string/colorful_screen"
        android:summary="@string/colorful_screen_summary"/>

</PreferenceScreen>

7、AndroidManifest.xml

        <!--辅助功能-->
        <activity
            android:name="Settings$AssistantFunctionDashboardActivity"
            android:label="@string/assistant_function">
            <intent-filter android:priority="12">
                <action android:name="com.android.settings.action.SETTINGS" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                android:value="com.android.settings.assistant.AssistantFunctionDashboardFragment" />
        </activity>

8、Settings

public static class DateTimeSettingsActivity extends SettingsActivity { /* empty */ }

9、SettingsGateway

在SettingsGateway类的ENTRY_FRAGMENTS数组中加入AssistantFunctionDashboardFragment类名,在SETTINGS_FOR_RESTRICTED数组中加入AssistantFunctionPreferenceController类名

    public static final String[] SETTINGS_FOR_RESTRICTED = {
            // Home page
            AssistantFunctionPreferenceController.class.getName(),
        .....
                }



    public static final String[] ENTRY_FRAGMENTS = {
            AssistantFunctionDashboardFragment.class.getName(),
        ....
    }

10、strings

    <string name="assistant_function">assistant &amp; function</string>
    <string name="assistant_summary">assistant &amp; summary</string>

    <string name="high_contrast_font">high_contrast &amp; contrast_font</string>
    <string name="high_contrast_font_summary">high_contrast_font &amp; summary</string>

    <string name="color_adjustment">color &amp; adjustment</string>
    <string name="color_adjustment_summary">color_adjustment &amp; summary</string>

    <string name="colorful_screen">colorful &amp; screen</string>
    <string name="colorful_screen_summary">colorful_screen &amp; summary</string>
    <string name="assistant_function" msgid="3235725053332345774">"辅助功能"</string>
    <string name="assistant_summary" msgid="3235725053332345775">"高对比度字体、颜色调整、多彩屏幕"</string>

    <string name="high_contrast_font" msgid="3235725053332345776">"高对比度字体"</string>
    <string name="high_contrast_font_summary" msgid="3235725053332345777">"高对比度字体"</string>

    <string name="color_adjustment" msgid="3235725053332345778">"颜色调整"</string>
    <string name="color_adjustment_summary" msgid="3235725053332345779">"颜色调整"</string>

    <string name="colorful_screen" msgid="3235725053332345710">"多彩屏幕"</string>
    <string name="colorful_screen_summary" msgid="3235725053332345711">"多彩屏幕"</string>

Je suppose que tu aimes

Origine blog.csdn.net/weixin_47465999/article/details/131596008
conseillé
Classement