Proceso de inicio de configuración de Android11

1. Página de inicio de configuración del sistema (menú de primer nivel) :

1 、 Configuración

La razón por la que se define una actividad vacía aquí es para que las aplicaciones externas puedan saltar directamente a la interfaz XX_SettingsActivity, porque si es solo un fragmento, el exterior no puede saltar a la interfaz del fragmento. Al saltar a XX_SettingsActivity, se ejecutará su clase principal. Método en SettingsActivity.java, y según la información de registro de XX_SettingsActivity en el archivo de manifiesto y su valor de metadatos, busque el fragmento (XX_Settings) correspondiente a XX_SettingsActivity, muestre la interfaz del fragmento e implemente la puerta trasera.

2、AndroidManifest.xml

La interfaz principal Actividad de Configuración usa Configuración.java, y la subinterfaz Actividad usa SubSettings.java. Las clases internas en Configuración y SubConfiguración son todas actividades vacías (los siete métodos del ciclo de vida no se anulan) y todas se heredan de ConfiguraciónActividad.

Del archivo AndroidManifest.xml, sabemos que la página principal es .homepage.SettingsHomepageActivity.

Tome WifiSettings como ejemplo

3、ConfiguraciónActividad de la página de inicio

①onCrear

②mostrarFragmento

La implementación de la carga de fragmentos se implementa en el método de encapsulación.

4、Configuración de nivel superior

TopLevelSettings hereda de la clase abstracta DashboardFragment, implementa el método abstracto getPreferenceScreenResId() y devuelve el archivo de configuración de preferencias para completar la configuración estática.

Otra cosa importante en la clase TopLevelSettings es que en el método onAttach () se llama al método onAttach () de la clase principal DashboardFragment, que se utiliza principalmente para cargar controladores de preferencias.

5、top_level_settings.xml

La etiqueta principal es una etiqueta <PreferenceScreen>, que contiene varias etiquetas <Preference>. Cada etiqueta <Preferencia> corresponde a cada elemento de configuración en la página de inicio.

llave

La clave principal del elemento de configuración.

título

El título del elemento de configuración.

resumen

Quieres el texto debajo del título

icono

icono frontal

orden

Se utiliza para ordenar: cuanto menor sea el valor, mayor será la clasificación.

fragmento

Haga clic en el elemento para saltar a la interfaz.

controlador

El controlador del elemento controla la visualización de su contenido, su disponibilidad y también puede controlar sus eventos de clic, etc.

5. Fragmento del panel de control

①onCreatePreferences

②actualizar todas las preferencias

③displayResourceTiles

El método addPreferencesFromResource agrega todas las Preferencias enpreferenceScreen a ArrayList, luego construye y genera un PreferenceGroupAdapter basado en esta colección y finalmente configura este adaptador en la vista de lista para completar el enlace de datos y así completar la carga de la interfaz.

④actualizar mosaicos del tablero

⑤onAdjuntar

    @Override 
    public void onAttach(Contexto contexto) { 
        super.onAttach(contexto); 
        mSuppressInjectedTileKeys = Arrays.asList(context.getResources().getStringArray( 
                R.array.config_suppress_injected_tile_keys)); 
        mDashboardFeatureProvider = FeatureFactory.getFactory(contexto). 
                getDashboardFeatureProvider(contexto); 
        // Cargar controladores de preferencias desde el código 
        //从代码加载首选项控制器
        final List<AbstractPreferenceController> controladoresFromCode = 
                createPreferenceControllers(context); 
        // Cargar controladores de preferencias desde la definición xml 
        //Cargar controladores de preferencias desde la definición xml
        final List<BasePreferenceController> controladoresFromXml = PreferenceControllerListHelper 
                .getPreferenceControllersFromXml(context, getPreferenceScreenResId()); 
        // Filtrar controladores basados ​​en xml 
        en caso de que ya se haya creado un controlador similar a partir de código. 
        final List<BasePreferenceController> UniqueControllerFromXml = 
                PreferenceControllerListHelper.filterControllers( 
                        controladoresFromXml, controladoresFromCode); 
        // Agregar controladores únicos a la lista. 
        //Agregar controladores únicos a la lista 
        if (controllersFromCode! = null) { 
            mControllers.addAll(controllersFromCode); 
        }

        mControllers.addAll(uniqueControllerFromXml); 

        // Y conectarnos con el ciclo de vida. 
        //并与生命周期联系起来。
        ciclo de vida final ciclo de vida = getSettingsLifecycle(); 
        UniqueControllerFromXml.forEach(controlador -> { 
            if (controlador instancia de LifecycleObserver) { 
                lifecycle.addObserver((LifecycleObserver) controlador); 
            } 
        }); 
        // Establecer categoría de métricas para BasePreferenceController. 
        //为 BasePreferenceController 设置指标类别。
        final int metricCategory = getMetricsCategory(); 
        mControllers.forEach(controlador -> { 
            if (instancia de controlador de BasePreferenceController) {
                (controlador (BasePreferenceController)).setMetricsCategory(metricCategory); 
            } 
        }); 

        mPlaceholderPreferenceController = 
                nuevo DashboardTilePlaceholderPreferenceController(contexto); 
        mControllers.add(mPlaceholderPreferenceController); 
        for (controlador AbstractPreferenceController: mControllers) { 
            addPreferenceController(controlador); 
        } 
    }

