Documentos de Académico
Documentos de Profesional
Documentos de Cultura
FACULTAD DE I NGENIERÍA
I NGENIERÍA EN AUTOMATIZACIÓN
Servicios y Notificaciones
Practica 6
Profesor:
Dr. Ramos Arreguín Juan Manuel
Alumno:
Cervantes Ortiz José Eduardo 283343
14 de Septiembre de 2022
1. Generacion de Notificaciones
Las notificaciones proporcionan información breve sobre eventos de la aplicacion cuando no
está en uso. Existen varias funciones para Android 4.0 (API nivel 14) y versiones posteriores.
1.1 Definición del contenido de la notificación
Primero se debe configurar el contenido y el canal de la notificación con un objeto Notifica-
tionCompat.Builder. En siguiente codigo se muestra como se crea una notificación con un ícono
pequeño, establecido por setSmallIcon(), un título, establecido por setContentTitle(), el texto del
cuerpo establecido por setContentText() y la prioridad de notificación, establecida por setPriority().
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle(textTitle)
.setContentText(textContent)
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
1
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("My notification")
.setContentText("Hello World!")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
// Set the intent that will fire when the user taps the notification
.setContentIntent(pendingIntent)
.setAutoCancel(true);
// notificationId is a unique int for each notification that you must define
notificationManager.notify(notificationId, builder.build());
2
1.6 Cómo agregar una barra de progreso
Las notificaciones pueden incluir un indicador de progreso animado que muestre a los usuarios
el estado de una operación constante.
Si se puede estimar qué parte de la operación estará completa en cualquier momento, se llama a
setProgress(max, progress, false). El primer parámetro es el valor çompleto"(como 100); el segundo
es qué parte está completa; y el último indica que se trata de una barra de progreso definido.
Mientras la operación avance, se llama a setProgress(max, progress, false) de manera continua con
un valor actualizado de progress y vuelve a emitir la notificación.
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);
builder.setContentTitle("Picture Download")
.setContentText("Download in progress")
.setSmallIcon(R.drawable.ic_notification)
.setPriority(NotificationCompat.PRIORITY_LOW);
// When done, update the notification one more time to remove the progress bar
builder.setContentText("Download complete")
.setProgress(0,0,false);
notificationManager.notify(notificationId, builder.build());
3
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setFullScreenIntent(fullScreenPendingIntent, true);
Se llama a cancelAll(), que elimina todas las notificaciones que emitiste previamente.
4
2. Service GPS
En el androidmanifest se activan los permisos y se define el nuevo servicio, se crea el servicio
dentro del cual están los métodos para checar si es que el usuario tiene activado el gps y en caso de
que no se crea la solicitud para que lo active.
5
En el main Activity se encuentran dos botones para el incio y paro del servicio asi como un
objeto de tipo TextView. En el método de activación se define un objeto de tipo intent que es con
el que se va a llamar a al servicio. Cuando el servicio es activado se despliega una notificacion
indicando la direccion actual. En la clase donde se define el servicio se encuentran dos objetos de
la clase LocationListener y LocationManager que van a ser usados para obtener la dirección así
como su actualización.
Figura 2:
6
Cada que se actualiza la localización esta es mandada hacia la notificación creada en el mo-
mento que se inicia el servicio. Si se presiona la notificación entonces se pasa el dato de la última
localización hacia un texto en la actividad principal.
7
Cuando se presiona la tecla de detener el servicio se deja de actualizar la direccion y se elimina
la notificacion creada.
8
3. Código
3.1 AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.servicegps">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ServiceGPS"
tools:targetApi="31">
<activity
android:name=".OtherActivity"
android:exported="false" />
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</manifest>
3.2 activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start Service"
android:id="@+id/button"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
9
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Stop Service"
android:id="@+id/button2"
android:layout_alignTop="@+id/button"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<ScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/scrollView"
android:layout_centerHorizontal="true"
android:foregroundGravity="top|right"
android:layout_above="@+id/button"
android:layout_alignParentTop="true"
android:clickable="true">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text=""
android:id="@+id/textView" />
</ScrollView>
</RelativeLayout>
3.3 MainActivity.java
package com.example.servicegps;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.app.RemoteInput;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
@Override
10
protected void onResume() {
super.onResume();
if(broadcastReceiver == null){
broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
textView.setText("Coordenadas:\n" +intent.getExtras().get("coordinates"));
}
};
}
registerReceiver(broadcastReceiver,new IntentFilter("location_update"));
}
@Override
protected void onDestroy() {
super.onDestroy();
if(broadcastReceiver != null){
unregisterReceiver(broadcastReceiver);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(!runtime_permissions())
enable_buttons();
}
btn_start.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent i =new Intent(getApplicationContext(),GPS_Service.class);
startService(i);
}
});
btn_stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
11
private boolean runtime_permissions() {
if(Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_
return true;
}
return false;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] gra
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == 100){
if( grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PER
enable_buttons();
}else {
runtime_permissions();
}
}
}
}
3.4 activity_other.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"
tools:context=".OtherActivity">
</androidx.constraintlayout.widget.ConstraintLayout>
3.5 OtherActivity.java
package com.example.servicegps;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.widget.TextView;
12
private Context cont;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_other);
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
@Override
public void onProviderEnabled(String s) {
@Override
public void onProviderDisabled(String s) {
//Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
//i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//startActivity(i);
}
};
//noinspection MissingPermission
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,3000,0,listener);
//locationManager.removeUpdates(listener);
}
}
3.6 strings.xml
<resources>
<string name="app_name">ServiceGPS</string>
<string name="reply_label">Etiqueta de replica</string>
</resources>
3.7 GPS_Service.java
package com.example.servicegps;
13
import android.app.RemoteInput;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import androidx.annotation.Nullable;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
nh = new NotificationHelper(cont);
nh.createNotification("GPS", "long: "+location.getLongitude() +"\nlat: "+location.getLatitud
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
@Override
public void onProviderEnabled(String s) {
@Override
public void onProviderDisabled(String s) {
Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
14
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
};
//noinspection MissingPermission
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,3000,0,listener);
}
@Override
public void onDestroy() {
super.onDestroy();
if(locationManager != null){
//noinspection MissingPermission
locationManager.removeUpdates(listener);
}
nh.cancelNotification();
}
}
3.8 NotificationHelper.java
package com.example.servicegps;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.provider.Settings;
import androidx.core.app.NotificationCompat;
15
}
/**
* Create and push the notification
*/
public void createNotification(String title, String message)
{
/**Creates an explicit intent for an Activity in your app**/
Intent resultIntent = new Intent(mContext , OtherActivity.class);
resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//PendingIntent resprueba = PendingIntent.getActivity()
PendingIntent resultPendingIntent = PendingIntent.getActivity(mContext,
0 /* Request code */, resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder = new NotificationCompat.Builder(mContext, "default");
mBuilder.setSmallIcon(R.mipmap.ic_launcher);
mBuilder.setContentTitle(title)
.setContentText(message)
.setAutoCancel(false)
.setSound(Settings.System.DEFAULT_NOTIFICATION_URI)
.setContentIntent(resultPendingIntent);
mNotificationManager = (NotificationManager)
mContext.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(NOTIFICATION_ID /* Request Code */, mBuilder.build());
}
//Originalmente no se encuentra esta función.
public void cancelNotification()
{
mNotificationManager.cancel(NOTIFICATION_ID);
}
}
16