97. Introducción a Android¶
- Fundamentos de una Aplicación en Android
- Componentes de una aplicación.
- Android Manifest
- Recursos de una aplicación
- La Clase R
- Estructura de un proyecto
-
- Instalación de Android Studio
-
- Iniciando el entorno de desarrollo.
-
- Elementos de un proyecto.
-
- Configurar el dispositivo donde probar las aplicaciones.
- 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()
, yonDestroy()
. 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 yonDestroy()
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);
Envías datos a NextActivity mediante putExtra()
.
Intent intent = new Intent(this, NextActivity.class);
intent.putExtra("key", "value");
startActivity(intent);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.ejemplo.com"));
startActivity(intent);
<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 organizanViews
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 >
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:
- Documentación sobre Activity
Ver 0.6 ( 21-11-23 )
Revision 0.7 (10-12-23)