2. Implementación del menú secundario de configuración del sistema.

1 、 Subconfiguraciones

La interfaz del menú secundario Actividad de la configuración del sistema es la clase SubSettings. Aunque la clase SubSettings es una Actividad, es una Actividad vacía y no hereda el ciclo de vida de Activity7.

2、Actividad de configuración

①onCrear

Archivo de diseño: settings_main_prefs

Fragmento de inicio

②obtenerMetaDatos

Tome WifiSettingsActivity como ejemplo

③getIntent

④getStartingFragmentClass

⑤iniciarConfiguraciónFragmento

⑥cambiar a fragmento

3、settings_main_prefs.xml

El archivo de diseño consta de etiquetas <SwitchBar>, <FrameLayout> y <RelativeLayout>. La etiqueta <RelativeLayout> está oculta de forma predeterminada. Según la identificación de la etiqueta <FrameLayout>, se puede juzgar que esta etiqueta es el contenido de la interfaz principal de la barra de menú secundaria.

 3. Cargar brillo predeterminado

1、top_level_settings.xml

2、AndroidManifest.xml

3、Configuración de pantalla

①obtenerPreferenceScreenResId

②buildPreferenceControllers

4、display_settings.xml

5、Controlador de preferencias de brillo automático

6、Controlador de preferencia de nivel de brillo

①obtener brillo actual

②convertir lineal a gamma flotante

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

<tipo de configuración="sistema" nombre="screen_brightness_float" valor="0.35896719"/>

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

< ID de configuración ="491" nombre ="screen_brightness_float" valor ="0.3597016" paquete ="android" defaultValue ="0.35896719" defaultSysSet ="true" />
 

4. Ajuste de fuente

1、display_settings

2、Controlador de preferencias de tamaño de fuente

3、Alternar fragmento de preferencia de tamaño de fuente

4、valores-zh-rCN/arrays.xml

5. matrices.xml

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

<tipo de configuración="sistema" nombre="font_scale" valor="1.0"/>

5. Tiempo de espera de la pantalla

1、Controlador de preferencias de tiempo de espera

2, matrices.xml

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

6. Mostrar energía en tiempo real

1、top_level_settings.xml

2、AndroidManifest.xml

3. Controlador de preferencia de batería de nivel superior

El elemento de configuración se configura con el controlador TopLevelBatteryPreferenceController, que hereda de AbstractPreferenceController. Esta clase abstracta se utiliza para administrar de manera uniforme todos los elementos del menú (como mostrar u ocultar, escuchar eventos de clic, etc.).

