Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android “我需要做什么才能完成?”;在下月初触发一次作业/警报,以调用API;在科特林?_Android_Kotlin_Scheduler_Jobs_Android Alarms - Fatal编程技术网

Android “我需要做什么才能完成?”;在下月初触发一次作业/警报,以调用API;在科特林?

Android “我需要做什么才能完成?”;在下月初触发一次作业/警报,以调用API;在科特林?,android,kotlin,scheduler,jobs,android-alarms,Android,Kotlin,Scheduler,Jobs,Android Alarms,我是Kotlin和Android的新手,当我试图研究Kotlin/Android中的作业调度程序时,我被很多方法弄得不知所措,但所有方法似乎都很复杂 我正在开发一个简单的应用程序,记录客户的反馈,大部分是离线的。但它有一个在线功能,就是在每个月初通过API将报告发送到一些电子邮件地址 我需要最简单的方法来实现这一点,即: 可以执行应用程序是否处于活动状态或已销毁状态——作为一项服务 不必精确(不精确的时间是可以的) 我只需要启动一次,因为当用户与应用程序交互时,应用程序将设置为下一次启动。不需

我是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
}

如果你不必在准确的时间启动应用程序,最好的方法就是使用

你称之为:

val uploadWorkRequest = OneTimeWorkRequestBuilder<YourWorker>()
        .build()
WorkManager.getInstance().enqueue(uploadWorkRequest)
val uploadWorkRequest=OneTimeWorkRequestBuilder()
.build()
WorkManager.getInstance().enqueue(上传工作请求)
您可以通过以下方式设置延迟链接:


.setInitialDelay(持续时间,时间单位)

如果您不必在准确的时间启动应用程序,最好的方法是使用

你称之为:

val uploadWorkRequest = OneTimeWorkRequestBuilder<YourWorker>()
        .build()
WorkManager.getInstance().enqueue(uploadWorkRequest)
val uploadWorkRequest=OneTimeWorkRequestBuilder()
.build()
WorkManager.getInstance().enqueue(上传工作请求)
您可以通过以下方式设置延迟链接:


.setInitialDelay(持续时间,时间单位)

哦,很有趣。以前从未听说过WorkManager。我正在读这篇文章,会让你知道的!哦,很有趣。以前从未听说过WorkManager。我正在读这篇文章,会让你知道的!不用担心数据库。如果您的警报触发且其代码正在运行,则表示您的应用程序正在运行(尽管不在前台且UI可见),您可以访问数据库。您不需要替换警报,因为当警报触发时,您从数据库获得的数据就是实际的当前数据。接下来,你可能真的应该使用WorkManager来完成这项工作,只需要计算工作延迟多长时间(距离下一笔钱开始还有多长时间)@TimCastelijns哦,好吧,谢谢你的确认!旁注,无需使用
此。
除非您必须区分具有相同属性的变量name@TimCastelijns是的,我明白。我只想给出一个上下文,它们是类中的自定义方法,在给出解决方案时,您可以放弃实现(只是认为它已经存在了)。不用担心数据库。如果您的警报触发且其代码正在运行,则表示您的应用程序正在运行(尽管不在前台且UI可见),您可以访问数据库。您不需要替换警报,因为当警报触发时,您从数据库获得的数据就是实际的当前数据。接下来,你可能真的应该使用WorkManager来完成这项工作,只需要计算工作延迟多长时间(距离下一笔钱开始还有多长时间)@TimCastelijns哦,好吧,谢谢你的确认!旁注,无需使用
此。
除非您必须区分具有相同属性的变量name@TimCastelijns是的,我明白。我只想给出一个上下文,它们是类中的自定义方法,在给出解决方案时,您可以放弃实现(只要认为它已经存在)。