Как получать ежедневные уведомления в определенное время в Android с помощью WorkManager и OneTimeWorkRequest? - PullRequest
0 голосов
/ 15 октября 2019

Моя цель

Получать одно уведомление каждые 8 ​​часов утра, когда мой переключатель активирован

Текущий результат

-Я получаю уведомление каждый раз, когда я запускаю приложение, если я впервые активировал переключатель

-Я также получаю уведомления без запуска приложения в любое время

-Кроме того, я получаю несколько уведомлений в одномдень

что я сделал (мой код)

-NotificationActivity (часть onCreate)

 private void onClickSwitch() {
        aSwitch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                retrieveKeyWord();
                retrieveCategories();

                keywordPref = mPreferences.getString(PREF_KEYWORD, null);
                categoriesPref = mPreferences.getString(PREF_CATEGORIES, null);

                mPreferences.edit().putString(PREF_KEYWORD, keyword).apply();
                mPreferences.edit().putString(PREF_CATEGORIES, categories).apply();

                Calendar currentDate = Calendar.getInstance();
                Calendar dueDate = Calendar.getInstance();

                dueDate.set(Calendar.HOUR_OF_DAY, 8);
                dueDate.set(Calendar.MINUTE, 0);
                dueDate.set(Calendar.SECOND, 0);

                if(dueDate.before(currentDate)) {
                    dueDate.add(Calendar.HOUR_OF_DAY, 24);
                }

                long timeDiff =  dueDate.getTimeInMillis() - currentDate.getTimeInMillis();


                Constraints constraints = new Constraints.Builder()
                        .setRequiredNetworkType(NetworkType.CONNECTED)
                        .build();

                OneTimeWorkRequest oneTimeWorkRequest = new OneTimeWorkRequest.Builder(NotificationWorker.class).setInitialDelay(timeDiff, TimeUnit.MILLISECONDS)
                        .setConstraints(constraints)
                        .addTag("TAG_OUTPUT").build();


                WorkManager.getInstance().enqueue(oneTimeWorkRequest);

            }
        });
    }

-NotificationActivity -> Layout

layout

-NotificationWorker

public class NotificationWorker extends Worker {

    private SharedPreferences mPreference;
    private String keyword;
    private String categories;
    private ResultModel resultModel;
    private ResultContract.Model.OnFinishedListener onFinishedListener;
    private int numberOfArticle;


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

    @NonNull
    @Override
    public Result doWork() {

        mPreference = getApplicationContext().getSharedPreferences(NotificationActivity.PREFERENCE_FILE, MODE_PRIVATE);

        keyword = mPreference.getString(NotificationActivity.PREF_KEYWORD, null);
        categories = mPreference.getString(NotificationActivity.PREF_CATEGORIES, null);


        resultModel = new ResultModel();

        numberOfArticle = resultModel.getResultListWithoutDate(onFinishedListener, 1, keyword, categories);

        displayNotification(keyword);

        return Result.success();
    }


    private void displayNotification(String keyword) {

     NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(NOTIFICATION_SERVICE);

     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
         NotificationChannel channel = new NotificationChannel("simplifiedcoding", "simplifiedcoding", NotificationManager.IMPORTANCE_DEFAULT);
         assert notificationManager != null;
         notificationManager.createNotificationChannel(channel);
     }

     NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), "simplifiedcoding")
             .setContentTitle("Articles sur : " + keyword)
             .setContentText("Nombre d'articles trouvés : " + numberOfArticle)
             .setPriority(NotificationCompat.PRIORITY_DEFAULT)
             .setSmallIcon(R.drawable.ic_launcher_background);

        assert notificationManager != null;
        notificationManager.notify(1, builder.build());

    }
}

Скажите, если вам нужна дополнительная информация, спасибо, кто мне поможет

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Поскольку ваша цель - получать уведомления каждый день в 8 часов утра, я бы рекомендовал вам использовать PeriodicWorkRequest вместо использования OneTimeWorkRequest .

PeriodicWorkRequest (Из документации):

Рабочий запрос на повторение работы. Эта работа выполняется несколько раз, пока она не будет отменена, при этом первое выполнение происходит немедленно или сразу после выполнения указанных ограничений. Следующее выполнение будет происходить в течение интервала периода;обратите внимание, что выполнение может быть отложено, потому что WorkManager подвергается оптимизации батареи ОС, например, режиму ожидания.

OneTimeWorkRequest (из документации):

WorkRequest для неповторяющейся работы.

0 голосов
/ 15 октября 2019

Вы можете решить эту проблему тремя способами.

Первый:

Диспетчер пользовательских тревог и поместить его в IF, если проверка активности активна, так что она будет работать, если ваше приложение открыто. Вы можетеполучить дополнительную информацию по ссылке Google Docs ниже:

AlarmManager Docs

Секунда:

Вы можете использовать таймер с задачей для создания уведомления, выМожно проверить, активна ли активность снова, но лучше использовать ее для создания службы Timer на Foreground.

В-третьих:

Использовать PushNotification с сервера, когда вам это даже нужно. Документы и информацию, если ссылка ниже:

Push-уведомление - один сигнал

Примечание:

Я рекомендую использовать третий способ решения вашей проблемы.

Имейте хорошее кодирование и не забудьте проголосовать за меня;)

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