Не работает / не планирует работу с помощью WorkManager, когда приложение закрыто - PullRequest
0 голосов
/ 08 апреля 2019

Поскольку мы используем диспетчер заданий firebase для запуска задания при получении уведомления firebase, другого способа запуска кода на полученном извещении, которое было старым, не было, теперь WorkManager здесь. Он работает нормально, когда приложение открыто, но когда приложение закрыто, оно не работает, но диспетчер заданий firebase работает нормально, я хочу, чтобы оно работало с использованием WorkManager API.

Я попытался следующим образом: это 100% работающий код, выполняющий работу с использованием WorkManager, но только когда приложение открыто, я хочу, чтобы оно работало, когда приложение не открывается, я знаю, что мы регистрируем сервис для случай с диспетчером задания firebase в манифесте, но что делать для WorkManager -:)

Я пробовал способы, связанные с диспетчером работы, но они не работали, например, служба в манифесте и т. Д. *

открытый класс BackgroundWorker расширяет ListenableWorker {

private static final ListenableFuture listenableFuture = null ;

/**
 * @param appContext   The application {@link Context}
 * @param workerParams Parameters to setup the internal state of this worker
 */

public BackgroundWorker(@NonNull Context appContext, @NonNull WorkerParameters workerParams) {
    super(appContext, workerParams);
}

@NonNull
@Override
public ListenableFuture<ListenableWorker.Result> startWork() {
    // Do your work here.

    // Return a ListenableFuture<>
    return listenableFuture;
}

@Override
public void onStopped() {
    // Cleanup because you are being stopped.
}

public void toast(String msg, Context applicationContext)
{
    Toast.makeText(applicationContext,msg,Toast.LENGTH_LONG).show();
}

}

открытый класс MyFirebaseMessagingService расширяет FirebaseMessagingService {

private static final String TAG = "MyFirebaseMsgService";

/**
 * Called when message is received.
 *
 * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
 */
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    sendNotification(remoteMessage.getData().get("body"),remoteMessage.getData().get("title"));


    scheduleJob();
}
/**
 * Called if InstanceID token is updated. This may occur if the security of
 * the previous token had been compromised. Note that this is called when the InstanceID token
 * is initially generated so this is where you would retrieve the token.
 */

/**
 * Schedule a job using workmanager.
 */

private void scheduleJob() {
    String unique_id = getRandomString(6);
    Data inputData = new Data.Builder()
            .putString("bulksmswebapi", unique_id)
            .build();
    // [START dispatch_job]

    Constraints constraints = new Constraints.Builder()
            // The Worker needs Network connectivity
            .setRequiredNetworkType(NetworkType.CONNECTED)
            // Needs the device to be charging
           // .setRequiresCharging(true)
            .build();
    OneTimeWorkRequest workRequest =
            // Tell which work to execute
            new OneTimeWorkRequest.Builder(BackgroundWorker.class)
                    // Sets the input data for the ListenableWorker
                    .setInputData(inputData)
                    // If you want to delay the start of work by 60 seconds
                    .setInitialDelay(1, TimeUnit.SECONDS)
                    // Set a backoff criteria to be used when retry-ing
                  //  .setBackoffCriteria(BackoffCriteria.EXPONENTIAL, 30000, TimeUnit.MILLISECONDS)
                    // Set additional constraints
                    .setConstraints(constraints)
                    .build();
    WorkManager.getInstance()
            // Use ExistingWorkPolicy.REPLACE to cancel and delete any existing pending
            // (uncompleted) work with the same unique name. Then, insert the newly-specified
            // work.
            .enqueueUniqueWork(unique_id, ExistingWorkPolicy.KEEP, workRequest);
    // [END dispatch_job]
}

}

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Проблема решена мной, Ответ на вопрос: просто создайте расширенный класс Worker и не используйте Toast или другие сообщения, тогда он будет работать нормально.

0 голосов
/ 09 апреля 2019

Ваш рабочий код ничего не делает.Вы возвращаете null ListenableFuture, то есть WorkManager ничего не может сделать.onStartWork также явно помечен как @NonNull, поэтому я не уверен, что вы там делаете.У вас есть метод, который никогда не выполняется (тост), потому что вы его нигде не вызываете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...