Advertisement
  1. Code
  2. Coding Fundamentals
  3. Tools

Android desde Cero: Conectando Activities y Aplicaciones

Scroll to top
Read Time: 8 min
This post is part of a series called Android From Scratch.
Android From Scratch: Activities and Fragments
Android From Scratch: Understanding Adapters and Adapter Views

() translation by (you can also view the original English article)

Una aplicación Android que está compuesta de varias clases Activity sencillas, tienden a ofrecer una mejor experiencia de usuario que una que está repleto de toda su funcionalidad en una clase Activity grande y compleja. Un buen regla general es probar y limitar cada Activity que usted crea para sólo una tarea y nada más.

Para conseguir hacer las cosas con tales Activity sencillas, sin embargo, usted debe crear conexiones entre las clases Activity y permitirles sin ningún problema, intercambiar datos entre sí. En este tutorial, le mostraré como usar instancias para crear conexiones entre activity y enviar datos desde una activity a otra.

1. ¿Qué es una Instancia?

En el mundo real, antes de que empiece a realizar una acción, por lo general, usted pretende hacerlo. Lo mismo que es verdadero en el mundo de las aplicaciones Android. Para empezar una Activity en Android, usted debe tener un objetivo para ella.

Los Intents son instancias de las clase Intent. Son una parte tan integral de la plataforma de Android que incluso la más simple de las aplicaciones las necesita. Por ejemplo, considere la aplicación Hello World que usted creó anteriormente en esta serie. Esta es capaz de empezar cuando usted toca su icono solamente porque esta es capaz de responder a un intento creado por el iniciador de la aplicación en su dispositivo.

Junto con los detalles sobre la Activity, un intent puede contener datos adicionales, que acertadamente son llamados: extra data, para enviar argumentos o devolver resultados desde una activity a otra.

2. Tipos de Intents

Los Intents puede ser o explícitos o implícitos. Se dice que un intent es explícito cuando usted lo inicia usando la clase literal de la activity que usted quiere crear. En el caso de los intents implícitos, usted solamente específica la acción que usted desea realizar y deja que el sistema operativo de Android determine la activity exacta que debería ser iniciada.

Por lo general, los intents explícitos son utilizados para iniciar activididades que pertenecen a su propia aplicación mientra que los intents implícitos tienen como objetivo que pertenecen a otras aplicaciones instaladas en los dispositivos de los usuarios.

3. Creando un Intent Explícito

Para crear un intent explícito, usted puede usar el método setClass() de un objeto Intent y pasar la clase literal de un activity a éste método, junto con una referencia a su activity actual como el contexto. Por ejemplo, si su activity actual es MainActivity y usted quiere desea crear un intent para iniciar un activity llamado OtherActivity, entonces usted usaría el siguiente código:

1
Intent intent = new Intent();
2
intent.setClass(MainActivity.this, OtherActivity.class);

Si quiere crear un intent explícito para un activity que no pertenece a su aplicación, entonces en su lugar use el método setComponent(). Como argumento debe pasar un objeto ComponentName, el cual ha sido inicializado usando el nombre del paquete de la aplicación necesaria y el nombre de la clase completamente calificada de la activity requerida.

Por ejemplo, aquí está como usted crearía un intent para una activity llamada OtherActivity que pertenece a una aplicación cuyo nombre de paquetes es com.example.otherapp:

1
Intent intent = new Intent();
2
intent.setComponent(
3
    new ComponentName("com.example.otherapp", 
4
                      "com.example.otherapp.OtherActivity"
5
    )
6
);

4. Creando un Intent Implícito

Para crear un Intent implícito, usted debe usar el método setAction() de un objeto Intent y pasar un objeto string a éste método. El objeto string específica el nombre de la acción que usted intenta realizar. Android SDK tiene varias acciones estándar. Para la mayoría de ellas, también se requiere que usted use el método setData() para especificar los datos de la acción con la que debería funcionar. Los datos siempre deben de estar en la forma de un objeto Uri.

Una de las acciones estándar mucho más utilizadas es ACTION_VIEW, la cual puede ser utilizada para ejecutar una variedad de aplicaciones tales como el navegador por defecto, el marcador y los contactos de la aplicación. Por ejemplo, aquí está cómo es que usted crea un intent implícito para marcar el número 123456789:

1
Intent intent = new Intent();
2
intent.setAction(Intent.ACTION_VIEW);
3
4
// Generate a valid URI for the telephone number

5
// using the Uri.parse method and pass it to setData

6
intent.setData(Uri.parse("tel:123456789"));

Simplemente al cambiar el objeto Uri que usted pasa al método setData(), usted puede cambiar el inicio de la aplicación ACTION_VIEW. Por ejemplo, si desea ejecutar el navegador y abrir el sitio web https://tutsplus.com/ en él, entonces la llamada al método setData() tendría que lucir así:

1
intent.setData(Uri.parse("https://tutsplus.com"));

5. Añadiendo Extras a un Intent

Algunos intent deben de contener datos adicionales para funcionar correctamente. Estos datos adicionales son llamados extras. Un extra no es otra cosa que un par de valores y claves que pertenecen a un objeto Bundle. Usando un Bundle es como usar un HashMap con dos limitaciones:

  • las claves siempre deben ser objetos String
  • los valores siempre deben ser primitivos o objetos Parcelable

