Las actividades se pueden clasificar en categorías para así poder buscarlas basándonos en el nombre de dicha categoría. Por ejemplo, mientras el sistema se está iniciando, busca en las actividades las que estén bajo la categoría CATEGORY_LAUNCHER.

La convención usada para nombrar a las categorías es (para el caso de CATEGORY_LAUNCHER):

android.intent.category.LAUNCHER

La forma de declarar las categorías en el AndroidManifest es la siguiente:



<activity android:name=".PrincipalActivity" android:label="@string/app_name">
<intent>
<action android:name="android.intent.action.MAIN">
<category android:name="android.intent.category.LAUNCHER">
</category></action></intent>
</activity>

Vamos a ver algunas categorías predefinidas, podéis encontrar la lista de todas ellas en developer.android.com/reference/android/content/Intent.html#CATEGORY_ALTERNATIVE:

Cuando usamos un intent para iniciar una actividad podemos especificar qué tipo de actividad queremos especificando la categoría. Otra opción es buscar las actividades que coincidan con una determinada categoría, por ejemplo:

Intent i = new Intent(Intent.ACTION_MAIN, null);
i.addCategory(Intent.CATEGORY_LAUNCHER);
PackageManager pm = getPackageManager();
List<resolveinfo> list = pm.queryIntentActivities(i, 0);
</resolveinfo>

PackageManager permite encontrar actividades que coincidan con un intent sin llegar a invocarlas. Una vez ejecutado lo de arriba, podemos iterar sobre la lista e invocar a la actividad que coincida con el nombre que deseemos:

for(ResolveInfo ri: list){
   Log.d("Info", ri.toString());
   String pkgName = ri.activityInfo.packageName;
   String className = ri.activityInfo.name;
   if(className.equals("nombre.paquete.denuestra.actividad.nombreActividad")){
      Intent i = new Intent();
      i.setClassName(pkgName, className);
      activity.startActivity(i);
   }
}

Es posible lanzar una actividad basándonos en el nombre de la categoría:

Intent i = new Intent(Intent.ACTION_MAIN, null);
i.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(i);

Como mencioné anteriormente, en el caso de que exista más de una actividad que satisfaga las condiciones que impone el intent, se mostrará un diálogo al usuario para que elija cual lanzar.

Si quisiéramos invocar un intent para volver a la pantalla principal, basta con cambiar la categoría del código de arriba de Intent.CATEGORY_LAUNCHER a Intent.CATEGORY_HOME


Siguiente Tema: Cómo se resuelven los Intents

Índice