【问题标题】:How do I pass data from Service to Activity in Kotlin?如何在 Kotlin 中将数据从 Service 传递到 Activity?
【发布时间】:2021-08-17 03:35:28
【问题描述】:

CS 学生的初学者警告

我有一个名为 RestApiService 的服务和一个名为 MainActivity 的活动。

我有一个存储在 RestApiService 中的令牌。

链接中是 imgur 中 RestApiService 的截图 https://imgur.com/a/Msu04xj

我只能找到 Java 教程,我不会翻译。

如何将它从那里获取到 MainActivity? TIA

【问题讨论】:

    标签: android kotlin android-activity android-service


    【解决方案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 已弃用。有没有其他办法?
      猜你喜欢
      • 1970-01-01
      • 2011-03-18
      • 2019-05-26
      • 2012-04-14
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      相关资源
      最近更新 更多