Desarrollo de aplicaciones móviles

Versión para imprimir.

por Gilberto Pacheco Gallegos

Instrucciones de navegación

1. Software a instalar

Microsoft Edge Chromium

Ya viene instalado en las computadoras más nuevas, pero si la tuya no lo tiene, lo puedes descargar de https://www.microsoft.com/es-es/edge.

Video de instalación.

Mozilla Firefox

Lo puedes descargar de https://www.mozilla.org.

Video de Instalación.

Google Chrome

Lo puedes descargar de https://google.com/chrome.

Video de Instalación.

OpenJDK

Lo puedes descargar de https://openjdk.java.net/.

Video de Instalación.

IntelliJ IDEA Community

Lo puedes descargar de https://www.jetbrains.com/es-es/idea/download/.

Video de Instalación.

Luego de instalar y cerrar IntelliJ, ábrelo, crea y ejecuta un proyecto de Kotlin para descargar actualizaciones y asegurarte que la herramienta quedó bien instalada.

Video sobre como crear un proyecto Kotlin y actualizar software.

Android Studio

Lo puedes descargar de https://developer.android.com/studio.

Debes seguir los siguientes pasos:

  1. Descarga e instala Android Studio. Video de instalación.

  2. Luego de instalar y cerrar Android Studio, ábrelo, crea y ejecuta un proyecto para descargar actualizaciones y asegurarte que la herramienta quedó bien instalada. Video sobre como crear el proyecto.

  3. Crea un emulador de un teléfono o conecta un dispositivo real. Video sobre como crear el emulador.

  4. Ejecuta el proyecto sobre el emulador de teléfono o el dispositivo real. Video sobre como ejecutar el proyecto.

Video de Instalación en el sitio de Android Studio.

Git

Lo puedes descargar de https://git-scm.com/.

Video de Instalación.

2. Arquitectura de dispositivos móviles

Versión para imprimir.

A. Características de los sistemas operativos de dispositivos móviles

Por desarrollar.

B. Uso de los sistemas operativos móviles

Instalación

Pendiente.

Actualización

Pendiente.

Descargas

Pendiente.

Administración de cuentas

Pendiente.

Respaldos

Pendiente.

Seguridad

Pendiente.

Servicios

Pendiente.

C. Componentes de hardware de dispositivos móviles

Sensores

Pendiente.

Redes de datos de radio

Pendiente.

Redes inalámbricas

Pendiente.

3. MVC

Versión para imprimir.

A. Algoritmo

Conjunto ordenado de intrucciones que se ejecutan una tras otra para realizar una tarea.

B. Proceso de información

Manera en que normalmente se utilizan los datos en el software. Normalmente consta de 3 pasos que se ejecutan uno tras otro:

  1. Adquisición de datos

  2. Procesamiento de datos

  3. Despliegue de resultados

Definiciones

Adquisición de datos
Entrada de datos

Obtener los datos que se van a procesar.

Procesamiento de datos

Aplicar un mecanismo de transformación a los datos para obtener resultados, también conocidos como datos de salida.

Despliegue de resultados
Salida de datos

Mostrar los resultados obtenidos. En algunos casos los datos de salida se almacenan en dispositivos externos a una computadora.

C. Proceso de información

  • Un lenguaje de programación es un conjunto de reglas precisas que se pueden usar para indicar a una computadora como realizar un algoritmo.

  • Un programa o código es la representación de un algoritmo usando un lenguaje de programación.

  • Las aplicaciones de cómputo normalmente se construyen usando uno o más lenguajes de programación.

D. Pseudocódigo

  • Especificación de un algoritmo usando texto informal parecido al lenguaje humano.

  • Los pseudocódigos normalmente se usan como apoyo en el desarrollo de aplicaciones de cómputo.

E. Diagrama de flujo

import { Diapositiva } from "../../lib/Diapositiva.js"; export class EDiagrama extends Diapositiva { /** @override */ connectedCallback() { super.connectedCallback(); this.innerHTML = /* html */ `

E. Diagrama de flujo

  • Un diagrama de flujo es una forma de especificar un algoritmo usando dibujos con características bien definidas.

  • Los diagramas de flujo normalmente se usan como apoyo en el desarrollo de aplicaciones de cómputo.

`; } } customElements.define("e-diagrama-1", EDiagrama);

4. Conceptos básicos

Versión para imprimir.

A. Kotlin

  • Lenguaje de programación moderno que hace a los desarrolladores más felices.

  • Desarrollado por la empresa JetBrains y contribuciones de código abierto.

  • Está diseñado para interactuar con código de Java, por lo cual sus tipos de datos son compatibles.

  • El sitio oficial del lenguaje es https://kotlinlang.org/.

  • Puedes probar ejemplos sencillos en https://play.kotlinlang.org/.

