Red de conocimiento informático - Material del sitio web - Cómo personalizar la interfaz principal de Android

Cómo personalizar la interfaz principal de Android

Si desea personalizar el sistema Android, desea utilizar su propio iniciador (Inicio) como interfaz principal para reemplazar el Inicio que viene con Android, y no desea que un iniciador instalado por el usuario reemplace su iniciador.

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

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);