Android:Kotlin:在应用程序关闭时运行任务

问题描述 投票:0回答:1

当用户在我的应用程序中移动时,我会在列表中收集关键事件。当用户退出应用程序时,我想:

  1. 将该列表写入文件;和
  2. 将该文件上传到云端以便在后端进行分析

我将所有内容都放在一个函数中并进行了单元测试,只要应用程序仍然处于活动状态,它就可以正常工作。但是:

  1. 从 MainActivity onStop() 调用函数不会将文件上传到云端(它已成功写入设备)
  2. 同上 onPause()
  3. 我尝试向函数发送一个 completableDeferred 并等待它,但这也没有帮助(我使用了由 MainActivity 启动的协程作用域)。

我之前就听说过“尽管不得扰乱生命周期事件”的法令,所以我想这是一个确认......

您建议我如何完成此操作(当用户退出应用程序时将文件上传到云端)?它不需要立即发生,它只需要最终发生。

谢谢!

android kotlin android-lifecycle
1个回答
0
投票

也许尝试使用 WorkManager。它可以在后台工作

class FileUploadWorker(context: Context, params: WorkerParameters) : Worker(context, params) {

    override fun doWork(): Result {
        val filePath = inputData.getString("filePath") ?: return Result.failure()

        return try {
            val file = File(filePath)
            if (file.exists()) {
                uploadToCloud(file)
                Result.success()
            } else {
                Result.failure()
            }
        } catch (e: Exception) {
            e.printStackTrace()
            Result.retry()
        }
    }

    private fun uploadToCloud(file: File) {
        // ...
    }
}

并从 Activity 启动它

onStop

override fun onStop() {
    super.onStop()

    val filePath = saveEventsToFile()

    val data = Data.Builder()
        .putString("filePath", filePath)
        .build()

    val uploadWorkRequest = OneTimeWorkRequestBuilder<FileUploadWorker>()
        .setInputData(data)
        .build()

    WorkManager.getInstance(applicationContext).enqueue(uploadWorkRequest)
}

private fun saveEventsToFile(): String {
    val filePath = "${filesDir.path}/events.json"
    return filePath
}
© www.soinside.com 2019 - 2024. All rights reserved.