Materia de Aplicaciones Móviles y Servicios Telemáticos
Desarrollar aplicaciones móviles considerando las características de la programación en dispositivos móviles.
Recursos: Android Studio, GitBash, GitHub online.
Duración: 5 horas
Instrucciones
Desarrolle un aplicativo móvil usando componentes avanzados como menú, y cargue el código fuente en un repositorio de GitHub.
Actividades
(*) Como resultado se creará un proyecto, el cual solo presenta el mensaje “Hello World”.
Seleccione en la ruta app > res > layout > activity_main.xml.
En la parte superior seleccione la pestaña “Design” para comenzar a diseñar la interfaz de usuario de la aplicación usando controles personalizados.
Archivo: activity_main.xml
<?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"
android:orientation="vertical"
tools:context=".MainActivity"
tools:ignore="MissingConstraints">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="20dip"
tools:ignore="MissingConstraints">
<EditText
android:id="@+id/edtUsuario"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Usuario" />
<EditText
android:id="@+id/edtClave"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Clave" />
<Button
android:id="@+id/btnLogin"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="Login"
android:layout_gravity="center_horizontal"
android:paddingLeft="15dip"
android:paddingRight="15dip"
android:onClick="login"/>
<Button
android:id="@+id/btnRegistro"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:onClick="registrarse"
android:paddingLeft="15dip"
android:paddingRight="15dip"
android:text="Registrarse" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
Archivo: MainActivity.java
package com.example.appamst0;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private EditText edtUsuario, edtClave;
private Button btnLogin, btnRegistro;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Referencias a los controles del diseño
edtUsuario = (EditText) findViewById(R.id.edtUsuario);
edtClave = (EditText) findViewById(R.id.edtClave);
btnLogin = (Button) findViewById(R.id.btnLogin);
btnRegistro = (Button) findViewById(R.id.btnRegistro);
}
public void registrarse(View view) {
Intent intent = new Intent(this, formulario_registro.class);
startActivity(intent);
}
public void login(View view) {
Toast toast=Toast.makeText(getApplicationContext(),"Usted no cuenta con un usuario",Toast.LENGTH_SHORT);
toast.show();
}
public void onClick(View v) {
if(v.getId() == R.id.btnLogin){
Log.d("mensaje","ïngreso");
}else if(v.getId() == R.id.btnRegistro) {
}
}
}
Archivo: formulario_registro.java
package com.example.appamst0;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
public class formulario_registro extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_formulario_registro);
}
//insertarpaciente
public void insertarpaciente(View v) {
addNotification();
}
private void addNotification() {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
String id ="canal";
String description = "AMST";
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(id, description, importance);
NotificationCompat.Builder builder =
new NotificationCompat.Builder(this,id)
.setSmallIcon(R.drawable.medicalcare)
.setContentTitle("Se ha registrado con exito")
.setContentText("Revise su correo electronico en los proximos 2 dias")
.setAutoCancel(true)
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
Intent notificationIntent = new Intent(this, formulario_registro.class);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
notificationIntent.putExtra("message", "This is a notification message");
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pendingIntent);
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
manager.createNotificationChannel(channel);
manager.notify(0, builder.build());
}}
}
Archivo: activity_formulario_registro.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".formulario_registro">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/txtNombre"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Nombres:"/>
<EditText
android:id="@+id/edtNombre"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:text=""/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/txtApellido"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Apellidos:"/>
<EditText
android:id="@+id/edtApellido"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:text=""/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/txtCedula"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cedula:"/>
<EditText
android:id="@+id/edtCedula"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="number"
android:text=""/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/txtEdad"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Edad:"/>
<EditText
android:id="@+id/edtEdad"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="number"
android:text=""/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/txtAltura"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Altura:"/>
<EditText
android:id="@+id/edtAltura"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="numberDecimal"
android:text=""/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/txtPeso"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Peso:"/>
<EditText
android:id="@+id/edtPeso"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="numberDecimal"
android:text=""/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/txtEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Email:"/>
<EditText
android:id="@+id/edtEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textEmailAddress"
android:text=""/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/txtUsuario"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Usuario:"/>
<EditText
android:id="@+id/edtUsuario"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:text=""/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/txtClave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Clave:"/>
<EditText
android:id="@+id/edtClave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPassword"
android:text=""/>
</LinearLayout>
<Button
android:id="@+id/btnGrabaregistro"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Grabar"
android:onClick="insertarpaciente"/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
Para la primera opción de ejecución de la aplicación se usa un teléfono móvil conectado vía USB a la computadora que contiene la aplicación móvil, posterior indicará que instale un apk que contiene la ejecución de la aplicación. Se puede ver más de eso a partir del Paso 4: Habilitación de opciones para el desarrollador en el teléfono móvil con sistema operativo Android.
Para la segunda opción de ejecución de la aplicación se usa el emulador seleccionando el dispositivo virtual que le aparezca, en este caso Pixel 6 Pro API 28. En caso de que no tenga instalado ningún dispositivo virtual continúe al literal 17.
Nota: Verificar que la API del dispositivo sea mayor a 26, caso contrario continuar al literal 17.
16.1 Durante la ejecución de la aplicación mediconline se debe ingresar un usuario y contraseña. No hay usuarios registrados para la aplicación por lo que debe salir el mensaje: “Usted no cuenta con un usuario”
16.2 Cuando da clic en el botón Registrarse, debe ingresar sus datos y dar click a grabar para que aparezca la notificación. La interfaz de usuario se encuentra diseñada en el archivo activity_formulario_registro.xml.
Crear un dispositivo virtual.
Seleccionar el hardware “Pixel 6 PRO”, luego dar click en el botón siguiente. El hardware seleccionado no es relevante para la práctica, pero es recomendable escoger aquellos con símbolo del Play Store.
Activar modo de desarrollo y depuración USB en Android
Habilitar depuración por USB
En el Select Device del menú se puede observar como ya está configurado su dispositivo móvil, al hacer click en “run” puede observar cómo se ejecuta la aplicación en el mismo.
GIT en línea de comandos de Windows
GIT BASH propia
Esto creará un archivo oculto [.git] para el manejo del repositorio y nos ubicará directamente en la rama “master”
Importante: Para poder realizar un commit es necesario configurar previamente su correo y nombre de usuario, por lo que debe poseer un usuario de GitHub. Los comandos por utilizar para configurar sus credenciales son:
git config –global user.email “miusuario@example.com” git config –global user.name “Tu nombre”
Una vez configurado su usuario en git podrá subir su commit.
Nombre del repositorio: El nombre de nuestro repositorio que será publicado en línea. Para este taller, usaremos AMST[numeroGrupo].
Descripción (opcional) Descripción sobre lo que realiza nuestro proyecto
Tipo Público o privado (para saber si es visible en línea)
Archivo Readme Archivo inicial del repositorio. Agregamos indicaciones para otros programadores
Agregar. gitignore Archivo para seleccionar los archivos que no queremos subir a nuestro repositorio
Licencia Tipo de licencia: OpenSouce, MIT, Apache, etc.
Una vez ingresados todos los campos, se da clic en “Create repository”.
Vista del repositorio vacío.
$ git branch -M main (Es necesario un cambio de rama)
$ git remote add origin [link URL del repositorio]
$ git push -u origin main
Preguntas de investigación:
Para habilitar la modificación a otros miembros de mi grupo, debemos darle acceso. [Incluso si el proyecto es libre, solo pueden modificarlo quienes han sido invitados]. Para esto de clic en el tab “Settings/Configuración” > Manage Access / Administrar acceso
Buscamos y agregamos a otros usuarios (usuario de GitHub).
$ git clone [web URL del repositorio]
Para este taller, crearemos una rama de la siguiente forma: “nombre_apellido1”
Git add –all: Agrega todos los cambios a nuestra rama.
Git commit -m “cambios a mi rama” Agrega un commit en mi rama, indicando los cambios que realice.
Git push origin [nombre rama] Subimos los cambios al repositorio (pero solo dentro de la página).
Las ramas funcionan como proyectos paralelos del proyecto principal, pero para avanzar con el proyecto es necesario unir las ramas una vez han sido probadas.
En caso de realizar algún cambio en el repositorio principal. a. git fetch origin main (obtiene todos los cambios realizados en main)
Nos cambiamos a la rama principal. a. git checkout main
Traemos los cambios realizados en la rama única. a. git merge [nombre rama]
Nota: Esto indica los archivos que han sido modificados.
Preguntas de investigación
TAREAS DE DESAFÍO (30 puntos):
La práctica de laboratorio será desarrollada en el siguiente formato: