如何在 Kotlin 中将数据从 Service 传递到 Activity?
Posted
技术标签:
【中文标题】如何在 Kotlin 中将数据从 Service 传递到 Activity?【英文标题】:How do I pass data from Service to Activity in Kotlin? 【发布时间】:2021-08-17 03:35:28 【问题描述】:CS 学生的初学者警告
我有一个名为 RestApiService 的服务和一个名为 MainActivity 的活动。
我有一个存储在 RestApiService 中的令牌。
链接中是 imgur 中 RestApiService 的截图 https://imgur.com/a/Msu04xj
我只能找到 Java 教程,我不会翻译。
如何将它从那里获取到 MainActivity? TIA
【问题讨论】:
【参考方案1】:一种方法是使用一些数据库,将其存储在那里,然后您可以在 MainAcitivty 级别观察数据库,以便在其可用时获取该值。
另一种方法是使用共享首选项 liveData,您将再次在 MainActivity 上观察到,但我想这有点棘手
我会创建一个实体,您将使用 Room 将其保存在数据库中,然后使用 ViewModel 组件将 liveData 公开给 MainActivity
【讨论】:
这些方法真的很复杂。尤其是涉及数据库,但即使是实时数据也是大材小用。【参考方案2】:最简单的方法——绑定到服务,并为服务定义一个Binder,并带有一个获取值的函数。然后你可以调用该函数来获取令牌。 Binder 作为 bindService() 的返回返回给 Activity。
这是 Google 在 kotlin 中这样做的示例:https://developer.android.com/guide/components/bound-services#kotlin
【讨论】:
我们最终设法使用 SharedPreferences 来完成它,尽管可能不推荐用于生产【参考方案3】:BroadCastReceiver 将帮助您,在您的服务中发送广播意图,并在您的活动中接收您的数据。
【讨论】:
【参考方案4】:您可以使用Local BroadcastReceiver
将数据从服务发送到活动
请在您获得令牌的 RestApiService
类中尝试此代码:
val intent = Intent("RestApiData")
intent.putExtra("token", myToken)
LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
在上面的代码中,"RestApiData"
是广播接收器的主键,您需要在活动中获取数据,"token"
是 myToken 值的键
在您的MainActivity
类中,在onCreate
方法中使用以下代码:
LocalBroadcastManager.getInstance(this).registerReceiver(tokenPassingReceiver, IntentFilter("RestApiData"))
现在在活动的 onCreate 方法之外使用以下代码:
private val tokenPassingReceiver: BroadcastReceiver = object : BroadcastReceiver()
override fun onReceive(context: Context, intent: Intent)
val bundle = intent.extras
if (bundle != null)
if (bundle.containsKey("token"))
val tokenData = bundle.getString("token")
Log.e("MainActivity--","token--$tokenData")
欲了解更多信息,请查看此链接:Kotlin Android Broadcast Intents and Broadcast Receivers
希望对你有帮助。
【讨论】:
LocalBroadcastManager 已弃用。有没有其他办法?以上是关于如何在 Kotlin 中将数据从 Service 传递到 Activity?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Kotlin 中将数据类转换为 ByteBuffer?
如何在 Kotlin 中将 TypeToken + 泛型与 Gson 一起使用
在 android studio kotlin 中将数据从活动传递到片段(不重复,这些方法不起作用)
如何在我的 recyclerview 适配器中将 API 日期转换为 Kotlin 中的字符串?