Saltar a contenido

97. Introducción a Android

  1. Fundamentos de una Aplicación en Android
  2. Componentes de una aplicación.
  3. Android Manifest
  4. Recursos de una aplicación
  5. La Clase R
  6. Estructura de un proyecto
    1. Instalación de Android Studio
    1. Iniciando el entorno de desarrollo.
    1. Elementos de un proyecto.
    1. Configurar el dispositivo donde probar las aplicaciones.
  7. Los permisos en Android.

97.1 Componentes de una aplicación

Las aplicaciones Android pueden estar formados por algunos o varios de los siguientes elementos:

97.1.1 Activities

En Android, una Activity es un componente fundamental que representa una sola pantalla con una interfaz de usuario. Es como una ventana o un marco en otras plataformas de programación.

CARACTERÍSTICAS:

  • Interfaz de Usuario: Cada Activity tiene una interfaz de usuario construida generalmente con un archivo XML. Esta interfaz puede contener varios elementos como botones, textos, imágenes, etc. Alternativamene se consigue lo mismo con COMPOSE

  • Ciclo de Vida: Las Activities tienen un ciclo de vida bien definido. Los principales estados en este ciclo son: onCreate(), onStart(), onResume(), onPause(), onStop(), y onDestroy(). Cada uno de estos métodos se llama en diferentes puntos de la vida de la Activity, permitiéndote controlar cómo se comporta tu app durante la creación, inicio, reanudación, pausa y destrucción de la Activity.

  • Navegació**n: navegar de una Activity a otra usando **Intents. Los Intents pueden ser explícitos, donde especificas la Activity de destino, o implícitos, donde dejas que el sistema elija la Activity adecuada basándose en la acción que deseas realizar.

  • Gestión de Estados: Debido a que Android controla el ciclo de vida de las Activities, es importante gestionar los estados como la pérdida y recuperación de datos cuando el usuario navega entre Activities o cuando ocurren cambios en el estado del dispositivo (como rotaciones de pantalla).

  • Contexto en Android : Las Activities en Android también proporcionan un contexto, que es una forma para acceder a elementos como recursos y bases de datos de la aplicación.

Ejemplo de codigo de Activity

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Aquí puedes inicializar tu UI y lógica
    }
}

97.1.2 Services

Un "Service" en Android es un componente que realiza operaciones de larga duración en segundo plano sin una interfaz de usuario.

Características de un Service: * Ejecución en Segundo Plano: Los Services pueden realizar operaciones en segundo plano mientras el usuario está interactuando con otra aplicación. Por ejemplo, un Service puede reproducir música en segundo plano mientras el usuario está usando una app de navegación.

  • Sin Interfaz de Usuario: A diferencia de las Activities, los Services no tienen una interfaz gráfica. Realizan su trabajo "silenciosamente" en el fondo.

  • Ciclo de Vida: Los Services tienen su propio ciclo de vida. Los métodos más importantes son onStartCommand() para iniciar el servicio y onDestroy() para su destrucción. El servicio puede ejecutarse incluso cuando la aplicación que lo inició no está en primer plano.

Tipos de Services:

  • Started Service: Se inicia llamando al método startService(). Una vez iniciado, puede ejecutarse en segundo plano indefinidamente, incluso si la aplicación que lo inició se cierra.
  • Bound Service: Ofrece una interfaz de cliente-servidor que permite a componentes (como Activities) interactuar con el servicio, enviar solicitudes, obtener resultados, etc. Se vincula a otro componente de la aplicación mediante bindService().

Ejemplo de codigo para un Service

public class MyService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // Aquí puedes escribir tu lógica de servicio
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        // Limpieza cuando el servicio se destruye
    }

    @Override
    public IBinder onBind(Intent intent) {
        // Solo para Bound Services
        return null;
    }
}

97.1.3 Broadcast Receivers

Un Broadcast Receiver es un componente de Android que permite que tu aplicación reciba y responda a varios tipos de anuncios o "broadcasts". Estos broadcasts pueden ser tanto del sistema Android como de otras aplicaciones.

Cacterísticas de un Broadcast Receiver:

  • Receptor de Eventos: Los Broadcast Receivers son utilizados para escuchar o recibir eventos del sistema o de otras aplicaciones. Por ejemplo, pueden reaccionar a cambios de conectividad, como cuando un dispositivo se conecta o desconecta de una red Wi-Fi.

  • Sin Interfaz de Usuario: A diferencia de las Activities, los Broadcast Receivers no tienen una interfaz de usuario. Su trabajo es recibir eventos y responder a ellos, generalmente ejecutando algún código en segundo plano.

  • Modos de Registro del Receiver:

  • Estático: Puedes registrar un Broadcast Receiver en el archivo AndroidManifest.xml de tu aplicación. Esto lo hace disponible en todo momento, incluso si tu aplicación no se está ejecutando.

  • Dinámico: También puedes registrar un Receiver de forma dinámica en tu código (por ejemplo, en una Activity), utilizando registerReceiver(). Este tipo de Receiver solo está activo mientras su componente contenedor esté vivo.*
  • Tipos de Broadcasts:

  • Sistema: Broadcasts enviados por el sistema Android, como el apagado del teléfono, cambio de idioma, cambio de hora, etc.

  • Aplicaciones: Broadcasts enviados desde otras aplicaciones o por la misma aplicación.
  • El método clave en un Broadcast Receiver es onReceive(Context context, Intent intent). Aquí es donde implementas la lógica que se ejecutará cuando se reciba el broadcast