public class TopLevelBatteryPreferenceController extiende BasePreferenceController implements 
        LifecycleObserver, OnStart, OnStop { 

    // transmisión de cambio de batería 
    privado final BatteryBroadcastReceiver mBatteryBroadcastReceiver; 
    // elemento de configuración actual 
    privado Preferencia mPreference; 
    // información de la batería 
    privada BatteryInfo mBatteryInfo; 

    // inicializa la transmisión de cambio de batería 
    pública TopLevelBatteryPreferenceController (contexto de contexto) , Cadena preferenciaKey) { 
        super(contexto, preferenciaKey); 
        mBatteryBroadcastReceiver = nuevo BatteryBroadcastReceiver(mContext); 
        mBatteryBroadcastReceiver.setBatteryChangedListener(tipo -> { 
            BatteryInfo.getBatteryInfo(mContext, info -> {
                mBatteryInfo = información; 
                actualizarEstado(mPreferencia); 
            }, verdadero /* cadenacorta */); 
        }); 
    } 

    // 控制该项是否可用
    @Override 
    public int getAvailabilityStatus() { 
        return mContext.getResources().getBoolean(R.bool.config_show_top_level_battery) 
                ? DISPONIBLE: UNSUPPORTED_ON_DEVICE; 
    } 

    @Override 
    public void displayPreference(pantalla PreferenceScreen) { 
        super.displayPreference(pantalla); 
        // 获取当前的配置项
        mPreference = screen.findPreference(getPreferenceKey()); 
    } 

    @Override 
    public void onStart() {
        //Registrar la transmisión  
        mBatteryBroadcastReceiver .registro ();
    } 

    @Override 
    public void onStop() { 
        //Anular el registro de la transmisión 
        mBatteryBroadcastReceiver.unRegister(); 
    } 

    @Override 
    public CharSequence getSummary() { 
        // Devolver la descripción general de la batería 
        return getDashboardLabel(mContext, mBatteryInfo); 
    } 

    / / Obtener información de la batería 
    estática CharSequence getDashboardLabel (contexto contexto, información BatteryInfo) { 
        if (info == null || contexto == null) { 
            return null; 
        } 
        CharSequence etiqueta; 
        if (!info.discharging && info.chargeLabel != null) { 
            etiqueta = info.chargeLabel;
        } else if (info.remainingLabel == null) { 
            etiqueta = info.batteryPercentString; 
        } else { 
            etiqueta = context.getString(R.string.power_remaining_settings_home_page, 
                    info.batteryPercentString, 
                    info.remainingLabel); 
        } 
        etiqueta de devolución; 
    } 
}

4. Resumen

  1. Inicializar la transmisión de cambio de energía en el método de construcción.
  2. Registrar y cancelar el registro de transmisiones en onStart() y onStop()
  3. Una vez que se recibe la transmisión del cambio de energía, la información de energía se guarda en mBatteryInfo.
  4. Luego ejecute updateState(), que llamará a getSummary() para establecer la información en el elemento de configuración actual.
  5. En getSummary(), analiza la información de energía guardada por mBatteryInfo

7. Proveedor del sistema

Los datos de configuración del sistema Android se almacenan en /data/data/com.android.providers.settings/databases/settings.db

¿Hay un valor predeterminado?

Al buscar el valor predeterminado de un interruptor, primero debe comprender si existe un valor predeterminado para el interruptor y si el estado del interruptor tiene un estado guardado (generalmente el estado se almacena en la base de datos de configuración). Condiciones de evaluación: el valor predeterminado se puede encontrar solo después de que el estado del interruptor aún se guarde después del reinicio o el estado del interruptor se restablezca al valor predeterminado después del reinicio (restaurar la configuración de fábrica) .

El estado del conmutador aún se guarda después del reinicio, lo que significa que el estado se almacena en la base de datos. Después del reinicio, el estado del interruptor vuelve al valor predeterminado, lo que indica que el estado tiene un valor predeterminado.

Por ejemplo, los interruptores wiif, los interruptores Bluetooth, los interruptores GPS, etc. tienen valores predeterminados y los valores de estado se guardan en la base de datos.

En cuanto al cambio de punto de acceso WiFi, el estado no se guarda después del reinicio, así que no desperdicie sus esfuerzos para encontrar su valor predeterminado o el valor de almacenamiento de estado.

Modificar valor predeterminado

La mayor parte del estado del interruptor se almacena en la base de datos de ConfiguraciónProvider.Hay tres archivos relacionados con el valor de estado.

  1. /frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java: el valor de estado se almacena en este archivo
  2. /frameworks/base/packages/SettingsProvider/res/values/defaults.xml: define el valor predeterminado del estado del interruptor
  3. /frameworks/base/core/java/android/provider/Settings.java: define la clave correspondiente al almacenamiento de valores predeterminado de cada estado del interruptor.
  4. Z:\k630_64\vendor\tinno\k630_64\trunk\etc\settings-config.xml Los valores predeterminados para brillo, tamaño de fuente, pantalla de bloqueo y otras configuraciones se configuran aquí

