目标是在活动被破坏后更新远程数据库中的状态。困难在于,如果系统终止进程,则可以跳过活动的 onDestroy() 方法调用。onStop() 和 onPause() 方法没有意义,因为它们不能确保活动结束。其他活动中的 ActivityResult 也不起作用,因为该应用程序可能会被杀死。Service 可能是解决方案,但我担心它会与活动一起被杀死(例如,如果应用程序被强制停止,则不会调用 Service 中的 onTaskRemoved())。什么可以解决问题?
1 回答
到目前为止,我想出的最佳解决方案是将 Firebase Cloud Functions 与 Google Cloud Functions 结合使用。
短篇长篇
由于要求是保证方法运行不早于活动的onDestroy()
回调,一个有吸引力的解决方案是 Android Jetpack 的WorkManager用于
WorkManager 是一个 API,它可以轻松安排可靠的异步任务,即使应用程序退出或设备重新启动,这些任务也会运行。
但是,让我们想象一下手机已经爆炸了。然后任务将永远运行。没关系,如果它不是要更改远程数据库状态,尤其是当状态在多个用户之间共享时。
因此,使用远程数据库最安全的方法是将远程功能安排为备份解决方案,或者将您的程序逻辑建立在此基础上。远程功能很可能会用您的程序以外的其他语言编写,但没有什么好害怕的,也完全值得去做。
这篇文章帮助了我如何安排未来使用 Cloud Tasks 运行的 Cloud Functions(以构建 Firestore 文档 TTL)。如果远程数据库是 Firebase(Firestore 或 Realtime),则可以编写 Cloud Functions,这将在数据库更改时触发并安排 Google Cloud Tasks。后者可以运行 HTTP 触发的 Firebase Cloud Function 并执行任何需要的操作,例如更新数据库值,或检查某些条件并重新安排 Google Cloud Task。因此,即使手机发生故障,也会执行计划任务(同样,如果服务器不会发生故障......)。这些函数可以用 JavaScript 或 TypeScript 编写,非常容易掌握。