5

我正在使用 WorkManager 来安排我的通知,它在我的智能手机处于活动状态时工作,但在我的智能手机处于待机状态时它不起作用。为什么?有一些限制让我这样做?管他呢?

CoreActivity.java中的方法notifyPush

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;
        }
    }
}

MovieAdapter.java中的方法scheduleNotifydeleteNotify

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);
    }
4

2 回答 2

2

WorkManager使用JobScheduler,这将在维护窗口期间批处理作业以优化电池使用。

此外,是您正在寻找的约束。

于 2018-08-31T22:26:43.880 回答
0

自版本 1.0.0-alpha06 以来
,导致 PeriodicWork 在打盹模式下无法按计划运行的错误已修复。

https://issuetracker.google.com/issues/111469837

于 2019-06-26T07:41:37.760 回答