Los Extras pueden ser utilizados tanto con intents implícitos como explícitos. Para añadir un extra a un objeto Intent, usted puede usar el método putExtra(). Por ejemplo, aquí está cómo es que puede añadir un extra con una mensaje clave y un valor Hello:

1
intent.putExtra("message", "Hello");

6. Usando un Intent

Ahora que usted comprende cómo crear un intent y añadir datos y extras a él, es hora de avanzar y, de hecho, usar los objetos Intent para iniciar las clases Activity. La forma más simple de iniciar un activity usando un objeto Intent es pasarlo como un argumento al método startActivity().

1
startActivity(intent);

El método startActivity() es, por lo general, utilizado solamente cuando usted quiere cambiar desde un activity a otro. En otras palabras, startActivity() le ayuda a llevar al usuario desde una pantalla de su aplicación a otra.

Si quiere comenzar un activity para realizar una tarea específica y obtener el resultado de la tarea de regreso, entonces debe usar el método startActivityForResult(). Este método, además del objeto Intent, también espera un entero que usted usa para identificar el resultado de la activity. El entero es referido como un código de consulta.

Adicionalmente, para poder recibir el resultado de una activity iniciado usando el método startActivityForResult(), entonces su activity debe sobre escribir el método onActivityResult(). Por ejemplo, el siguiente fragmento de código le muestra como crear un intent implícito para capturar una foto usando la aplicación por defecto de la cámara del dispositivo y conseguir una miniatura de la foto capturada como resultado:

1
// An integer to identify the result of the

2
// camera app's activity

3
final static int CAMERA_RESULT_REQUEST_CODE = 1;
4
5
private void takePhoto() {
6
    Intent intent = new Intent();
7
8
    // Use ACTION_IMAGE_CAPTURE to refer to the

9
    // default camera app's activity

10
    intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
11
12
    // Launch the activity, and specify that

13
    // you expect a result whose request

14
    // code is equal to CAMERA_RESULT_REQUEST_CODE

15
    startActivityForResult(intent, CAMERA_RESULT_REQUEST_CODE);
16
}
17
18
@Override
19
protected void onActivityResult(int requestCode, int resultCode, Intent result) {
20
21
    // Check if requestCode matches the request 

22
    // code passed to the startActivityForResult method.

23
24
    // Also check if the result is valid using the

25
    // resultCode parameter

26
27
    if(requestCode == CAMERA_RESULT_REQUEST_CODE && resultCode == RESULT_OK) {
28
        Bitmap thumbnail = 
29
            (Bitmap)result.getExtras().get("data");
30
    }
31
}

Observe que el resultado de un activity es, además, un objeto Intent. En el fragmento de código anterior, primero usé el método getExtras() para buscar el Bundle que contiene los extras que pertenecen al resultado. A continuación, usé el método get() para buscar la miniatura como un objeto Bitmap.

7. Usando Filtros Intent

En los pasos anteriores, usted vio como usar intents implícitos para iniciar clases activity que pertenecen a otras aplicaciones instaladas en un dispositivo de un usuario. Ahora se podría imaginar si otras aplicaciones pueden iniciar un activity que pertenece a su aplicación usando el mismo procedimiento. La respuesta a esa pregunta es "no a menos que usted lo quiera". Por defecto, por razones de seguridad, una activity no puede empezar por activity que pertenecen a otras activiy.

Para exponer un activity a otras aplicaciones, usted debe crear un filtro intent para ella. Para hacer eso usted debe añadir una etiqueta intent-filter para ello en el archivo del proyecto: AndroidManifest.xml.

Por ejemplo, si usted quiere que un activity llamado MyCustomActivity responda a una acción personalizada llamada my.custom.action, su entrada en el manifesto tiene que lucir así:

1
<activity android:name=".MyCustomActivity">
2
    <intent-filter>
3
        <action android:name="my.custom.action"/>
4
        <category android:name="android.intent.category.DEFAULT" />
5
    </intent-filter>
6
</activity>

Observe que junto con la etiqueta action que específica el nombre de la acción, la etiqueta intent-filter, también debe contener una etiqueta category cuyo atributo name está ajustado a un android.intent.category.DEFAULT. Sin la etiqueta category, su activity no será capaz de responde a los intents implícitos.

Con el filtro intent que acabamos de crear, cualquier aplicación es capaz de iniciar MyCustomActivity usando el siguiente código:

1
Intent intent = new Intent();
2
3
// The string passed to the setAction method

4
// must match the action name mentioned in the

5
// intent filter

6
intent.setAction("my.custom.action");
7
8
startActivity(intent);

Si usted prefiere no usar filtros intent, pero aún quiere exponer una activity a otras aplicaciones, entonces usted puede añadir un atributo exported a la definición de la activity en el manifesto, configurando su valor a true.

1
<activity android:name=".MyCustomActivity" android:exported="true"/>

En este caso, otras aplicaciones no tienen elección sino usar intents explícitos para iniciar una clase activity.

En conclusión

Ahora usted saber como conectar cualquier de los dos activities presentes en un dispositivo de un usuario usando los intents explícitos e implícitos. Con éste conocimiento, usted puede empezar a crear aplicaciones complejas que tengan varias pantallas. Además, ahora puede, con mucha facilidad, volver a usar las funcionalidades que ya están listas en otras aplicaciones que están instaladas en los dispositivos de los usuarios.

Para aprender más acerca de los intents, usted puede consultar la documentación oficial.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.