Не работает / не планирует задание с помощью WorkManager, когда приложение закрыто

Поскольку мы используем диспетчер заданий 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]
}

}


person Babar Hussain    schedule 08.04.2019    source источник


Ответы (2)


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

person SumirKodes    schedule 09.04.2019
comment
Спасибо за ответ, я удалил код, я просто спрашиваю, как выполнить этот код, когда приложение не запущено, это пример кода. - person Babar Hussain; 09.04.2019
comment
Полный пример: когда я получаю уведомление от firebase, как я могу запустить этого рабочего, не открывая приложение? ты понял? - person Babar Hussain; 09.04.2019

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

person Babar Hussain    schedule 11.04.2019