【问题标题】:When to disconnect MQTT service on an Android app which doesn't required MQTT on background何时在不需要后台 MQTT 的 Android 应用程序上断开 MQTT 服务
【发布时间】:2018-02-21 08:14:28
【问题描述】:

我在当前的 Android 项目中使用 Paho-Mqtt 客户端从服务器获取实时提要。根据我的要求,我只需要 MQTT 服务,而应用程序在前台。并且应用程序的每个屏幕都链接到不同的 mqtt-topics。示例:

If user in Activity A, I need to subscribe to a MQTT topic A.  
If your move to Activity B I need to unsubscribe from topic A and subscribe to topic B.

现在的问题是,我应该什么时候连接到 MQTT 服务,什么时候应该断开连接?

  1. 我可以在 onResume() 函数中连接(和订阅)MQTT 服务 每个活动和 (unscubscribe &) 断开 onPause() 函数。

否则,

  1. 我可以在 Application 的 onCreate() 函数中连接到 MQTT 服务 因此,我可以在整个应用程序中保持客户端连接,并且 在个人活动期间进行订阅和取消订阅 onResume()/onPause() 函数。

这两种方式都很可怕,尤其是第二种方式,当应用不再在前台时,无法断开 MQTT 服务。因为没有直接的方法来处理 Android 应用程序正在后台运行或被终止的事件。

谁能给我建议以最好的方式处理这个问题?

【问题讨论】:

  • Firebase push notifications(不要指望你的后台服务能够保持连接 - 因为 Android Oreo)和 Websockets 而不是 MQTT(因为防火墙)是你需要的 ;-)
  • 我不想让我的连接永远在后台保持活跃,但需要在应用程序处于前台期间(在所有活动中)保持活跃。
  • 现代架构是一个单个活动和多个片段(或最近:多个视图)。
  • 问题是这些 MQTT 相关活动中的每一个都已经有自己的片段(标签样式/导航抽屉)。因此,这种方法对我来说不是最好的。
  • 没什么私人的,但我想知道为什么你的问题被赞成。您应该在separate clear questions 中拆分您尝试解决的问题,并提供您已经尝试过的代码。

标签: java android android-service mqtt paho


【解决方案1】:

为此找了两个人:

  1. 您可以在每个 Activity 中拥有一个 MQTTClient,并在您的 Activity 内部处理该客户端。
  2. 或者,这是一种对资源更友好的方法,您可以创建一个后台服务来放置 MQTTClient。

你仍然需要在 onResume() onPause() 中订阅和取消订阅。 就像您使用 BroadcastReceiver 或 Events 一样。

如果您想更好地控制生命周期的状态,请查看 Lifecycle.Events: Handling Lifecycles with Lifecycle-Aware Components

用它来执行sub或unsub。

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void connectListener() {
    ...
}

还可以查看RxJava,这也可能有助于您找到解决方案。

祝你好运。

【讨论】:

  • 根据您的第二种方法,我应该何时终止/停止处理我的 MQTT 连接的后台服务?
  • 如果这个 MQQT 服务被经常使用,那么你创建这个服务,使用它就可以了(没有启动停止的东西 - 它会在后台运行)。你可能想先看看这个:developer.android.com/training/run-background-service/…希望它有助于你决定创建一个服务——因为我不太清楚你的用例到底是什么。
猜你喜欢
  • 1970-01-01
  • 2019-04-22
  • 2022-01-19
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多