如何在 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 中的字符串?

在 Android 中将 MySql 查询转换为 SQL Room 查询 - kotlin

如何在处理程序中将 java 转换为 kotlin