Создание нескольких разных уведомлений Work Manager Android

Я создал приложение, в котором пользователь создает свою коллекцию цветов и настраивает уведомление о поливе для каждого из них. Добавляя цветок в свою коллекцию название и информацию цветок берет из Firestore. Проблема в том, что при создании работы для Work Manager я передаю нужные данные, но как только закрываю приложение, он теряет все данные и выдает имя цветка null. Так же у меня вопрос как создать работы(уведомление) с разными ID для каждого цветка. Например: для Пиона 3 дня, для Гладиоулса 2, и чтобы я мог удалять работу по ID

Спасибо

private void addPreferPlant(){
    final Map<String, Object> myPlant = new HashMap<>();
    myPlant.put("name", namePlant);
    myPlant.put("image", imagePlant);
    myPlant.put("sun",plantSun);
    myPlant.put("moreWater",plantWater);
    myPlant.put("sunInfo",sunInfo);
    myPlant.put("waterInfo",waterInfo);
    myPlant.put("info",infoPlant);
    myPlant.put("terraInfo",terraInfo);
    myPlant.put("temp",plantTemp);
    //myPlant.put("idTimer", tagNotification);
    // Add a new document with a generated ID
    mFS.collection("users").document(userId).collection("MyFlowers")
            .add(myPlant)
            .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                @Override
                public void onSuccess(DocumentReference documentReference) {
                   myPlantID = documentReference.getId();
                    Log.d("id", myPlantID);
                    Toast.makeText(SetPlant.this,"OK",Toast.LENGTH_SHORT).show();
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(SetPlant.this,"Fail",Toast.LENGTH_SHORT).show();
                }
            });
    oneTimeRequest();
  //  WorkerUpload.periodRequest();
}
public static void oneTimeRequest(){

    Data data = new Data.Builder()
            .putString("EXTRA_TITLE", "Flovers")
            .putString("EXTRA_TEXT", namePlant)
            .build();

    OneTimeWorkRequest oneTimeWorkRequest = new OneTimeWorkRequest.Builder(WorkerUpload.class)
            .setInputData(data)
            .setInitialDelay(20, TimeUnit.SECONDS)
            .setConstraints(setCons())
            .addTag(namePlant)
            .build();

    WorkManager.getInstance().enqueue(oneTimeWorkRequest);
    Log.d("YEK", "Repeat");

}

public static Constraints setCons() {
    Constraints constraints = new Constraints.Builder().build();
    return constraints;
}

public class WorkerUpload extends Worker {
public WorkerUpload(@NonNull Context context, @NonNull WorkerParameters workerParams) {
    super(context, workerParams);
}
private static final String CHANNEL_ID = "SAMPLE_CHANNEL";
@NonNull
@Override
public Result doWork() {
    SetPlant.oneTimeRequest();
    String title = getInputData().getString("EXTRA_TITLE");
    String text = getInputData().getString("EXTRA_TEXT");
    showNotif(title,text);
    Log.d("YEK", "Repeat OK");
    return Result.success();
}

public void showNotif(String text, String message){
    Random rand = new Random();
    int notificationId =  rand.nextInt(20);
    //Call MainActivity when notification is tapped
    Intent mainIntent = new Intent(getApplicationContext(), MainActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(
            getApplicationContext(),0,mainIntent,PendingIntent.FLAG_UPDATE_CURRENT
    );
    //NotificationManager
    NotificationManager notificationManager =
            (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
        //For API 26 and above.
        CharSequence channel_name = "My Notification";
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, channel_name,importance);
        notificationManager.createNotificationChannel(channel);
    }
    // prepare notification
    NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), CHANNEL_ID)
            .setSmallIcon(R.drawable.plant_ic)
            .setContentTitle(text)
            .setContentText("Полей " + message)
            .setContentIntent(contentIntent)
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .setAutoCancel(true);
    notificationManager.notify(notificationId,builder.build());
}

}


Ответы (1 шт):

Автор решения: Vlad Orlinskas

К сожалению я не нашел проблем связаных с потерей данных в Worker. Убедитесь пожалуйста, что вы точно их передаете.

В остальном вы делаете все правильно, хоть и не понятно откуда oneTimeRequest() берет данные.

Так же, хотелось заметить, вы можете обработать результат работы в doWork(), уведомление может быть не доставлено и у вас есть возможность использовать Result.retry()

Отмену задачи удобно делать по тегу

OneTimeWorkRequest myWorkRequest = new OneTimeWorkRequest.Builder(MyWorker.class)
       .addTag("mytag")
       .build();

WorkManager.getInstance().cancelAllWorkByTag("mytag");
→ Ссылка