Tome el tiempo de espera de la pantalla como ejemplo

1、Controlador de preferencias de tiempo de espera

    @Override 
    public void updateState(Preferencia de preferencia) { 
        final TimeoutListPreference timeoutListPreference = (TimeoutListPreference) preferencia; 
        //系统没有提供SCREEN_OFF_TIMEOUT才使用FALLBACK_SCREEN_TIMEOUT_VALUE 
        final long currentTimeout = Settings.System.getLong(mContext.getContentResolver(), 
                SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE); 
    }

2、Ayudante de base de datos

No todos los valores predeterminados se configuran leyendo defaults.xml, y algunos se configuran directamente en DatabaseHelper.java.

Por ejemplo, loadSetting(stmt, Settings.Secure.ADB_ENABLED, 1); este modificador de depuración de ADB se escribe directamente en el archivo de la base de datos.

Con respecto al interruptor de depuración USB, también puede configurarlo en el archivo systemui/usb/StorageNotification.java de systemui para determinar si hay un número IMEI.

Al analizar el código, si descubre que este elemento no se puede encontrar en defaults.xml, busque directamente en el archivo DatabaseHelper.java.

private void loadSystemSettings(SQLiteDatabase db) { 
    //数据库名
    private static final String DATABASE_NAME = "settings.db"; 
    
    SQLiteStatement stmt = nulo; 
    try { 
        stmt = db.compileStatement("INSERTAR O IGNORAR EN el sistema(nombre,valor)" 
                + "VALORES(?,?);"); 


        //SCREEN_OFF_TIMEOUT设置def_screen_off_timeout 
        //def_screen_off_timeout在defaults.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, clave de cadena, valor del objeto) { 
    // 
    stmt.bindString(1, clave); 
    stmt.bindString(2, valor.toString()); 
    stmt.execute(); 
} 
    
..... 
    
cadena final estática PARTNER_SETTINGS_PATH ="etc/settings-config.xml"; 
actualización vacía privadaSystemSecureSettings(SQLiteDatabase db) {   
    FileReader settingsReader; 
    configuración final del archivoArchivo = nuevo archivo(Environment.getRootDirectory(), PARTNER_SETTINGS_PATH); 
    Pruebe { 
        settingsReader = new FileReader(settingsFile);
    } captura (FileNotFoundException e) {
        Log.w(TAG, "No se puede abrir" + Environment.getRootDirectory() + "/" + PARTNER_SETTINGS_PATH); 
        devolver; 
    }

3. valores predeterminados.xml

<recursos> 
    <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">falso</bool> 
    ......

4、Configuración.java

        /** 
         * La cantidad de tiempo en milisegundos antes de que el dispositivo entre en modo de suspensión o comience 
         * a soñar después de un período de inactividad. Este valor también se conoce como 
         * período de tiempo de espera de la actividad del usuario, ya que la pantalla no necesariamente se apaga 
         * cuando expira. 
         * 
         * <p> 
         * Este valor está limitado por el tiempo de espera máximo establecido por 
         * {@link android.app.admin.DevicePolicyManager#setMaximumTimeToLock(ComponentName, long)}. 
         */ 
        //使用adb命令获取得到,区分大小写:screen_off_timeout 
        public static final String SCREEN_OFF_TIMEOUT = "screen_off_timeout";

5、configuración-config.xml

<?xml versión="1.0" codificación="UTF-8" independiente="yes"?> 
<recursos> 
	<tipo de configuración="global" nombre="auto_time" valor="1"/> 
	<tipo de configuración="global" nombre="auto_time_zone" valor="1"/> 
	<tipo de configuración="sistema" nombre="hora_12_24" valor="24"/> 
	<tipo de configuración="sistema" nombre="formato_fecha" valor="dd/MM/aaaa"/> 
	< tipo de configuración="sistema" nombre="accelerometer_rotation" valor="0"/> 
    //屏幕锁定时间
	<tipo de configuración="sistema" nombre="screen_off_timeout" valor="120000"/> 
	<tipo de configuración="nombre del sistema" ="efectos_de_sonido_enabled"valor="0"/> 
        <tipo de configuración="sistema" nombre="haptic_feedback_enabled" valor="0"/> 
        <tipo de configuración="sistema" nombre="dtmf_tone" valor="0"/> 
        <tipo de configuración="sistema" nombre="lockscreen_sounds_enabled" valor="0"/>
	<tipo de configuración="sistema" nombre="brillo_pantalla" valor="56"/> 
    
	<tipo de configuración="sistema" nombre="modo_brillo_pantalla" valor="1"/> 
    //字体大小
    <tipo de configuración="nombre del sistema" ="font_scale" valor="1.0"/ 
	> <tipo de configuración="system" nombre="status_bar_show_battery_percent" valor="1"/> 
	<tipo de configuración="global" nombre="install_non_market_apps" valor="0"/> 
	<tipo de configuración="nombre seguro" ="backup_enabled" value="0"/> 
	<tipo de configuración="secure" name="charging_sounds_enabled" value="0"/> 
    //屏幕亮度
	<tipo de configuración="system" name="screen_brightness_float" value="0.35896719 "/>
	<tipo de configuración="secure" name="backup_transport" value="com .google.android.backup/.BackupTransportService"/> 
	<configuración tipo="secure" nombre="default_input_method" valor="com.google.android.inputmethod .latin/com.android.inputmethod.latin.LatinIME"/> 
	<configuración tipo="secure" name="enabled_input_methods" value="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"/> 
	<tipo de configuración="sistema" nombre="ipo_setting" valor="0"/> 
        <tipo de configuración="global" nombre="nombre_dispositivo" valor="K630"/> 
	<!--
	<tipo de configuración="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"/> 
	<tipo de configuración="system" name="lowrawapp_optimize_limit_num" value="4"/> 
	<tipo de configuración="system" name="lowrawapp_optimize_limit_sum" value="6"/> 
	<tipo de configuración="system" name="lowrawapp_optimize_Custom_packages" value="com.kugou.android"/> 
	<tipo de configuración="sistema" nombre="lowrawapp_optimize_cpuload_normal" valor="12.5"/>
	<tipo de configuración="sistema" nombre="lowrawapp_optimize_cpuload_high" valor="13.5"/> 
	<tipo de configuración="sistema" nombre="lowrawapp_optimize_cpuload_ultrahigh" valor="16.5"/> 
	<tipo de configuración="sistema" nombre="lowrawapp_optimize_topPss_large" valor="260000"/> 
	<tipo de configuración="sistema" nombre="lowrawapp_optimize_topPss_resume" valor="150000"/> <tipo de 
	configuración="sistema" nombre="lowrawapp_optimize_topPss_ultralarge" valor="340000"/> 
	--> 
    <! -- FEATURE_SINGLE_HAND hsg 20190904--> 
    <tipo de configuración="global" nombre="enable_single_hand" valor="1" /> 
    <!-- TINNO FINAL --> 
</resources>

6.Valor predeterminado

valor

significado

llave

def_dim_pantalla

0=no 1=sí: si se debe atenuar gradualmente el brillo de la pantalla

Configuración.Sistema.DIM_SCREEN

def_screen_off_timeout

¿Cuántos segundos se apaga la pantalla después de no realizar ninguna operación?

Configuración.Sistema.SCREEN_OFF_TIMEOUT

def_sleep_timeout

La cantidad de segundos para dormir después de no realizar ninguna operación (este valor es más largo que el tiempo de apagado de la pantalla, porque la pantalla se apagará antes de dormir)

Configuración.Secure.SLEEP_TIMEOUT

def_airplane_mode_on

¿Está activado el modo avión de forma predeterminada?

Configuración.Global.AIRPLANE_MODE_ON

def_theater_mode_on

¿El modo teatro está habilitado de forma predeterminada?

Configuración.Global.THEATER_MODE_ON

def_airplane_mode_radios

Lista de interruptores que se desactivarán cuando se active el modo avión (normalmente incluye Bluetooth, wifi, nfc, etc.)

Configuración.Global.AIRPLANE_MODE_RADIOS

radios_conmutables_modo_avión

Lista de interruptores que los usuarios pueden activar manualmente en modo avión

Configuración.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS

def_auto_time

1=sí, 0=no Si se sincroniza automáticamente la fecha, hora y zona horaria desde la red

Configuración.Global.AUTO_TIME

def_auto_time_zone

1=sí, 0=no Si se sincroniza automáticamente la zona horaria desde la red

Configuración.Global.AUTO_TIME_ZONE

def_accelerometer_rotation

1 = sí, 0 = no Si se activa la rotación automática (es decir, si se gira la dirección de la pantalla de acuerdo con el sensor de aceleración)

Configuración.Sistema.ACCELEROMETER_ROTATION

def_screen_brightness

Brillo predeterminado de la pantalla (el rango de valores es 0–255)

Configuración.Sistema.SCREEN_BRIGHTNESS

def_screen_brightness_modo_automático

Si activar el ajuste automático del brillo de la pantalla

Configuración.Sistema.SCREEN_BRIGHTNESS_MODE

def_window_animation_scale

1=sí, 0=sin escala de animación de ventana

Configuración.System.WINDOW_ANIMATION_SCALE

def_window_transition_scale

1=sí, 0=sin transparencia de ventana

Configuración.Sistema.TRANSITION_ANIMATION_SCALE

def_haptic_feedback

Ya sea para habilitar la retroalimentación táctil, no sé qué significa.

Configuración.Sistema.HAPTIC_FEEDBACK_ENABLED

def_bluetooth_on

0=desactivado 1=activado Si se activa Bluetooth de forma predeterminada

Configuración.Global.BLUETOOTH_ON

def_wifi_display_on

0 = deshabilitado 1 = habilitado Si se activa la pantalla wifi

Configuración.Global.WIFI_DISPLAY_ON

def_install_non_market_apps

Si se permite la instalación de aplicaciones que no se descargan de la tienda de aplicaciones: 1 = Permitir la instalación a través de paquetes de instalación, 0 = No permitir la instalación a través de paquetes de instalación

Configuración.Secure.INSTALL_NON_MARKET_APPS

def_package_verifier_enable

Realice la verificación del certificado antes de instalar la aplicación, 1 verifica, 0 no verifica

Configuración.Global.PACKAGE_VERIFIER_ENABLE

def_ubicación_proveedores_permitidos

Ya sea para habilitar el GPS. Si la cadena es nula, el GPS no estará habilitado de forma predeterminada. También debe usar LOCATION_MODE para juzgar.

Configuración.Secure.LOCATION_PROVIDERS_ALLOWED

gps_asistido_enabled

Si habilitar aplicaciones GPS auxiliares

Configuración.Global.ASSISTED_GPS_ENABLED

def_netstats_enabled

Si se deben habilitar las estadísticas de tráfico

Configuración.Global.NETSTATS_ENABLED

def_usb_mass_storage_enabled

Si se debe habilitar el almacenamiento masivo USB

Configuración.Global.USB_MASS_STORAGE_ENABLED

def_wifi_on

¿El wifi está habilitado de forma predeterminada?

Configuración.Global.WIFI_ON

def_wifi_sleep_policy

Si el wifi está inactivo (cambiando de un lado a otro con la red móvil) es 0-nunca, 1-solo cuando está enchufado, 2-siempre

Configuración.Global.WIFI_SLEEP_POLICY

def_networks_available_notification_on

Ya sea para notificar al usuario que abra la red

Configuración.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON

def_backup_enabled

0-deshabilitado, 1-habilitado si se debe habilitar la copia de seguridad de la configuración

Configuración.Secure.BACKUP_ENABLED

def_backup_transport

Transferir archivos para copia de seguridad o recuperación

Configuración.Secure.BACKUP_TRANSPORT

def_notificación_pulse

Cuando llega una notificación, ¿la luz LED debería parpadear repetidamente?

Configuración.Sistema.NOTIFICATION_LIGHT_PULSE

def_mount_play_notification_snd

Si se reproduce el tono de notificación cuando llega un evento

Configuración.Secure.MOUNT_PLAY_NOTIFICATION_SND

def_mount_ums_autostart

Si se debe iniciar automáticamente el sistema de detección de host

Configuración.Secure.MOUNT_UMS_AUTOSTART

def_mount_ums_prompt

Si se muestra una notificación cuando se detecta el host

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>

Supongo que te gusta

Origin blog.csdn.net/weixin_47465999/article/details/131596008
Recomendado
Clasificación