Ejemplo

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Lógica a ejecutar cuando se recibe el broadcast
    }
}

// Registro dinámico en una Activity
MyBroadcastReceiver receiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(receiver, filter);

97.1.4 Content Providers

Un Content Provider en Android es un componente que gestiona el acceso a un conjunto de datos compartidos. Su principal función es encapsular los datos y proporcionar mecanismos para definir la seguridad en el acceso a estos datos. Los Content Providers son especialmente útiles cuando tienes datos que quieres compartir entre diferentes aplicaciones o entre distintos componentes de la misma aplicación.

Funcionalidades Principales
* Abstracción de Datos: Los Content Providers abstraen los detalles de almacenamiento de datos, como bases de datos SQLite, archivos de texto, o la web, y proporcionan una interfaz uniforme para acceder a ellos. * Seguridad en el Acceso a Datos: Permiten definir permisos para quién puede acceder a esos datos, asegurando que solo las aplicaciones autorizadas puedan leer o escribir en ellos. * Intercambio de Datos: Son ideales para compartir datos entre diferentes aplicaciones. Por ejemplo, el proveedor de contactos en Android es un Content Provider que diferentes aplicaciones pueden usar para acceder a la lista de contactos del usuario.

Estructura Básica
* URI (Uniform Resource Identifier): Cada Content Provider expone su conjunto de datos a través de un identificador único (URI). Las aplicaciones utilizan estas URIs para acceder a los datos. * Operaciones CRUD: Los Content Providers soportan operaciones CRUD (Crear, Leer, Actualizar, Borrar) a través de métodos como query(), insert(), update(), y delete().

Ejemplo:

public class MyContentProvider extends ContentProvider {
    @Override
    public boolean onCreate() {
        // Inicialización
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        // Consulta a la base de datos
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // Insertar nuevos datos
        return null;
    }

    // Métodos update y delete similares
}

97.1.5 Intent

Un Intent en Android es un mecanismo de mensajería que facilita la comunicación entre los distintos componentes de una aplicación (como Activities, Services, Broadcast Receivers) o entre diferentes aplicaciones.
Los Intents son utilizados para una variedad de propósitos, como iniciar Activities, enviar datos entre componentes, iniciar servicios, y emitir notificaciones.

Tipos de Intents
* Explicit Intents: Se usan para iniciar un componente específico dentro de la propia aplicación. Aquí, especificas explícitamente el componente que quieres iniciar. Por ejemplo, iniciar una nueva Activity. * Implicit Intents: No especifican directamente el componente a iniciar. En lugar de eso, declaran una acción a realizar, y el sistema decide qué componente es el más adecuado para esa acción. Son útiles para interactuar con componentes de otras aplicaciones.

Uso de Intents para Iniciar Activities

Intent intent = new Intent(this, NextActivity.class);
startActivity(intent);
Aquí, NextActivity.class es la Activity que deseas iniciar.

Envías datos a NextActivity mediante putExtra().

Intent intent = new Intent(this, NextActivity.class);
intent.putExtra("key", "value");
startActivity(intent);
Para abrir un navegador web en una página

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.ejemplo.com"));
startActivity(intent);
Registro de Intents en AndroidManifest.xml Para los Implicit Intents, especialmente cuando tu app puede responder a Intents de otras apps, debes declarar los filtros de Intents adecuados en AndroidManifest.xml. Por ejemplo, si tu app puede manejar enlaces web:

<activity android:name="MyWebActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="http" />
        <data android:scheme="https" />
    </intent-filter>
</activity>

97.1.6 Otros terminos usados en Android

  • Fragments

  • Componentes reutilizables con ciclo de vida propio que pueden ser parte de una Activity.

  • Se pueden utilizar con Jetpack Compose, pero no son necesarios. Las funciones Compnibles hacen la misma labor.

  • Views y ViewGroups Cuando usamos el modelo de vistas (XML)

  • Views son elementos de UI como botones o campos de texto.
  • ViewGroups son contenedores que organizan Views en layouts.

  • Widgets

  • Componentes interactivos para la pantalla de inicio, proporcionando acceso rápido a la app.

  • Notifications

  • Informan al usuario con alertas, sonidos o luces fuera de la UI normal.

  • Resources

  • Elementos como strings, imágenes y archivos XML, usados para diseño y soporte de localización.

  • Manifest File

  • Archivo XML que declara los componentes y requerimientos de la aplicación.

97.2 Android Manifest

Para usar una Activity, ésta debe ser declarada en el fichero de manifiesto.

    <manifest ... >
      <application ... >
          <activity android:name=".ExampleActivity" />
          ...
      </application ... >
      ...
    </manifest >
El único atributo obligatorio es android:name

