es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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);
                   
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para migrar de IntentService a WorkManager, puedes seguir estos pasos:

    1. Importa la biblioteca WorkManager en tu proyecto.
    2. Crea una clase Worker que extienda androidx.work.Worker.


    public class LocationUpdateWorker extends Worker { private static final String TAG = "LocationUpdateWorker"; public LocationUpdateWorker( @NonNull Context context, @NonNull WorkerParameters params) { super(context, params); } @NonNull @Override public Result doWork() { Log.d(TAG, "doWork: se inició la actualización de ubicación"); // Aquí debes agregar tu código de actualización de ubicación return Result.success(); } }

    La clase Worker es responsable de ejecutar la tarea en segundo plano.

    1. Programa la tarea periódica utilizando WorkManager.

    PeriodicWorkRequest locationUpdateWork = new PeriodicWorkRequest.Builder(LocationUpdateWorker.class, 15, TimeUnit.MINUTES) .build(); WorkManager.getInstance(this).enqueue(locationUpdateWork);

    El código anterior programa un Worker para actualizar la ubicación cada 15 minutos.

    1. Elimina el código relacionado con IntentService y llama al método enqueue() para iniciar el Worker en tu código de ActivityRecognition.

    PeriodicWorkRequest locationUpdateWork = new PeriodicWorkRequest.Builder(LocationUpdateWorker.class, 15, TimeUnit.MINUTES) .build(); WorkManager.getInstance(this).enqueue(locationUpdateWork);

    Este código iniciará el Worker y ejecutará la tarea en segundo plano para actualizar la ubicación periódicamente.

    1. Agrega el permiso 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.

Comments are closed.