Как я могу отправлять случайные уведомления через Workmanager периодически - PullRequest
2 голосов
/ 01 мая 2020

Я могу отправлять уведомления каждые 15 минут, но не могу изменить содержание уведомления. У меня есть строковый массив и рабочий менеджер отправляет всегда один и тот же элемент. Например, сначала он принимает значение «четыре» и отправляет всегда «четыре»

1 - я определил строковый массив в строках. xml

<string-array name="numbers">
    <item>one</item>
    <item>two</item>
    <item>three</item>
    <item>four</item>
    <item>five</item>
</string-array>

2 - My MainActivity Класс

public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
public static final String KEY_TASK_DESC = "key_task_desc";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    String[] list = getResources().getStringArray(R.array.numbers);

    Random random = new Random();
    int number = random.nextInt(list.length);

    Data data = new Data.Builder()
            .putString(KEY_TASK_DESC, list[number]).build();

    PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest
            .Builder(MyWorker.class, 15, TimeUnit.MINUTE)
            .setInputData(data)
            .build();

    WorkManager.getInstance().enqueue(periodicWorkRequest);

}}

3 - MyWorker Class, содержащий метод displayNotif (String inputData)

public class MyWorker extends Worker {

public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
    super(context, workerParams);
}

@NonNull
@Override
public Result doWork() {

    String inputData = getInputData().getString(MainActivity.KEY_TASK_DESC);
    displayNotif(inputData);

    return Result.success();
}

private void displayNotif(String inputData) {
    NotificationManager manager =
            (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

        NotificationChannel channel = new NotificationChannel("notif",
                "notif", NotificationManager.IMPORTANCE_DEFAULT);
        manager.createNotificationChannel(channel);
    }

    NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), "notif")
            .setContentText(inputData)
            .setSmallIcon(R.mipmap.ic_launcher);

    manager.notify(1, builder.build());
}}

1 Ответ

1 голос
/ 01 мая 2020

Я думаю, вы, возможно, неправильно понимаете настройку PeriodicWorkRequest.

Вы звоните setInputData только один раз, с одним data (вашей строкой). Каждый раз, когда он запускается, он все еще имеет только data.

. Чтобы случайным образом отобразить строку, ваш случайный выбор должен происходить внутри doWork.

вашего работника.
...