En el manifiesto tmbién se declaran otros elementos Android como:

  • Filtros de Intents para una Activity
        <activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>
    
  • Permisos de usuario de la aplicación
        <manifest>
        <activity android:name="...."
           android:permission=”com.google.socialapp.permission.SHARE_POST”
    
        />
    

97.3 Recursos de una aplicación

  • Layouts (res/layout/)
  • Definen la UI de las actividades, fragmentos, etc. (modelo de vistas)

  • Values (res/values/)

  • Strings (res/values/strings.xml)
    • Textos utilizados en la app, facilitan la localización.
  • Colors (res/values/colors.xml)
    • Define colores para usar en diseño y código.
  • Styles (res/values/styles.xml)
    • Personaliza la apariencia de las vistas.
  • Dimens (res/values/dimens.xml)
    • Especifica dimensiones y tamaños de texto comunes.
  • Themes (res/values/themes.xml)

    • Estilos aplicados a la app o actividades individuales.
  • Drawables (res/drawable/)

  • Imágenes y definiciones de gráficos para la UI.

  • Mipmap (res/mipmap/)

  • Iconos de la aplicación en diferentes densidades.

  • Animaciones (res/anim/)

  • Animaciones para vistas.

  • Menus (res/menu/)

  • Menús para barra de acción y menús contextuales.

  • Raw (res/raw/)

  • Archivos binarios como audio o video.

  • XML (res/xml/)

  • Archivos XML para configuraciones y proveedores.

  • Assets (assets/)

  • Almacena archivos como fuentes y archivos de texto, accesibles vía AssetManager.

97.4 La Clase R

En Android, la clase R es una clase autogenerada que actúa como un índice de referencia para todos los recursos disponibles en la carpeta res/ del proyecto.
Cuando se compila una aplicación Android, el compilador genera esta clase, que contiene subclases estáticas para cada tipo de recurso, como drawable, layout, string, colors, y más

  • R.drawable
  • Identificadores para recursos gráficos en res/drawable.

  • R.layout

  • Identificadores para archivos de diseño de UI en res/layout.

  • R.string

  • Identificadores para cadenas de texto en res/values/strings.xml.

  • R.color

  • Identificadores para definiciones de color en res/values/colors.xml.

  • R.dimens

  • Identificadores para dimensiones comunes en res/values/dimens.xml.

  • R.id

  • Identificadores para elementos de UI con android:id en archivos XML.

  • R.menu

  • Identificadores para menús en res/menu.

  • R.raw

  • Identificadores para archivos binarios en res/raw.

  • R.anim

  • Identificadores para animaciones en res/anim.

  • R.attr

  • Identificadores para atributos personalizados en recursos XML.

  • R.style

  • Identificadores para estilos en `res

Por ejemplo para usar R.string , primero debes definir el recurso en el archivo strings.xml, que se encuentra dentro del directorio res/values/

<resources>
    <string name="hello_world">Hello World!</string>
</resources>

En el código ser usa :

@Composable
fun Greeting() {
    val context = LocalContext.current

    val helloWorldString = context.getString(R.string.hello_world)

    Text(text = helloWorldString)
}

97.5 Instalación de Android Studio

Para descarga y docuentación consultar la web de Android Developer.

Para detalles de la configuración y uso ver el documento AndroidStudio

97.6 Iniciando el entorno de desarrollo.

Se puede iniciar un proyecto nuevo utilizando alguno de los asistentes incorporados en Android Studio. Para una aplicación con Jetpack Compose elegimos el asistente "Empty Activity"

También se puede usar el sistema de versiones git para clonar un proyecto, por ejemplo desde Github o Gitlab.

97.7 Estructura de Proyecto Kotlin en Android Studio

Cuando se crea una aplicación, el asistente de Android Studio crea un árbol de directorios y una serie de ficheros:

  • Directorio src Contiene todo el código fuente y recursos del proyecto.
  • main: Código fuente principal del proyecto.
  • java Contiene los archivos de código Kotlin.

  • res Almacena los recursos como layouts, strings, imágenes, etc.

  • AndroidManifest.xml Archivo de configuración principal para actividades, permisos, etc.

  • Directorio gradle Contiene scripts y configuraciones para el sistema de construcción Gradle.

  • Archivos de Configuración de Gradle

  • build.gradle (Project): Configuración de Gradle a nivel de proyecto.
  • build.gradle (Module): Configuración de Gradle a nivel de módulo.

  • Directorio test Para pruebas unitarias.

Ç Directorio androidTest Para pruebas de integración y UI específicas de Android.

  • README.md Archivo Markdown opcional para documentar el proyecto.

  • .gitignore Especifica los archivos y directorios que deben ignorarse en los commits (si se usa Git).

97.8 Configurar el dispositivo para probar las aplicaciones.

La aplicación se puede ejecutar (y depurar) en un dispositivo real o simulado.

En el menú tools->Device Manager se puede elegir un modelo de teléfono y una versión del API de desarrollo Android. Una vez creado el dispositivo aparece

97.9 Apéndice

Enlaces:

Ver 0.6 ( 21-11-23 )
Revision 0.7 (10-12-23)