B. El tipo String

  • Al tipo de datos que representa texto se le llama String, que es la traducción al inglés del término cadena.

  • En Kotlin los textos se representan con secuencias de caracteres delimitadas por los siguientes símbolos:

    " "

    El delimitador es el símbolo comillas (").

    En su interior puedes poner cualquier caracter, excepto comillas y salto de línea.

    """ """

    El delimitador son 3 comillas.

    En su interior puedes poner cualquier caracter, excepto 3 comillas. Puede llevar saltos de línea.

  • La codificación de un texto es asignar a cada caracter del texto una combinación de varios 1 y 0. La combinación se puede expresar como un número.

  • kotlin usa la codificación UTF-16 de Unicode.

  • Para agregar un emoji desde Windows solo tienes que presionar la tecla con el logotipo de Windows al mismo tiempo que el punto ( Logotipo de Windows+. ) y aparece un cuadro de diálogo que te permite seleccionar un emoji.

Ejemplos

  • "Hola pp"

  • "😁¡¡¡¡A sus órdenes jefecita!!!!"

  • """
    Esta cadena
    está
    muy larga
    """

Cadena Vacía

Hay una cadena sin caracteres: "" conocida como cadena vacía.

C. Las instrucciones print y println

  • La instrucción print muestra un texto en la salida.

  • La instrucción println muestra un texto en la salida y posteriormente hace un salto de línea.

  • Los textos se muestran sin los símbolos que los delimitan.

Ejemplos

Instrucción Salida
println("7!😁");
7!😁
print("Hola pp");
Hola pp

D. Orden de ejecución

  • Primero se ejecuta el contenido de fun main().

  • Los renglones de instrucciones se ejecutan de arriba para abajo.

  • En cada renglón, las instrucciones se ejecutan de izquierda a derecha.

  • Cada instrucción println es un renglón.

  • Una prueba de escritorio es la ejecución detallada y paso a paso de un programa.

  • Depurar es controlar la realización de una prueba de escritorio usando una herramienta de desarrollo.

  • Usaremos la herramienta IntelliJ IDEA Community para depurar los programas.

Ejemplo

Salida.

p
au

Revísalo en Kotlin play.

fun main() {
 println("p"); print("a")
 print("u")
}

5. Variables

Versión para imprimir.

A. Identificador

Nombre que tiene un elemento de un programa y que no se puede repetir en ciertas partes del código.

Reglas que debe cumplir un identificador

  • Empezar con una letra (az o AZ) con o sin acentos (á, ñ, por ejemplo) o guion bajo (_).

  • Los caracteres siguientes pueden ser cualquiera de los anteriores o dígitos (09).

Ejemplos

  • _nombre
  • __nombre
  • Nombre24
  • _
  • TaChido
  • serenoMoreno
  • h54

Camel case

Aunque no es obligatorio, normalmente en JavaScript los identificadores se escriben en Camel Case, donde las mayúsculas se usan para simular el inicio de una palabra. Por ejemplo:

estasSonCuatroPalabras.

B. Variable

Una Lugar en donde se almacena un datoque puede cambiar durante la ejecución de un programa.

Declaración

Para usar una variable, primero hay que declararla con una instrucción como la siguiente:

var miNombre = "pp";
  • Se declaran con var.

  • Tienen asociado un nombre, con la estructura de un identificador y normalmente empieza con minúscula. En este caso, la variable se llama miNombre.

  • Tienen asociado un valor, que es un dato, el cual puede cambiar durante la ejecución del programa. En este caso el valor es "pp".

  • El operador de asignación (=) sirve para cambiar el valor de una variable, perdiendo el valor anterior. El operando del lado izquierdo siempre debe ser una variable.

  • Cuando el nombre de una variable no aparece a la izquierda del operador de asignación, se usa su valor.

Ejemplo

Salida

pp
tt
miNombre
bb
bb

Revísalo en Kotlin play.

fun main() {
 var miNombre = "pp"
 var suNombre = "tt"
 println(miNombre)
 println(suNombre)
 println("miNombre");
 miNombre = "bb";
 println(miNombre);
 suNombre = miNombre;
 print(suNombre);
}

C. Constante

  • Una constante es similar a una variable, pero su valor no puede cambiar una vez asignado.

  • Normalmente el nombre se escribe en mayúsculas, usando guión bajo (_) para separar palabras.

  • Se declaran con val

Ejemplo

Salida

Val cannot be reassigned

Revísalo en Kotlin play.

fun main() {
 val PI_REDONDEADO = 3.14
 println(PI_REDONDEADO)
 println("PI_REDONDEADO")
 PI_REDONDEADO = 9.0
 print(PI_REDONDEADO)
}

D. Variables duplicadas

Las variables o constantes declaradas en el mismo espacio no pueden tener el mismo nombre.

Ejemplo

Salida

Conflicting declarations: var a: String, val a: String
Conflicting declarations: var a: String, val a: String

Revísalo en Kotlin play.

fun main() {
 var a = "Q1"
 print(a)
 val a = "Q2"
 print(a)
}

E. Variables no encontradas

Cuando tratas de usar una variable o una constante no definida, obtienes un mensaje de error y se aborta la ejecución del programa.

Ejemplo

Salida

Unresolved reference: B

Revísalo en Kotlin play.

fun main() {
 var b = "BB";
 print(B);
}

F. La función readLine

La función readLine sirve para pedir datos.

Ejemplo

fun main() {
 print("Nombre: ");
 val nombre = readLine();
 print("Hola ");
 print(nombre);
 println(". Saludos.");
}

6. Comentarios

Versión para imprimir.

A. Comentario

  • Secciones de código que no es procesada y explica partes del programa para que se puedan entender mejor.

  • Normalmente se coloca en la línea inmediatamente antes del texto que explican, aunque también se coloca al final del renglón que explica.

B. Comentario de una línea

  • Empieza con el texto // y termina con el final de la línea.

  • Usan una sola línea hasta su final.

Ejemplo

Salida

Hola
t

Revísalo en Kotlin play.

fun main() {
 // Muestra Hola.
 println("Hola");
 println("t"); //Muestra t.
}

C. Comentario de una o más líneas

  • Los comentarios de una o más líneas empiezan con el texto /* y terminan con */.

  • Usan una o más líneas.

Ejemplo

Salida

Hola
t
bb

Revísalo en Kotlin play.

fun main() {
 /* Muestra Hola. */
 println("Hola");
 println("t"); /*Muestra t.*/
 /* Muestra
  * bb. */
 println("bb");
}

D. KDoc

  • Comentario de una o más líneas que empieza con /** y explica la definición de un elemento del código.

  • También se le conoce como comentario de documentación.

  • Se coloca en la línea inmediatamente antes del texto que explica.

  • El contendo de este tipo de comentarios debe seguir las reglas de https://kotlinlang.org/docs/kotlin-doc.html.

Ejemplo

fun main() {
 /**
  * Número de veces que aparece
  * la palabra sapo.
  */
 var sapos = 0;
}

7. Bloques

Versión para imprimir.

A. Bloque

  • Los bloques son listas de 0 o más instrucciones encerradas entre llaves ({}).

  • Cuentan como una instrucción.

  • Se ejecutan siguiendo el mismo orden de ejecución de Kotlin.

  • Cuando en su interior se declara una variable con val o con var, solo existe dentro del bloque donde se declara.

  • Los bloques simples se ejecutan con run.

  • Una vez terminada la ejecución del bloque, todas las variables declaradas con val o con var en su interior, son eliminadas.

  • Los bloques usan las variables o constantes declaradas fuera del bloque.

  • Las variables declaradas con val o con var dentro de un bloque ocultan a otras con el mismo nombre que estén declaradas fuera del bloque.

B. Depura bloques

Salida

p
z
gg
z
z
a

Revísalo en Kotlin play.

fun main() {
 val y = "z";
 println("p");
 println(y);
 run {
  val x = "gg";
  println(x);
  println(y);
 }
 println(y);
 println("a");
}

C. Depura bloques con variables duplicadas

Las variables declaradas con const o con let dentro de un bloque ocultan a otras con el mismo nombre que estén declaradas fuera del bloque.

Ejemplo

Salida

p
gg
p

