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
- Inicializar la transmisión de cambio de energía en el método de construcción.
- Registrar y cancelar el registro de transmisiones en onStart() y onStop()
- Una vez que se recibe la transmisión del cambio de energía, la información de energía se guarda en mBatteryInfo.
- Luego ejecute updateState(), que llamará a getSummary() para establecer la información en el elemento de configuración actual.
- 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.
- /frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java: el valor de estado se almacena en este archivo
- /frameworks/base/packages/SettingsProvider/res/values/defaults.xml: define el valor predeterminado del estado del interruptor
- /frameworks/base/core/java/android/provider/Settings.java: define la clave correspondiente al almacenamiento de valores predeterminado de cada estado del interruptor.
- 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 & function</string> <string name="assistant_summary">assistant & summary</string> <string name="high_contrast_font">high_contrast & contrast_font</string> <string name="high_contrast_font_summary">high_contrast_font & summary</string> <string name="color_adjustment">color & adjustment</string> <string name="color_adjustment_summary">color_adjustment & summary</string> <string name="colorful_screen">colorful & screen</string> <string name="colorful_screen_summary">colorful_screen & 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>