Cómo empezar a utilizar Android Launcher Switcher al escribir por primera vez
Cualquier usuario que use un teléfono Android debería haber usado una aplicación como Android Launcher. Es una aplicación que puede cambiar el entorno o el funcionamiento del escritorio, o un programa que puede cambiar el usuario. experiencia (UX). Personalmente, prefiero llamarlo Home App porque es un programa que se activa o ejecuta después de presionar el botón Inicio, y también es un programa de escritorio que se ejecuta en la pantalla de inicio, mientras que Launcher en un sentido estricto proviene del oficial; Aplicación de inicio predeterminada de Android, concretamente Launcher.apk. Descargué Android. Descargué la fuente de Android Froyo, el valor predeterminado es Launcher2.apk (com.android.launcher2), ubicado en {SourceDir}/packages/apps.
Las actividades pueden registrar lanzadores en AndroidManifest.xml. Launcher también se llama lanzador y no significa Launcher.apk ni ningún tipo de aplicación principal, sino que se refiere a la aplicación principal (o iniciador) donde se mostrará el punto de entrada de la aplicación. La aplicación principal generalmente no tiene un iniciador registrado, por lo que algunas personas han escrito algunos programas para detectar todas las aplicaciones principales en el sistema, es decir, Home App Switcher, un mejor Switcher también proporcionará la función de borrar y configurar la aplicación principal predeterminada. . Tengo varias aplicaciones de inicio instaladas en mi HTC Incredible S, a saber, Launcher7, ADW, Zeam, Regina, LauncherPro, Home Sample, Home y, por supuesto, el HTC Sense preestablecido. De estos, sólo Zeam está clasificado como lanzador registrado, por lo que puedes encontrarlo en el menú de aplicaciones.
Intentos y filtros de intentos
En Android, los intentos son información básica extremadamente importante. Para el sistema, Intent es como una descripción de la aplicación, similar al concepto de etiquetas. Dependiendo del contenido de la intención, el sistema o la aplicación puede utilizar y buscar otras aplicaciones y los servicios que proporcionan. La información de intención se registra en AndroidManifest.xml del programa y se incluye en el contenido de la etiqueta Intent Filters. La información de intención se registra en AndroidManifest.xml del programa y se incluye en el contenido de la etiqueta Intent Filters. Cuando se busca una aplicación en el sistema, se comparan los filtros de intención de la aplicación y los criterios de búsqueda se encapsulan en un objeto de intención para encontrar programas que cumplan con criterios específicos. El contenido de Intent Filters es como un índice de la aplicación y, si la comparación es exitosa, el contenido se devuelve al ResolveInfo correspondiente. Para obtener más información sobre Intents Para obtener más información sobre Intents, consulte el enlace web oficial [1].
La actividad básicamente registra acciones y categorías en el filtro de intención de AndroidManifest.xml; la acción predeterminada es intent.ACTION_MAIN y la categoría predeterminada es intent.category_launcher. lanzador_categoría.
Según la explicación en el sitio web oficial, ACTION_MAIN significa que la Actividad es el punto de entrada para el inicio; CATEGORY_LAUNCHER significa que la Actividad tiene un iniciador en la aplicación principal, es decir, el ícono de Actividad aparecerá en el menú de la aplicación para facilitar la ejecución. categoría.LAUNCHER" /gt;
lt;/intent-filtergt;
lt;/activitygt;
Una aplicación puede tener múltiples registros utilizando la Actividad CATEGORY_LAUNCHER, entonces, después de la instalación, aparecerán múltiples íconos en el menú del programa para ejecutar cada Actividad. Si la Actividad no está registrada en CATEGORY_LAUNCHER, al menos debe estar registrada en CATEGORY_DEFAULT, porque este es uno de los requisitos previos para que el sistema use Intent Search. Después de registrar CATEGORY_DEFAULT, la Actividad no mostrará el ícono en el menú de la aplicación, por lo que generalmente se registra como una Actividad que no es ACTION_MAIN, como intent.ACTION_VIEW, etc. Si la Actividad solo registra acciones, la búsqueda general es la predeterminada. La intención puede fallar. Debe utilizar un formulario de inicio explícito. En el ejemplo anterior, especifica iniciar HomeSelector. El ejemplo es el siguiente:
¿Ver código fuente?
1 Intención i. = new Intent(this, HomeSelector.class );
2 startActivity(i
Si especifica iniciar un programa externo, puede hacerlo de la siguiente manera:
¿Ver fuente impresa?
1 Intent myIntent = new Intent();
2 myIntent.setClassName("com.KaDaNet", "com.KaDaNet.KaDaNet_MainController") ;
3 startActivity( myIntent);
Entonces, ¿qué pasa con la búsqueda implícita? Si ha estudiado el SDK de Android, debe haber visto el código de muestra en el SDK. muchas actividades que utilizan las funciones API se clasifican según una lista jerárquica de actividades. El contenido de esta lista jerárquica se genera y clasifica dinámicamente mediante loadLabel y ActivityInfo.name,
2 mainIntent.addCategory. (Intent.CATEGORY_SAMPLE_CODE).
3 PackageManager pm = getPackageManager();
4 Lista#8482 lt; resolveinfogt; /p>
La demostración de API solo muestra información para actividades cuya categoría está registrada como CATEGORY_SAMPLE_CODE.
Después de introducir condiciones en el Intent y buscarlo usando queryIntentActivities, uno de los registros de actividad tiene este aspecto:
lt;activity android:name=".android:label="@string/activity_custom_dialog " p>
android:theme="@style/Theme.CustomDialog"gt;
lt;intent-filtergt
lt;action android:name=" android.intent; .action.MAIN" /gt;
lt; categoría android: name="android.intent.category.SAMPLE_CODE" /gt;
lt;/intent-filtergt ; p>
lt;/activitygt;
Filtro de intención y aplicación de inicio
En Android, la aplicación de inicio debe indicarle al sistema que es una aplicación de inicio que se ejecuta en la pantalla. De manera similar, la aplicación Home también puede registrar la categoría como intent.CATEGORY_HOME en AndroidManifest.xml. Tomando como ejemplo Home en el SDK, el método de registro es el siguiente:
lt; "Inicio" android: theme="@style/Theme"
android: launchMode=" singleInstance"
android: stateNotNeeded="true"gt;
lt;intent-filtergt;
lt;acción android: name="android.intent.action.MAIN" /gt;
lt;categoría android: name="android.intent " .category.HOME"/gt;
lt; categoría android: name="android.intent.category.DEFAULT" /gt;
lt;/intent-filtergt;
p>lt;/activitygt;
La búsqueda de aplicaciones de la página de inicio se realiza de la misma manera que en la demostración de API, utilizando queryIntentActivator en PackageManager. En el siguiente ejemplo, los resultados de la búsqueda se incluyen en un HomeInfo que contiene la información que queremos y se devuelven a la Lista.
¿ver código fuente?
01 Lista privada; homeinfogt; queryHomeApp() {
02 Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); p>
p>
03 mainIntent.addCategory(Intent.CATEGORY_HOME);
04 PackageManager pm = getPackageManager();
05 listlt; resolveinfogt; .queryIntentActivities(mainIntent, 0);
06 Listlt;homeinfogt; homeList = new ArrayListlt;homeinfogt;();
07
08 for(ResolveInfo r : rList) {
09 listahogar. add(new HomeInfo(r, pm));
10 }
11 return homeList
12 }
Se utiliza HomeInfo; aquí Clase para encapsular cuatro tipos de información, a saber, nombre de categoría, nombre del sobre, etiqueta de actividad e icono de actividad.
01 información de inicio de clase pública {
02 nombre de cadena pública
03 nombre de paquete de cadena pública
04 etiqueta de cadena pública;
p>p>
05 icono dibujable público;
06
07 HomeInfo pública (ResolveInfo rInfo, PackageManager pm) {
08 nombre = rInfo.activityInfo. nombre;
09 paqueteNombre = rInfo.actividadInfo.paqueteNombre;
10 etiqueta = rInfo.loadLabel(pm).toString();
11 icon = rInfo .loadIcon(pm);
12 }
13 }
Esto es simple, ¿verdad? Esto obtendrá la información de todas las aplicaciones principales del sistema y luego podrá cambiar la aplicación principal en función de esta información, como mencionamos antes, ¡esto es explícito!
ver código fuente?
1 public void switchHome(String packageName) {
2 Intent homeIntent = new Intent("android.intent.action. MAIN") ;
3 homeIntent.addCategory("android.intent.category.HOME");
4 homeIntent.addCategory("android.intent.category.DEFAULT");
5 homeIntent.setPackage(nombredelpaquete);
6 this.startActivity(homeIntent);
7 this.finish();
8 }
Para mostrar la información de todas las aplicaciones domésticas instaladas en la interfaz del programa, la forma más sencilla es utilizar un ListView y crear un nuevo adaptador de lista para que coincida y establezca lo que queremos cuando se presiona el elemento de la lista. Lo que debemos hacer, que es lo que intentamos hacer en el código anterior, es cambiar a otra aplicación de inicio. El código de configuración de la interfaz es el siguiente y la interfaz se muestra en la Figura 1.
ver código fuente?
01 ListView lvHome = (ListView) findViewById(R.id.lvHome);
02 final HomeListAdapter hAdapter = nuevo HomeListAdapter (este) ;
03 hAdapter.addItemList(queryHomeApp());
04 lvHome.setAdapter(hAdapter);
05 lvHome.setOnItemClickListener(nuevo AdapterView.OnItemClickListener( ) {
06 @Override
07 public void onItemClick (AdapterView padre, vista de vista, posición int, ID larga) {
08 HomeListItem elemento = (HomeListItem ) hAdapter.getItem(posición);
09 switchTo(item.getHomeInfo ().packageName);
10 }
11 });
Fig.1. Lista de aplicaciones para el hogar
Administración de aplicaciones para el hogar
Un buen conmutador de aplicaciones para el hogar proporcionará funciones de administración relevantes. En términos generales, la función básica de gestión es mostrar información. Además de identificar todas las aplicaciones domésticas en el sistema, también debe poder mostrar información relacionada con estas aplicaciones domésticas; por supuesto, el tipo de información depende de los requisitos. En lo que respecta a las aplicaciones para el hogar, se puede dividir en información no ejecutada e información ejecutada, es decir, es posible que los usuarios quieran ver qué aplicaciones para el hogar se están ejecutando, si estas aplicaciones para el hogar se están ejecutando, pueden ver más información. , como información relacionada con el programa. Con base en esta información, los usuarios pueden decidir si cambiar entre las aplicaciones principales o cerrarlas. En esta sección, cubriré cómo saber si la aplicación principal se está ejecutando, cuánta memoria ocupa mientras se ejecuta y, por supuesto, eliminar la instalación de la aplicación principal y mostrar los detalles de la aplicación.
La categoría ActivityManager [2] es una API en Android que se utiliza para interactuar con los programas en ejecución en el sistema. Usando esta categoría, podemos obtener todas las aplicaciones en ejecución y, a través de un software específico, el nombre del paquete filtra si la aplicación es; ejecutándose, como se muestra en el siguiente ejemplo:
ver código fuente?
1 public boolean isAppRunning() {
2 for(RunningAppProcessInfo info: mAM.getRunningAppProcesses( )) {
3 if (info.processName.equals(packageName)) devuelve verdadero;
4 for (String pn: info.pkgList) {
5 si (pn.equals(packageName)) devuelve verdadero;
6 }
7 }
8 devuelve falso;
6 p>
9 }
El mAM en la función es ActivityManager, que utiliza el método getRunningAppProcesses para obtener todas las aplicaciones en ejecución, porque Android no proporciona una función de filtro. La razón por la que necesitamos comparar los nombres de los programas primero es porque, en términos generales, los nombres de los programas de muchas aplicaciones serán los mismos que los nombres de los paquetes, por lo que utilizamos este método para acelerar la comparación. Si el nombre del paquete de la aplicación principal no coincide con el nombre del programa, debe comparar los nombres de todos los paquetes cargados en el programa.
El siguiente paso es obtener la memoria ocupada por el programa, usar getProcessMemoryInfo en ActivityManager e ingresar el ID del programa para obtener Debug.MemoryInfo. El campo RunningAppProcessInfo contiene el ID del programa, que se puede obtener a partir de la información que se acaba de obtener sobre la aplicación en ejecución. Pero, de hecho, la memoria ocupada por el programa es bastante compleja, consulte [3-6]. RSS se refiere a toda la biblioteca compartida, mientras que PSS reduce el tamaño de la biblioteca compartida proporcionalmente, siendo el denominador de la proporción la cantidad de programas que utilizan la biblioteca compartida. Usaré el PSS de todos los programas para estimar el uso de memoria, el código es el siguiente:
ver código fuente?
1 public int getMemoryUsed(ActivityManager am) {
2 Debug.MemoryInfo mInfo = am.getProcessMemoryInfo(new int[]{PID})[0];
3 return mInfo.getTotalPss();
4 } p>
Los usuarios pueden decidir si detener la aplicación Home en función de la cantidad de memoria que ocupa, con el fin de dejar más espacio para otro software que consume más recursos.
La API para eliminar el programa es el método killBackgroundProcesses en la categoría ActivityManager. Este método necesita registrar el permiso KILL_BACKGROUND_PROCESSES con el sistema. Su uso es el siguiente, solo proporcione el nombre del paquete de software:
ver código fuente.
1 mAM.killBackgroundProcesses(pkgName);
Después de detener la aplicación Home, el Selector de inicio necesita actualizar ListView en la pantalla, lo que se puede lograr notificando la actualización de la fuente de ListView . Android proporciona la función conveniente notificarDataSetChanged. Pero debe tenerse en cuenta que esta función solo notifica la actualización, lo que significa que getView del adaptador se volverá a ejecutar. Si el procesamiento de enlace de datos no escribe en getView, la actualización de datos no se producirá, por lo que debe manejar los datos. vinculante antes de actualizar la notificación.
¿ver fuente de impresión?
1 actualización nula pública() {
2 hAdapter.notifyDataSetChanged();
3 }
Las funciones restantes para eliminar instalaciones y ver detalles de la aplicación son muy simples. La actividad del sistema se inicia a través de Intent. Se debe prestar especial atención a la configuración del indicador de Intent y el URI de destino. El código del programa es el siguiente:
view sourceprint?01ACTION_DELETE, homeURI);
11 i.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
12 cont.startActivity(i);
}
13