Revísalo en Kotlin play.

fun main() {
 val x = "p";
 println(x);
 run {
  var x = "gg";
  println(x);
 }
 println(x);
}

8. if

Versión para imprimir.

A. El tipo boolean

El tipo de datos boolean representa la lógica de valores verdaderos y falsos.

Valores

Verdadero
true
Falso
false

B. Operador de igualdad de textos

a == b
Igual que

Devuelve true si los dos operandos representan el mismo texto, considerando mayúsculas y minúsculas; en otro caso, devuelve false.

Ejemplo

fun main() {
 println("h" == "gh"); // false
 println("h" == "H");  // false
 println("h" == "h");  // true 
}

C. Operador diferente de para textoss

a != b
Diferente de

Devuelve true si los dos operandos representan textos diferentes, considerando mayúsculas y minúsculas; en otro caso, devuelve false.

Ejemplo

fun main() {
 println("h" != "gh"); // true
 println("h" != "H");  // true
 println("h" != "h");  // false
}

D. La estructura de control if

  • La estructura de control if permite usar el resultado de una condición lógica para controlar si un grupo de instrucciones debe o no ejecutarse.

  • La siguiente figura representa el comportamiento de la estructura de control if:

    if
  • Si la condición evalúa a true, el grupo de instrucciones se ejecuta.

  • Si la condición evalúa a false, el grupo de instrucciones no se ejecuta.

E. Código

import { Diapositiva } from "../../lib/Diapositiva.js"; import "../../../lib/muestra-codigo.js"; export class E8Codigo extends Diapositiva { /** @override */ connectedCallback() { super.connectedCallback(); this.innerHTML = /* html */ `

E. Código

fun main() {
 print("Fruta preferida: ")
 val fruta = readLine()
 if (fruta == "pera") {
  println(
   "El que es pera, desespera.")
 }
 print("Tu fruta: ")
 println(fruta)
}
`; } } customElements.define("e8-codigo", E8Codigo);

9. La estructura de control if-else

Versión para imprimir.

A. La estructura de control if-else

La estructura de control if-else permite usar el resultado de una condición lógica para controlar si dos grupos de instrucciones deben o no ejecutarse. Un grupo de instrucciones va inmediatamente después de la condición y el otro grupo va después de la palabra reservada else.

La siguiente figura representa el comportamiento de la estructura de control if-else:

if-else

Si la condición evalúa a true, el grupo de instrucciones después de la condición se ejecuta.

Si la condición evalúa a false, el grupo de instrucciones después de la palabra reservada else se ejecuta.

B. Código

fun main() {
 print("""Agua pasa por mi casa
cate de mi corazón.
Adivina: """)
 val respuesta = readLine()
 if (respuesta == "el aguacate") {
  println("Bien.")
 } else {
  println("Mal.")
 }
 println("Adios.")
}

10. Condicional múltiple

Versión para imprimir.

A. Condicional múltiple

  • La siguiente figura representa el comportamiento de la condicional múltiple:

    Condicional Múltiple
  • La condicional múltiple es una lista en la que:

    • Cada elemento de la lista empieza con la palabra reservada if, seguida de una condición entre paréntesis y un bloque de instucciones.

    • Los elementos de la lista se separan con la palabra reservada else.

  • Para ejecutar, empieza a revisar los elementos de la lista, empezando por la primera condición. Se ejecuta el bloque de instrucciones que corresponda a la primera condición que evalue a true y luego se termina la estructura, continuando con las instrucciones que aparezcan después de la lista.

  • Si ninguna condición evalúa a true, se continua con las instrucciones que aparezcan después de la lista.

B. Código

fun main() {
 print("""Recomiendo un artista.
 1 - Pop
 2 - Reguetón
 Opción: """);
 val respuesta = readLine();
 if (respuesta == "1") {
  println("Ariana Grande.");
 } else if (respuesta == "2") {
  println("Bad Bunny.");
 }
 println("Adios.");
}

11. Condicional múltiple con else

Versión para imprimir.

A. Condicional múltiple con else

  • La siguiente figura representa el comportamiento de la condicional múltiple:

    Condicional Múltiple con Else
  • La condicional múltiple con else es una lista en la que:

    1. Cada elemento de la lista empieza con la palabra reservada if, seguida de una condición entre paréntesis y un bloque de instucciones.

    2. Los elementos de la lista se separan con la palabra reservada else.

    3. Al final de la lista va la palabra reservada else, seguida de un bloque de instrucciones.

  • Para ejecutar, empieza a revisar los elementos de la lista, empezando por la primera condición. Se ejecuta el bloque de instrucciones que corresponda a la primera condición que evalue a true y luego se termina la estructura, continuando con las instrucciones que aparezcan después de la lista.

  • Si ninguna condición evalúa a true, se ejecuta el bloque del else final, continuando con las instrucciones que aparezcan después de la lista.

B. Código con condicional múltiple con else

fun main() {
 print("""Recomiendo un artista.
 1 - Pop
 2 - Reguetón
 Opción: """);
 val respuesta = readLine();
 if (respuesta == "1") {
  println("Ariana Grande.")
 } else if (respuesta == "2") {
  println("Bad Bunny.")
 } else {
  println(
   "Opción incorrecta.")
 }
 println("Adios.")
}

12. Más textos

Versión para imprimir.

A. Enteros

  • Una parte de los números enteros de las matemáticas se pueden representar en Kotlin.

  • 0, 1, -1, 2, -2, etcétera.

  • Hay distintos tipos de enteros; la diferencia es cuantos números pueden representar y el número de bytes que utilizan.

B. Números de punto flotante

  • En Kotlin se usa el estándar IEEE 754 para números de punto flotante y en realidad son límites.

  • Un límite es un número que se representa a sí mismo, a números ligeramente menores y ligeramente mayores; por ejemplo, 1.0 representa a 1.0, así como números muy cercanos, como podrían ser 1.000000000000000000000001, 1.000000000000000000000002, 0.999999999999999999999999 o 0.999999999999999999999998.

  • Incluyen a los números enteros, pero con punto decimal como 1.0, 2.0, 101.0.

  • El valor 0.0 representa a los números cercanos a 0, ya sean positivos o negativos.

  • El valor +0.0 representa a los números positivos cercanos a 0.

  • El valor -0.0 representa a los números negativos cercanos a 0.

  • El valor NaN representa valores que no son un número; por ejemplo, los resultados de 0.0 / 0.0 y Math.sqrt(-1.0) (la raíz cuadrada de -1.0).

  • Hay distintos tipos de números de punto flotante; la diferencia es cuántos números pueden representar y el número de bytes que utilizan.

