Cómo personalizar la interfaz principal de Android
Esto lo podemos conseguir modificando el framework.
A continuación se muestra un ejemplo del código fuente de Android 2.1 para una ilustración práctica.
1) Primero, comprenda el proceso de inicio de Android.
El inicio de Android primero comienza con Zygote, y luego... (no hablaré del proceso intermedio)... Hasta SystemServer (framework), consulte el siguiente código:
/**
* Zygote llama a este método para inicializar el sistema. Esto iniciará los servicios locales
* (SurfaceFlinger, AudioFlinger, etc...). Luego, vuelve a llamar a
* init2() para iniciar el servicio de Android.
*/
nativo público estático void init1(String[] args);
public static void main(String[] args) {
if (SamplingProfilerIntegration.isEnabled()) {
SamplingProfilerIntegration.start();
temporizador = nuevo temporizador();
timer.schedule( new TimerTask() {
@Override
public void run() {
SamplingProfilerIntegration.writeSapshot("system.exe.exe.exe.exe.exe .exe.exe.exe.exe.exe.exe.exe.exe.exe.exe.exe.exe.exe.exe.exe.exe.exe.exe.exe.exe.exe.exe.exe.exe.exe.writeSnapshot ("system_server");
}
}, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);
}
// El servidor del sistema debe ser ejecutándose todo el tiempo, por lo que la memoria debe usarse de la manera más eficiente posible
VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
System.loadLibrary("android_servers") ;
init1(args);
}
public static final void init2() {
Log.i(TAG, " Ingresó al servidor del sistema Android ");
Thread thr = new ServerThread();
thr.setName(" android.server.ServerThread");
thr.start() ;
}
}
Inicia varios servicios desde la función principal de SystemServer.
Primero inicie init1 y luego init2.
Como se puede ver en los comentarios anteriores: Zygote llamará al método init1 para inicializar el sistema. init1 iniciará servicios locales como SurfaceFlinger y AudioFlinger. Después de completar estas tareas, llamará a init2 para iniciar. sistema.
Aquí nos centraremos en el proceso init2.
Init2 iniciará el hilo ServerThread,
ServerThread iniciará una serie de servicios, como los siguientes servicios:
ActivityManagerService
EntropyService
PowerManagerService
TelephonyRegistry
PackageManagerService
AccountManagerService
BatteryService
HardwareService
Watchdog
SensorService
BluetoothService
StatusBarService
ClipboardService
InputMethodManagerService
NetStatService
ConnectivityService
AccessibilityManagerService
NotificationManagerService
MountService
DeviceStorageMonitorService
LocationManagerService
SearchManagerService
FallbackCheckinService
WallpaperManagerService
AudioService
BackupManagerService
AppWidgetService
Después de iniciar estos servicios, inicie
((ActivityManagerService)ActivityManagerNative.
Una vez que el sistema esté listo, inicie el iniciador.
Buscando Cuando se inicie, filtrará según el filtro INICIO (definido en Manifiesto
Luego, filtrará según en el HOME filtrado. Inicie HOME. Si solo hay un HOME, inicie ese HOME. Si el usuario ha instalado su propio HOME, aparecerá una lista para que el usuario elija.
Ahora queremos que aparezca el iniciador personalizado desde aquí, pero no queremos que aparezca la pantalla de selección INICIO. No queremos que los usuarios modifiquen nuestra página de inicio. Por ejemplo, nuestra página de inicio tiene muchos anuncios y programas de instalación forzada, y no queremos que los usuarios los eliminen.
Podemos lograr esto mediante:
2) Definir una opción de filtro privado y luego usar esa opción para filtrar INICIO.
Generalmente, utilizamos la En Intent.java(frameworks/base/core/java/android/content/Intent.java) /lixinso:añadir CATEGORY_HOME_FIRST @ SdkConstant( SdkConstantType.INTENT_CATEGORY) public static final String CATEGORY_HOME_FIRST = "android.intent.category. 3) Modificar todos los lugares relacionados con CATEGORY_HOME a HOME_FIRST, principalmente aquellos en el marco Lugar: frameworks/base/services/java/com/android/server/am/ ActivityManagerService. //intent.addCategory(Intent.CATEGORY_HOME); Cambiar to intent.addCategory(Intent.CATEGORY_HOME_ FIRST); //lixinso: // if (r.intent.hasCategory(Intent.CATEGORY_HOME)){ Cambiar a if (r .intent.hasCategory(Intent.CATEGORY_HOME_FIRST)){ //lixinso: Intent.CATEGORY_HOME -> Intent.CATEGORY_HOME_FIRST frameworks/base/services/java/com/android/server/am/ HistoryRecorder.java // _intent.hasCategory(Intent.CATEGORY_HOME) && Cambiar a _intent.hasCategory(Intent.CATEGORY_HOME_ FIRST) && Cambiar a _intent.hasCategory( Intent.CATEGORY_HOME_FIRST)hasCategory(Intent.CATEGORY_HOME_FIRST) && //lixinso: Intent.CATEGORY_HOME->Intent.CATEGORY_HOME_FIRST frameworks/policies/base/mid/com/android/ internal /policies/impl/MidWindowManager. java /// mHomeIntent.addCategory(Intent.CATEGORY_HOME); Cambiar a mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso p> en marcos /policies/base/mid/com/android/internal/policy/impl/ RecentApplicationsDialog.java //new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME ),0 ); Cambiar a nueva Intent( Intent.ACTION_MAIN). Cambiar a mHomeIntent.addCategory( Intent.CATEGORY_HOME_FIRST); //lixinso frameworks/policies); /base/phone/com/android/internal/policy/impl/ RecentApplicationsDialog.java //ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), 0 ); Cambiar a ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),0);