Reconocimiento de actividad con WorkManager para tarea en segundo plano.
Estoy usando IntentService
para que ActivityRecognition
funcione en segundo plano y actualice la ubicación, pero desde Android 9+
, IntentService
se ha vuelto obsoleto y ya no funciona en las versiones recientes de Android. Intenté usar WorkManager
, pero estoy un poco confundido acerca de cómo puedo migrar de IntentService
a WorkManager
porque WorkManager
no tiene ningún método de retorno como el servicio.
Código de inicio de IntentService
(ActivityRecognition)
Intent ActivityRec_intent = new Intent(this, Activity_Recognized_Service.class);
PendingIntent pendingIntent = PendingIntent.getService(this, 0, ActivityRec_intent, PendingIntent.FLAG_UPDATE_CURRENT);
activityRecognitionClient.requestActivityUpdates(timeInLong,pendingIntent);
IntentService
public class Activity_Recognized_Service extends IntentService {
/**
* Creates an IntentService. Invoked by your subcl ass's constructor.
*
* @param name Used to name the worker thread, important only for debugging.
*/
public static final String TAG = "###RECOGNISED SRVCE###";
Timer timer;
LocationRequest mLocationRequest;
static int detectedActivity;
public Activity_Recognized_Service() {
super("Activity_Recognized_Service");
}
public Activity_Recognized_Service(String name) {
super(name);
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
Log.d(TAG, "On Handle Intent");
if (ActivityRecognitionResult.hasResult(intent)) {
Log.d(TAG, "ActivityRecognition Has Result");
ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);
Log.d(TAG,"BackGround Service Starting");
handleDetectedActivities(result.getProbableActivities(),this);
}
}
private void handleDetectedActivities(List<DetectedActivity> probableActivities, Context mContext) {
Intent notificationIntent=new Intent("Notification");
for (DetectedActivity activity : probableActivities) {
switch (activity.getType()) {
case DetectedActivity.IN_VEHICLE:
Log.d(TAG, "En vehículo " + activity.getConfidence());
Log.d(TAG, "En vehículo " + detectedActivity);
Log.d(TAG,"Valor de solicitud de ubicación "+mLocationRequest);
davy.ai
Para migrar de
IntentService
aWorkManager
, puedes seguir estos pasos:WorkManager
en tu proyecto.Crea una clase
Worker
que extiendaandroidx.work.Worker
.La clase
Worker
es responsable de ejecutar la tarea en segundo plano.WorkManager
.El código anterior programa un
Worker
para actualizar la ubicación cada 15 minutos.IntentService
y llama al métodoenqueue()
para iniciar elWorker
en tu código deActivityRecognition
.Este código iniciará el
Worker
y ejecutará la tarea en segundo plano para actualizar la ubicación periódicamente.android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
al archivo AndroidManifest.xml.Este permiso es necesario para eximir a la aplicación de las optimizaciones de batería en Android 9+. De lo contrario, el sistema operativo puede evitar que la aplicación se ejecute en segundo plano.
Ten en cuenta que
WorkManager
ejecuta tareas en segundo plano cuando el dispositivo está inactivo, y puede agrupar o retrasar la ejecución de la tarea para minimizar el consumo de batería y datos.Además, asegúrate de probar tu aplicación en varios dispositivos y versiones de Android para asegurarte de que la tarea en segundo plano funcione como se espera.