Temas por Investigar

  • Representación de números en notación científica.

C. Operador de concatenación a + b

Cuando el primero de los 2 operandos del operador + es string, se realiza una concatenación, que consiste en convertir los 2 operandos en texto y juntarlos.

fun main() {
 println("ab" + "& h"//ab& h
 println("gg" + 2)     //gg2
 println("gg" + true)  //ggtrue
}

D. Operador de concatenación con asignación a += x

  • Equivale a

    a = a + x;

    pero se ejecuta más rápido.

  • Nota que el primer operando debe ser una variable.

Ejemplo

fun main() {
 var c = "h";
 val D = ".";
 c += "gg";// c ➝ "hgg"
 println(c);
 c += 2;   // c ➝ "hgg2"
 println(c);
 c += D;   // c ➝ "hgg2."
 println(c);
}

E. Plantillas de texto

  • En el interior de las cadenas puedes poner la secuencia ${}, que permite poner en el interior de las llaves una expresión, cuyo resultado convertido a texto sustituye a toda esta secuencia.

  • También puedes poner $identificador, que permite poner en el interior de las llaves el nombre de una variable, cuyo resultado convertido a texto sustituye a toda esta secuencia.

Ejemplo

Salida

Ejemplo de bb
828
de bb yy

Revísalo en Kotlin play.

fun main() {
 val TT = "bb"
 var T = 2
 /* Muestra: Ejemplo de bb */
 println("Ejemplo de $TT")
 /* Muestra: 828
de bb yy*/
 println("""${"8" + T}8
de ${TT} yy""");
}

F. Operadores de orden

  • El operador binario < representa el orden natural de los datos. Si el valor a la izquierda va antes que el de la derecha, el resultado es true; en otro caso es false.

  • El operador binario > representa el orden invertido de los datos. Si el valor a la izquierda va después que el de la derecha, el resultado es true; en otro caso es false.

  • Entre 2 caracteres, el que tenga el menor código Unicode es el menor.

  • Entre 2 textos, el que aparezca primero en el diccionario es el menor.

  • En el ejemplo que sigue, el orden natural es:

    "0" < "A" < "a" < "aa" < "ah" < "ai" < "b"

fun main() {
 // Menor que (<)
 println("0" < "A");   //T
 println("A" < "a");   //T
 println("a" < "b");   //T
 println("ah" < "aa"); //F
 println("ah" < "ah"); //F
 println("ah" < "ai"); //T
 // Mayor que (>)
 println("ah" > "aa"); //T
 println("ah" > "ah"); //F
 println("ah" > "ai"); //F
}

G. Operadores combinados de orden e igualdad

En el ejemplo que sigue, el orden natural es:

"aa" < "ah" < "ai"

fun main() {
 // Menor o igual que (<=)
 println("ah" <= "aa"); //F
 println("ah" <= "ah"); //T
 println("ah" <= "ai"); //T
 // Mayor o igual que (>=)
 println("ah" >= "aa"); //T
 println("ah" >= "ah"); //T
 println("ah" >= "ai"); //F
}

13. Operadores lógicos

Versión para imprimir.

A. Operador lógico Y

x && y es el operador Y en corto circuito.

Si x se evalúa a false, el resultado es x y no se evalúa y; de lo contrario, el resultado es y.

fun main() { 
 println(false && true); //F
 println(false && false);//F
 println(true && true);  //T
 println(true && false); //F
}

B. Operador lógico O

x || y es el operador O en corto circuito.

Si x se evalúa a true, el resultado es x y no se evalúa y; de lo contrario, el resultado es y.

fun main() {
 println(true || true);  //T
 println(true || false); //T
 println(false || true); //T
 println(false || false);//F
}

C. Operador lógico NO

!x es el operador NO.

Si x se evalúa a true, el resultado es false; de lo contrario, el resultado es true.

fun main() { 
 println(!true);  //F
 println(!false); //T
}

D. Condicional múltiple con else como operador lógico

Toma el valor de la expresión asociada a la condición que resulte verdadera de acuerdo a las reglas de la condicional múltiple con else.

fun main() { 
 println(if (true3 else 8); //3
 println(if (false3 else 8);//8
}

14. La estructura de control do-while

Versión para imprimir.

A. La estructura de control do-while

  • La siguiente figura representa el comportamiento de la estructura de control do-while:

    do-while
  • La estructura de control do-while consta de:

    • La palabra reservada do.

    • Sigue un bloque de instruciones.

    • Sigue la palabra reservada while.

    • Sigue una condición.

  • Mientras la condición evalúa a true, la estructura de control sigue repitiendo el bloque de instrucciones.

  • Cuando la condición evalúa a false, se termina el ciclo.

  • El bloque de instrucciones se ejecuta al menos una vez.

  • Para ejecutar, se siguen estos pasos:

    1. Se ejecuta el bloque se instrucciones

    2. Se evalúa la condición.

    3. Si la condición y si evalúa a false, se termina el ciclo y se continúa con las instrucciones que sigan después de la estructura; pero si evalúa a true, se regresa al a ejecutar otra vez el bloque de instrucciones y luego se evalúa la condición, para después ejecutar otra vez este paso y las instrucciones aquí indicadas.

B. Ejemplo de do-while

fun main() {
 var respuesta: String?
 do {
  print(
   """Selecciona un género musical
 1 - Pop
 2 - Reguetón
 Opción: """)
  respuesta = readLine()
 } while (respuesta != "1"
  && respuesta != "2")
 println("Adios.")
}

15. Números

Versión para imprimir.

A. Tipos enteros

  • Hay distintos tipos de enteros. La diferencia es cuantos números pueden representar y el número de bytes que utilizan.

  • Una diferencia con las matemáticas es que son circulares. Si al número más positivo le sumas 1, obtienes el más negativo y si al más negativo le restas 1, obtienes el más positivo.

Tipo Tamaño (bits) valor mínimo Valor máximo
Byte 8 -128 127
Short 16 -32768 32767
Int 32 -2,147,483,648 2,147,483,647
Long 64 -9,223,372,036,854,775,808 9,223,372,036,854,775,807

Números naturales

UByte

Enteros sin signo de 8 bits, de 0 a 255.

UShort

Enteros sin signo de 16 bits, de 0 a 65535.

UInt

Enteros sin signo de 32 bits, de 0 a 232 - 1.

ULong

Enteros sin signo de 64-bits, de 0 a 264 - 1.

B. Tipos de punto flotante

Imagen de la recta numérica

El tipo Float es más pequeño y el tipo Double es el más grande.

Los números a la izquierda son menores que los de la derecha.

0.0

Es el centro de la recta.

MIN_VALUE

Es el valor positivo más cercano a 0.

-MIN_VALUE

Es el valor negativo más cercano a 0.

MAX_VALUE

Es el valor numérico finito más positivo.

-MAX_VALUE

Es el valor numérico finito más negativo.

POSITIVE_INFINITY

Representa a todos los valores mayores que MAX_VALUE.

NEGATIVE_INFINITY

Representa a todos los valores menores que -MAX_VALUE.

C. Operadores numéricos

fun main() {
 // Suma
 println(5 + 2);  // 7
 // Resta
 println(5 - 2);  // 3
 // Multiplicación
 println(5 * 2);  //10
 // División entera
 println(5 / 2);  // 2
 // División entera
 println(5 / 2.0);  // 2.5
 // Módulo o residuo
 println(5 % 2); //  1
}

D. Operadores con asignación

  • Aparte del operador de asignación (=), hay otros operadores que permiten cambiar el valor de una variable.

  • Al declarar una variable, puedes declarar su tipo.

Ejemplo

fun main() {
 var b: Int = 4;
 val d = 5;
 b = d * 2// b === 10
 println(b);
 b += d; // b = b + d; b === 15
 println(b);
 b -= 2// b = b - 2; b === 13
 println(b);
 b *= 3// b = b * 3; b === 39
 println(b);
 b /= 3// b = b / 3; b === 13
 println(b);
 b %= 5// b = b % 5; b === 3
 println(b);
}

E. Incremento y decremento

También hay operadores de incremento y decremento en 1, pero son algo truculentos; es mejor usarlos solos, sin combinarlos con otros operadores.

Ejemplo

fun main() {
 var z = 0;
 println(z); // 0
 // Incremento. Aumenta z en 1.
 z++;
 // z === 1
 println(z); // 1
 // Decremento. Disminuye z en 1.
 z--;
 // z === 0
 println(z); // 0
}

F. Operadores de igualdad

fun main() {
 // Igual que (==)
 println(3 == 3);  //true
 println(3 == -3); //false
 // Diferente de (!==)
 println(3 != 3); // false
 println(3 != 8); // true
}

G. Operadores de orden

  • El operador binario < representa el orden natural de los datos. Si el valor a la izquierda va antes que el de la derecha, el resultado es true; en otro caso es false.

  • El operador binario > representa el orden invertido de los datos. Si el valor a la izquierda va después que el de la derecha, el resultado es true; en otro caso es false.

  • En el ejemplo que sigue, el orden natural es:

    0 < 3 < 8

fun main() {
 // Menor que (<)
 println(3 < 0); // false
 println(3 < 3); // false
 println(3 < 8); // true
 // Mayor que (>)
 println(3 > 0); // true
 println(3 > 3); // false
 println(3 > 8); // false
}

H. Operadores combinados de orden e Igualdad

En el ejemplo que sigue, el orden natural es:

0 < 3 < 8

fun main() {
 // Menor o igual que (<=)
 println(3 <= 0); // false
 println(3 <= 3); // true
 println(3 <= 8); // true
 // Mayor o igual que (>=)
 println(3 >= 0); // true
 println(3 >= 3); // true
 println(3 >= 8); // false
}

I. Precedencia de Operadores

Aquí se muestra el orden en que se ejecutan los operadores de JavaScript cuando se combinan en una expresión. Los que aparecen primero son los que se ejecutan primero. Una tabla similar para Kotlin está en desarrollo.

Orden Descripción Asociatividad Operador ejempo
1 agrupamiento n/a () (2 + 3)
2 miembro izquierda a derecha . a.b
[] a[0]
new n/a new() new Clase(0)
invocación a función izquierda a derecha () fn(x)
3 incremento sufijo n/a ++ a++
decremento sufijo n/a -- a--
4 incremento prefijo n/a ++ ++a
decremento prefijo n/a -- --a
not lógico derecha a izquierda ! !a
not a nivel de bits derecha a izquierda ~ ~a
+ unario derecha a izquierda + +a
negación unaria derecha a izquierda - -a
typeof derecha a izquierda typeof typeof a
void derecha a izquierda void void a
delete derecha a izquierda delete delete a.nombre
5 exponenciación n/a ** a ** b
6 multiplicación izquierda a derecha * a * b
división izquierda a derecha / a / b
residuo izquierda a derecha % a % b
7 suma izquierda a derecha + a + b
resta izquierda a derecha - a - b
8 corrimiento de bits izquierda a derecha << a << b
>> a >> b
>>> a >>> b
9 relacional izquierda a derecha < a < b
<= a <= b
> a > b
>= a >= b
in izquierda a derecha in "nombre" in a
instanceof izquierda a derecha instanceof a instanceof Array
10 igualdad izquierda a derecha == a == b
!= a != b
=== a === b
!== a !== b
11 and de bits izquierda a derecha & a & b
12 xor de bits izquierda a derecha ^ a ^ b
13 or de bits izquierda a derecha | a | b
14 and lógico izquierda a derecha && a && b
15 or lógico izquierda a derecha || a || b
16 condicional derecha a izquierda ?: a ? b : c
17 asignación derecha a izquierda = a = b
+= a += b
-= a -= b
*= a *= b
/= a /= b
%= a %= b
<<= a <<= b
>>= a >>= b
>>>= a >>>= b
&= a &= b
^= a ^= b
|= a |= b
18 yield derecha a izquierda yield yield a
19 coma izquierda a derecha , a , b

J. Expresiones

Hay que aprender a estructurar las expresiones matemáticas en el lenguaje de programación.

Ejemplos de expresiones aritméticas expresadas en Kotlin

x = (-b + Math.sqrt(b**2 - 4*a*c)) / (2*a)

x = (-b + Math.sqrt(b**2 - 4*a*c)) / (2*a)

y = ((y2 - y1) / (x2 - x1)) * (x - x1) + y1

y = ((y2 - y1) / (x2 - x1)) * (x - x1) + y1

Temas por Investigar

  • La clase Math.

16. La estructura de control while

Versión para imprimir.

A. La estructura de control while

  • La siguiente figura representa el comportamiento de la estructura de control while:

    if
  • La estructura de control while consta de:

    1. La palabra reservada while.

    2. Una condición.

    3. Un bloque de instrucciones.

  • Para ejecutar, se siguen estos pasos:

    1. Se evalúa la condición.

    2. Si la condición evalúa a false, se termina la ejecución del ciclo y continúa con las instrucciones que aparecen después de la estructura; si la condición evalúa a true, continúa con el siguiente paso.

    3. Se elecuta el bloque de instrucciones.

    4. Regresa al paso 1 y vuelve a ejecutar los pasos.

  • Mientras la condición evalúa a true, la estructura de control sigue repitiendo el bloque de instrucciones.

  • Cuando la condición evalúa a false, se termina el ciclo.

B. Prueba de escritorio con while ascendente

fun main() {
 var i = 1;
 while (i <= 3) {
  println(i);
  i++;
 }
 println("Adios.");
}

C. Prueba de escritorio con while ascendente de 2 en 2

fun main() {
 var i = 0;
 while (i < 6) {
  println(i);
  i += 2;
 }
 println("Adios.");
}

D. Prueba de escritorio con while

fun main() {
 var a = 2;
 while (a > 0) {
  println(a);
  a--;
  println(a);
 }
 println("Adios.");
}

E. Prueba de escritorio con while descendente de 2 en 2

fun main() {
 var a = 6;
 while (a > 0) {
  println(a);
  a -= 2;
 }
 println("Adios.");
}

F. Prueba de escritorio con while que no se ejecuta

fun main() {
 let i = 8;
 while (i > 8) {
  i--;
  println(i);
 }
 println("Adios.");
}

G. Prueba de escritorio con while descendente mal diseñado

fun main() {
 var i = 1;
 while (i <= 3) {
  println(i);
  i--;
 }
 println("Adios.");
}

H. Prueba de escritorio con while ascendente mal diseñado

fun main() {
 var i = 2;
 while (i > 0) {
  println(i);
  i++;
 }
 println("Adios.");
}

17. La estructura de control for

Versión para imprimir.

A. La estructura de control for

  • La estructura de control for consta de la siguiente estructura:

    for (inicialización; condición; paso) {
       instrucciones
     }
  • Equivale a la estructura de control:

    {
       inicialización;
       while (condición) {
         instrucciones
         paso;
       }
     }
  • La sección de inicialización crea variables que solo existen durante la ejecución del ciclo for y se eliminan una vez terminado.

  • La sección de paso cambia el valor de las variables para que hacer que la condición esté cada vez más cerca de evaluar a false.

B. Código con for

fun main() {
 println("Hola.");
 for (i in 1..3) {
  println(i);
 }
 println("Segundo for.");
 for (i in 6 downTo 0 step 2) {
  println(i);
 }
 println("Adios.");
}

18. La estructura de control when

Versión para imprimir.

A. Código con when

import { Diapositiva } from "../../lib/Diapositiva.js"; import "../../lib/muestra-codigo.js"; export class BCodigo extends Diapositiva { /** @override */ connectedCallback() { super.connectedCallback(); this.innerHTML = /* html */ `

A. Código con when

fun main() {
 print(
  """Selecciona un género musical:
 1 - Pop
 2 - Reguetón
 3 - Balada
 4 - Mariachi
 5 - Cumbia
 6 - Tango
 Opción: """)
 val género = readLine()
 when (género) {
  "1" -> {
   println("Ariana Grande")
  }
  "3""4" -> {
   println("Juan Gabriel")
  }
  "5" -> {
   println("Selena")
  }
  "2" -> {
   println("Bad Bunny")
  }
 }
 println("Adios.")
}
`; } } customElements.define("a-17-codigo-switch", BCodigo);

B. Código con when y else

import { Diapositiva } from "../../lib/Diapositiva.js"; import "../../lib/muestra-codigo.js"; export class BCodigo extends Diapositiva { /** @override */ connectedCallback() { super.connectedCallback(); this.innerHTML = /* html */ `

D. Código con when y else

fun main() {
 print(
  """Selecciona un género musical:
 1 - Pop
 2 - Reguetón
 3 - Balada
 4 - Mariachi
 5 - Cumbia
 6 - Tango
 Opción: """)
 val género = readLine()
 when (género) {
  "1" -> {
   println("Ariana Grande")
  }
  "3""4" -> {
   println("Juan Gabriel")
  }
  "5" -> {
   println("Selena")
  }
  "2" -> {
   println("Bad Bunny")
  }
  else -> {
   println(
    "De ese género no conozco.");
  }
 }
 println("Adios.");
}
`; } } customElements.define("b-17-codigo-switch-default", BCodigo);

19. Funciones

Versión para imprimir.

A. Funciones

  • Las funciones son secuencias de instrucciones que tienen asociado un nombre.

  • El nombre de una función es un identificador.

  • Una función no se ejecuta ella misma; debe usarse el nombre de la función seguida de paréntesis para que se ejecute. Por ejemplo, si una función se llama saluda, para hacer que se ejecute hay que ejecutar la instrucción saluda()

  • A la instrucción que solicita la ejecución de una función, se le llama invocación de función.

    Antes de que una función se ejecute, se suspende lo que se estaba haciendo y se marca el punto donde se invocó la función. Posteriormente se ejecuta la función y al terminar, se regresa al punto de invocación y se continúa con la siguiente instrucción.

Ejemplo

Salida

Main 1
Hola
Main 2
Hola
Adios

Revísalo en Kotlin play.

fun main() {
 println("Main 1")
 saluda() // invoca a saluda.
 /* Al terminar la primera
  * invocación continúa aquí. */
 println("Main 2")
 saluda() // invoca a saluda.
 /* Al terminar la segunda
  * invocación continúa aquí. */
 println("Adios")
}

/* Declaración de function saluda.
 * Primero va la palabra fun.
 * Sigue el nombre de la función.
 * Siguen los paréntesis.
 * Finalmente, entre llaves ({})
 * van las instrucciones. */
fun saluda() {
 println("Hola")
}
`; } } customElements.define("a1-funciones", A1Funciones);

B. Funciones que invocan funciones

Salida

main-1
c2
main-2
c1-1
c2
c1-2
main-3

Revísalo en Kotlin play.

fun main() {
 println("main-1")
 c2()
 println("main-2")
 c1()
 println("main-3")
}

fun c1() {
 println("c1-1")
 c2()
 println("c1-2")
}

fun c2() {
 println("c2")
}

C. Recursividad

Salida

m1
1
3

Revísalo en Kotlin play.

fun main() {
 println("m1")
 fn(3, -2)
 println("3")
}

fun fn(aIntbInt) {
 println(a + b)
}

D. Funciones con expresiones en los parámetros

Salida

13
ggg

Revísalo en Kotlin play.

fun fn(aIntbIntcInt) {
 println(a + b * c)
}

fun main() {
 val a = 3
 fn(3 - 8, a, a * 2)
 println("ggg")
}

E. Funciones con valor de regreso

Salida

18
6
33
65

Revísalo en Kotlin play.

fun main() {
 val x = fna(85)
 println(fna(41))
 println(x)
}

fun fna(tIntbcInt): Int {
 println(t + bc * 2)
 return 1 + t * 8
}

F. Lambdas

Salida

hola
-11
-60
mx
4

Revísalo en Kotlin play.

fun main() {
 val fx = { println("hola") }
 val fy =
  { f: String -> println(f) }
 val fz = { a: Int, b: Int ->
  println(a + b)
  a * b
 }
 val fw = { g: Int -> g + 1 }
 fx()
 println(fz(4, -15))
 fy("mx")
 println(fw(3))
}

G. Recursividad

Salida

Invoca: 2, 3
Invoca: 1, 3
Invoca: 0, 3
Devuelve 3
Devuelve: 4
Devuelve: 5
5

Revísalo en Kotlin play.

fun fns(aUIntbUInt): UInt {
 return if (a == 0U) {
  println("Devuelve $b")
  b
 } else {
  println("Invoca: ${a - 1U}, $b")
  val ant = fns(a - 1U, b)
  println("Devuelve: ${ant + 1U}")
  ant + 1U
 }
}

fun main() {
 println("Invoca: 2, 3")
 println(fns(2U, 3U))
}

20. Clases

Versión para imprimir.

A. Clases

Referencia y objeto inicialmente Agregamos manita a Agregamos manita b Aprende a saludar

Salida

Hola. Soy pp - marrón
pp
qk
verde
marrón
Hola. Soy qk - verde

Revísalo en Kotlin play.

class Cl01(val nombreString,
  val color:String) {
 fun saluda() {
  println(
   "Hola. Soy $nombre - $color")
 }
}
fun main() {
 val tel1 = Cl01("pp""marrón")
 val tel2 = Cl01("qk""verde")
 tel1.saluda()
 println(tel1.nombre)
 println(tel2.nombre)
 println(tel2.color)
 println(tel1.color)
 tel2.saluda()
}

B. Setters y getters

Salida

pp
pp juega

Revísalo en Kotlin play.

class ClX {
 var nombre = ""
  get() = field
  set (nombre) {
   field = nombre
  }
  val juega
   get() = "${this.nombre} juega"
}

fun main() {
 val tt1 = ClX()
 tt1.nombre = "pp"
 println(tt1.nombre)
 println(tt1.juega)
}

21. Herencia

Versión para imprimir.

A. Constructores

Salida

4
-2
8

Revísalo en Kotlin play.

open class ClM1(val mInt) { }
class ClH1 (bIntval hInt) :
 ClM1(b) {}

fun main() {
 val th1 = ClH1(4, -2)
 println(th1.m)
 println(th1.h)
 val tm1 = ClM1(8)
 println(tm1.m)
}

B. Sobrescritura de métodos

Salida


Hola.
Hola.
Consola.

Revísalo en Kotlin play.

open class ClM2 {
 open fun muestra() {
  println("Hola.")
 }
}
class ClH2 : ClM2() {
 override fun muestra() {
  super.muestra()
  println("Consola.")
 }
}

fun main() {
 val tm2 = ClM2()
 tm2.muestra()
 val th2 = ClH2()
 th2.muestra()
}

22. Ejemplo de app Android

Versión para imprimir.

A. Instrucciones

Vista de Ejemplo
Vista de Ejemplo
  • En esta lección se muestra como crear un proyecto de Android y ejecutarlo.

  • Sigue los mismos pasos que en las instrucciones para instalar Android Studio, per posteriormente el proyecto se sube a GitHub.

  • En el resto de la lección se muestran los archivos destacados.

Pasos a seguir

  1. Crear un proyecto para phone & tablet de tipo Empty Activity. Video sobre como crear el proyecto.

  2. Las aplicaciones se pueden correr sobre un dispositivo real habilitado para desarrollo o en un emulador dentro de la computadora de desarrollo. En este último caso, si no tienes configurado un emulador, hay que crearlo. Video sobre como crear el emulador.

  3. Ejecuta el proyecto sobre el emulador de teléfono o el dispositivo real. Video sobre como ejecutar el proyecto.

  4. Necesitas una cuenta de email. Si no la tienes, crea una. Video sobre como crear una cuenta de Google.

  5. Crea una cuenta en https://github.com. Video sobre como crear una cuenta de GitHub.

    Recuerda que cuando hayas creado tu proyecto, debes configurar Git en tu computadora con las instrucciones:

    git config --global user.name usuario_GitHub

    Donde usuario_GitHub es tu usuario de GitHub.

    git config --global user.email email_GitHub

    Donde email_GitHub es el email registrado en GitHub.

  6. Sube tu proyecto a GitHub desde Android Studio. Video sobre como subir el proyecto a GitHub.

B. Archivos

C. app/res/values/strings.xml

<resources>
 <string
   name="app_name">Ejemplo</string>
</resources>

D. app/res/layout/activity_main.xml

Diseño de vista de Ejemplo
Diseño de vista de Ejemplo
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".MainActivity">

 <TextView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="Hola mundo"
   app:layout_constraintBottom_toBottomOf="parent"
   app:layout_constraintLeft_toLeftOf="parent"
   app:layout_constraintRight_toRightOf="parent"
   app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

E. app/java/io.github.gilpgdm/MainActivity.kt

package io.github.gilpgdam

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity :
 AppCompatActivity() {
 override fun onCreate(
  savedInstanceState: Bundle?
 ) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_main)
 }
}

F. app/manifest/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest
  xmlns:android="http://schemas.android.com/apk/res/android"
  package="io.github.gilpgdam">

 <application
   android:allowBackup="true"
   android:icon="@mipmap/ic_launcher"
   android:label="@string/app_name"
   android:roundIcon="@mipmap/ic_launcher_round"
   android:supportsRtl="true"
   android:theme="@style/Theme.Ejemplo">
  <activity
    android:name=".MainActivity"
    android:exported="true">
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>
 </application>

</manifest>

23. EFormulario

Versión para imprimir.

A. Instrucciones

Vista de Formulario
Formulario con datos
Formulario muestra resultados
  • En esta lección se muestra como crear un formulario y ejecutarlo.

  • Son los mismos pasos que en las instrucciones para el ejemplo de Android Studio.

Pasos a seguir

  1. Crear un proyecto para phone & tablet de tipo Empty Activity. Video sobre como crear el proyecto.

  2. Las aplicaciones se pueden correr sobre un dispositivo real habilitado para desarrollo o en un emulador dentro de la computadora de desarrollo. En este último caso, si no tienes configurado un emulador, hay que crearlo. Video sobre como crear el emulador.

  3. Modifica el proyecto con el contenido de los archivos que se muestran en esta lección.

  4. Ejecuta el proyecto sobre el emulador de teléfono o el dispositivo real. Video sobre como ejecutar el proyecto.

B. Archivos

C. app/res/values/strings.xml

<resources>
 <string
   name="app_name">Formulario</string>
 <string
   name="saludar">Saludar</string>
 <string
   name="nombre">Nombre</string>
</resources>

D. app/res/layout/activity_main.xml

Diseño de vista de Formulario
Diseño de vista de Formulario
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".MainActivity">

 <Button
   android:id="@+id/button"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_marginTop="16dp"
   android:text="@string/saludar"
   app:layout_constraintEnd_toEndOf="parent"
   app:layout_constraintHorizontal_bias="0.535"
   app:layout_constraintStart_toStartOf="parent"
   app:layout_constraintTop_toBottomOf="@+id/textInputLayout" />

 <com.google.android.material.textfield.TextInputLayout
   android:id="@+id/textInputLayout"
   android:layout_width="0dp"
   android:layout_height="wrap_content"
   android:layout_marginStart="16dp"
   android:layout_marginTop="16dp"
   android:layout_marginEnd="16dp"
   android:layout_marginBottom="16dp"
   app:layout_constraintBottom_toTopOf="@+id/button"
   app:layout_constraintEnd_toEndOf="parent"
   app:layout_constraintStart_toStartOf="parent"
   app:layout_constraintTop_toTopOf="parent">

  <com.google.android.material.textfield.TextInputEditText
    android:id="@+id/nombre"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/nombre" />
 </com.google.android.material.textfield.TextInputLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

E. app/java/io.github.gilpgdam.formulario/MainActivity.kt

package io.github.gilpgdam.formulario

import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.snackbar.Snackbar

class MainActivity :
 AppCompatActivity() {
 override fun onCreate(
  savedInstanceState: Bundle?
 ) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_main)
  val txtNombre =
   findViewById<EditText>(R.id.nombre)
  val button =
   findViewById<Button>(R.id.button)
  button.setOnClickListener { view ->
   val nombre =
    txtNombre.text.toString()
   Snackbar.make(
    view,
    "Hola $nombre.",
    Snackbar.LENGTH_LONG
   ).show()
  }
 }
}

F. app/manifest/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest
  xmlns:android="http://schemas.android.com/apk/res/android"
  package="io.github.gilpgdam.formulario">

 <application
   android:allowBackup="true"
   android:icon="@mipmap/ic_launcher"
   android:label="@string/app_name"
   android:roundIcon="@mipmap/ic_launcher_round"
   android:supportsRtl="true"
   android:theme="@style/Theme.Formulario">
  <activity
    android:name=".MainActivity"
    android:exported="true">
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>
 </application>

</manifest>

24. Servicio

Versión para imprimir.

A. Instrucciones

Vista de Formulario
Formulario con datos
  • En esta lección se muestra como crear un proyecto de Android que accese a un servicio en un servidor PHP y ejecutarlo.

Pasos a seguir

  1. Primero hay que crear un proyecto en un servidor PHP con el contenido de index.php. Video sobre como crear el proyecto PHP.

  2. Crear un proyecto para phone & tablet de tipo Empty Activity. Video sobre como crear el proyecto.

  3. Las aplicaciones se pueden correr sobre un dispositivo real habilitado para desarrollo o en un emulador dentro de la computadora de desarrollo. En este último caso, si no tienes configurado un emulador, hay que crearlo. Video sobre como crear el emulador.

  4. Modifica el proyecto con el contenido de los archivos que se muestran en esta lección.

  5. Ejecuta el proyecto sobre el emulador de teléfono o el dispositivo real. Video sobre como ejecutar el proyecto.

B. Archivos

Servidor PHP

Proyecto Android

C. index.php

<?php echo 'Hola'; ?>

D. app/res/values/strings.xml

<resources>
 <string
   name="app_name">Servicio</string>
 <string name="esperando">Esperando…</string>
</resources>

E. app/res/layout/activity_main.xml

Diseño de vista de Formulario
Diseño de vista de Formulario
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".MainActivity">

 <TextView
   android:id="@+id/mensaje"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="@string/esperando"
   app:layout_constraintBottom_toBottomOf="parent"
   app:layout_constraintLeft_toLeftOf="parent"
   app:layout_constraintRight_toRightOf="parent"
   app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

F. app/java/io.github.gilpgdam.servicio/MainActivity.kt

package io.github.gilpgdam.servicio

import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import java.net.HttpURLConnection
import java.net.URL

class MainActivity :
 AppCompatActivity() {
 override fun onCreate(
  savedInstanceState: Bundle?
 ) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_main)
  val mensaje =
   findViewById<TextView>(R.id.mensaje)
  Thread {
   val connection =
    URL("https://holaphp.gilbertopachec3.repl.co/")
     .openConnection()
      as HttpURLConnection
   connection.connect()
   val code =
    connection.responseCode;
   if (200 <= code && code < 300) {
    val text =
     connection.inputStream.use {
      it.reader()
       .use { reader -> reader.readText() }
     }
    mensaje.post {
     mensaje.text = text
    }
   } else {
    mensaje.post {
     mensaje.text =
      connection.responseMessage
    }
   }
   connection.disconnect()
  }.start()
 }
}

G. app/manifest/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest
  xmlns:android="http://schemas.android.com/apk/res/android"
  package="io.github.gilpgdam.servicio">

 <uses-permission android:name="android.permission.INTERNET" />
 <application
   android:allowBackup="true"
   android:icon="@mipmap/ic_launcher"
   android:label="@string/app_name"
   android:roundIcon="@mipmap/ic_launcher_round"
   android:supportsRtl="true"
   android:theme="@style/Theme.Servicio">
  <activity
    android:name=".MainActivity"
    android:exported="true">
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>
 </application>

</manifest>