Я новичок в 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
}