Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Workmanager doesn't work in standby and doze mode

I'm using WorkManager that schedule my notifications, it works when my smartphone is active, but it doesn't work when my smartphone is in standby. Why? There is some constraint that let me that? Or whatever?

Method notifyPush in CoreActivity.java

public static void notifyPush(String message, Context context)
    {

        //codice di un altro programma

        // Make a channel if necessary
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            // Create the NotificationChannel, but only on API 26+ because
            // the NotificationChannel class is new and not in the support library
            CharSequence name = Constants.VERBOSE_NOTIFICATION_CHANNEL_NAME;
            String description = Constants.VERBOSE_NOTIFICATION_CHANNEL_DESCRIPTION;
            int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
            channel.setDescription(description);

            // Add the channel
            NotificationManager notificationManager =
                    (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

            if (notificationManager != null) {
                notificationManager.createNotificationChannel(channel);
            }
        }

        // Create the notification
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID)
                .setSmallIcon(R.drawable.ic_launcher_foreground)
                .setContentTitle(Constants.NOTIFICATION_TITLE)
                .setContentText(message)
                .setPriority(NotificationCompat.PRIORITY_HIGH)
                .setDefaults(DEFAULT_ALL);
                //.setVibrate(new long[0]);

        // Show the notification
        NotificationManagerCompat.from(context).notify(Constants.NOTIFICATION_ID, builder.build());
    }

NotifyWorker.java

package com.example.msnma.movienotifier.notify;


import android.content.Context;
import android.support.annotation.NonNull;
import android.util.Log;

import com.example.msnma.movienotifier.CoreActivity;

import androidx.work.Data;
import androidx.work.Worker;

import static com.example.msnma.movienotifier.CoreActivity.notifyPush;
import static com.example.msnma.movienotifier.notify.Constants.KEY_MOVIE;

public class NotifyWorker extends Worker {

    //private static final String TAG = BlurWorker.class.getSimpleName();

    @NonNull
    @Override
    public Worker.Result doWork() {

        Context applicationContext = getApplicationContext();

        String message = getInputData().getString(Constants.KEY_MOVIE);

        //setOutputData(new Data.Builder().putString(
                //KEY_MOVIE, message.toString()).build());

        try {



            notifyPush(message , applicationContext);
            return Worker.Result.SUCCESS;
        } catch (Throwable throwable) {

            // Technically WorkManager will return WorkerResult.FAILURE
            // but it's best to be explicit about it.
            // Thus if there were errors, we're return FAILURE
            Log.e("NotifyWorker", "Error notification", throwable);
            return Worker.Result.FAILURE;
        }
    }
}

Methods scheduleNotify and deleteNotify in MovieAdapter.java

private UUID scheduleNotify(Date d, int position)
    {
        long currentTime= System.currentTimeMillis();
        //Calendar c = new Date;
        long specificTimeToTrigger = d.getTime();
                //d.getTimeToMillis();
        long delayToPass = specificTimeToTrigger - currentTime;

        /*OneTimeWorkRequest compressionWork =
                new OneTimeWorkRequest.Builder(NotifyWorker.class)
                        .setInputData(message)
                        .setInitialDelay(delayToPass, TimeUnit.MILLISECONDS)
                        .build();*/

        //inizialmente è molto semplice la notifica
        OneTimeWorkRequest notifyRequest =
                new OneTimeWorkRequest.Builder(NotifyWorker.class)
                        .setInputData(createInputDataForUri(movies.get(position)))
                        .setInitialDelay(delayToPass,TimeUnit.MILLISECONDS)
                        .build();
        mWorkManager.enqueue(notifyRequest);
        UUID notify_ID = notifyRequest.getId();

        //WorkManager.getInstance().enqueue(compressionWork);

        return notify_ID;

    }

    public void deleteNotify(UUID notify_ID)
    {
        WorkManager.getInstance().cancelWorkById(notify_ID);
    }
like image 763
user47845 Avatar asked Nov 08 '22 02:11

user47845


1 Answers

WorkManager uses JobScheduler and that will batch jobs during maintenance windows to optimize battery usage.

Also, here is the constraint you are looking for.

like image 146
Rahul Avatar answered Nov 14 '22 22:11

Rahul