Как я могу получить доступ к объектам из моей Деятельности в Рабочем? (периодически менять уведомление) - PullRequest
2 голосов
/ 16 января 2020

Я хотел бы периодически изменять текст уведомления в Worker. (androidx.work.WorkManager)

Моя основная активность выглядит следующим образом

public class MainActivity extends AppCompatActivity {

    ...

    private NotificationManagerCompat notificationManagerCompat;
    private NotificationCompat.Builder notificationBuilder;

    ...

    private void startNotification() {

        ...

        notificationBuilder =
                    new NotificationCompat.Builder(getApplicationContext(), warnotifier_notification_channel)
                            .setSmallIcon(R.drawable.notification_icon)
                            .setContentTitle(notificationTitle)
                            .setContentText(notificationText)
                            .setContentIntent(pendingIntent)
                            .setAutoCancel(true)
                            .setPriority(NotificationCompat.PRIORITY_LOW)
                            .setOngoing(true);

        notificationManagerCompat = NotificationManagerCompat.from(getApplicationContext());

        notificationManagerCompat.notify(1, notificationBuilder.build());

        PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(NotificationWorker.class, PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, TimeUnit.MILLISECONDS)
                    .addTag(workTag)
                    .build();

        WorkManager.getInstance(getApplicationContext()).enqueue(periodicWorkRequest);
    }

   ...

}

, а мой рабочий выглядит так

public class NotificationWorker extends Worker {
    public NotificationWorker(@NonNull Context context, @NonNull WorkerParameters params) {
        super(context, params);
    }

    @NonNull
    @Override
    public Result doWork() {
        String notificationText = "Time: " + calendar.get(Calendar.HOUR_OF_DAY) + ":" + calendar.get(Calendar.MINUTE) + ":" + calendar.get(Calendar.SECOND);
        notificationBuilder.setContentText(notificationText);
        notificationManagerCompat.notify(1, notificationBuilder.build());
        return Result.success();
    }
}

К сожалению, Android не позволяет чтобы я поместил Worker как вложенный класс в свой MainActivity, и поэтому я не могу получить доступ к экземплярам NotificationManagerCompat и NotificationCompat.Builder, как указано выше.

Я знаю, что могу передать простые данные с periodicWorkRequest.setInputData(inputData) в Worker но я не думаю, что это помогает ...

Есть идеи? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 16 января 2020

К сожалению, Android не позволяет мне помещать Worker как вложенный класс в мою функцию MainActivity, и поэтому я не могу получить доступ к экземплярам NotificationManagerCompat и NotificationCompat.Builder, как указано выше.

Почему вам нужно добавить свой класс NotificationWorker в MainActivity?

. Как вы упомянули, вы просто хотите получить доступ к NotificationManagerCompat и NotificationCompat.Builder из класса Worker, и нет ограничение для этого, поэтому для создания вашего уведомления у вас уже есть контекст, переданный конструктору класса Worker, а также вы все равно можете вызвать getApplicationContext() из класса Worker. Я проверил это без проблем.

Надеюсь, это поможет. Я приветствую вас, если у вас есть какие-либо вопросы.

Обновление

В моем классе Worker я хотел получить доступ к созданным экземплярам notificationManagerCompat и notificationBuilder в MainActivity.

Вам не нужно создавать notificationManagerCompat & notificationBuilder экземпляров в MainActivity, вы обычно можете создавать их в NotificationWorker

Здесь это демо из вашего кода

public class NotificationWorker extends Worker {
    private final NotificationManagerCompat notificationManagerCompat;
    private final NotificationCompat.Builder notificationBuilder;

    public NotificationWorker(@NonNull Context context, @NonNull WorkerParameters params) {
        super(context, params);

        PendingIntent pendingIntent = PendingIntent.getActivity
                (context, 0, new Intent(context, MainActivity.class),
                        PendingIntent.FLAG_UPDATE_CURRENT);

                        notificationBuilder =
                new NotificationCompat.Builder(getApplicationContext(), warnotifier_notification_channel)
                        .setSmallIcon(R.drawable.notification_icon)
                        .setContentTitle(notificationTitle)
                        .setContentText(notificationText)
                        .setContentIntent(pendingIntent)
                        .setAutoCancel(true)
                        .setPriority(NotificationCompat.PRIORITY_LOW)
                        .setOngoing(true);

        notificationManagerCompat = NotificationManagerCompat.from(getApplicationContext());

    }

    @NonNull
    @Override
    public Result doWork() {
        Calendar calendar = new GregorianCalendar();
        String notificationText = "Time: " + calendar.get(Calendar.HOUR_OF_DAY) + ":" + calendar.get(Calendar.MINUTE) + ":" + calendar.get(Calendar.SECOND);
        notificationBuilder.setContentText(notificationText);
        notificationManagerCompat.notify(1, notificationBuilder.build());
        return Result.success();
    }
}

. Вы можете получить notificationTitle, notificationText из res / string с помощью R.string.XX и notification_icon из res / drawable с помощью R.drawable. XX.

С этим вы можете использовать NotificationManagerCompat и NotificationCompat.Builder от вашего работника, все, что вам нужно, только контекст, не нужно никаких действий.

надеюсь, что это ответ на ваш вопрос.

1 голос
/ 16 января 2020

Вы можете создать уведомление с тем же идентификатором ( Так что сохраняйте постоянный идентификатор для вашего уведомления ) и уведомляйте. Обновляет существующий автоматически

NotificationManager notificationManager = (NotificationManager) getSystemService(
            Context.NOTIFICATION_SERVICE);
    if (notificationManager != null) {
        Create a notification object with same ID as previous one and use notify to update the existing one.
    }
...