Что мне нужно сделать, чтобы выполнить «запускать работу / сигнализацию один раз в начале следующего месяца для вызова API» в Котлине? - PullRequest
1 голос
/ 29 мая 2019

Я новичок в Kotlin и Android, и, поскольку я пытаюсь исследовать планировщик заданий в Kotlin / Android, меня переполняет множество способов, но все кажется сложным по-своему.

Я разрабатываю простое приложение, которое записывает отзывы клиентов, в основном это офлайн.Но у него есть одна онлайн-функция, которая заключается в отправке отчета на некоторые адреса электронной почты с помощью API в начале каждого месяца.

Мне нужен самый простой способ реализовать это, который:

  • Может ли приложение быть активным или уничтожено - как служба?
  • Не обязательно быть точным (неточное время в порядке).
  • Мне просто нужно запустить один раз, потому что приложение установит следующий огонь, когда пользователь будет взаимодействовать с приложением.Повторять не нужно.
  • Запустите его в начале следующего месяца.
  • Я могу заменить существующее задание новым, если предыдущее задание еще не было выполнено, нопользователь уже выполняет другое взаимодействие с приложением, так как в отчете подводятся итоги за весь месяц активности.Я прочитал, что сигнал тревоги / задание с «тем же намерением» может заменить друг друга, хотя я не уверен, как это выглядит на самом деле при реализации.
  • Поскольку данные находятся в базе данных, и я думаю, что, вероятно, могуНе обращайтесь к базе данных, когда приложение неактивно, я думаю, что я могу поместить данные для отправки в общие настройки пользователя каждый раз, когда я устанавливаю задание / будильник.Я где-то читал, что фоновая служба может читать из общих настроек.
  • Необходимо выполнить сетевой вызов.

Так что, если, например, необходимые данные для отправки уже находятся в общей папкепредпочтения, какой самый простой / самый простой способ сделать это?

fun userDoInteractionWithApp (data: Data) {
    this.process (data)
    val report = this.generateThisMonthReport()
    this.scheduleNextReport(report, Date())
}

fun scheduleNextReport(report: String, curDate: Date) {
    this.saveToSharedPreferences ("report", report)
    val c = Calendar.getInstance()
    c.time = curDate
    c.add(Calendar.MONTH, 1)
    c.set(Calendar.DAY_OF_MONTH, 1)
    c.set(Calendar.HOUR_OF_DAY, 10)
    val targetDate = c.time

    // and then?
}

fun sendReport() { // I want to fire this function, for example
    val report = this.loadFromSharedPreferences ("report") as String
    Network.sendReport(senderEmail, destinationEmail, "This is the report", report) // will run synchronously
}

1 Ответ

0 голосов
/ 29 мая 2019

Если вам не нужно запускать приложение в точное время, лучший способ сделать это с помощью

WorkManager

Вы называете это:

val uploadWorkRequest = OneTimeWorkRequestBuilder<YourWorker>()
        .build()
WorkManager.getInstance().enqueue(uploadWorkRequest)

Вы можете установить задержку, связывающую это:

.setInitialDelay (duration, TimeUnit)

...