Android服务 - SocketIO - GCM - 与Activity通信

时间:2016-04-29 21:19:47

标签: java android multithreading socket.io google-cloud-messaging

希望这个问题不是太广泛或太多,不能要求......

我正在为我的办公室构建一个Android应用程序。该应用程序用于向使用该应用程序的所有用户(仅限我的办公室)发送消息警报(作为自定义“消息”对象类)。收到邮件后,收件人的所有名称都会在底部列出,并显示一个状态图标,显示他们对邮件的回复(基本上竖起或竖起)。

我有一个Node / Express服务器,用于跟踪,存储和分发消息并记录其历史记录。当用户发送警报消息时,它将转到将处理分发的节点服务器。

应用程序的要求

  1. 适用于紧急救援人员。应用程序必须始终能够收到警报。如果他们没有服务,那没关系,将发送短信作为备份。但是所有Android手机都必须始终收听我的节点服务器进行更新。
  2. 应用程序必须在启动时启动,或者至少是服务或其他东西来监听服务器。这是基于它必须始终监听服务器的最后一个要求。
  3. 收到消息后,用户将在特定活动中查看该消息。此活动列出了所有收件人及其状态(竖起或竖起)。此屏幕需要始终连接到websocket,并在其他用户提交状态时实时更新状态。
  4. 这是我的问题

    我推荐过几种方法,但我不知道使用哪种方法。

    1. 创建后台服务(服务或意图服务......没有线索?),它将在启动时启动并连接到节点服务器。

      这引出了一些问题:

      a。手机24/7上有这样的TCP套接字连接可以吗?

      b。它每天只会交换几次数据。打开连接会杀死电池吗?

      c。如果服务从服务器收到消息,我是否可以使用此“始终运行”服务启动我的应用程序活动?此外,我可以轻松地将消息从后台服务发送到应用程序吗? (我不太了解穿线......这对我来说很困难)。

    2. 使用GCM“触发”手机启动应用程序,启动应用程序后,使用主UI线程创建与服务器的连接并下拉已发送的消息。

      a。我从未使用GCM,只是昨天才了解它。这是用于它的那种东西吗?

      b。如果我使用GCM,我仍然需要创建一个始终在运行的后台服务吗?或者GCM是否有一些内置的方式可以随时监听?

    3. 我不完全理解如何使用线程,我的Java知识低于平均水平(我不会说初学者),这是我有史以来的第一个Android应用程序。该应用程序看起来很漂亮,真的很棒,但我只是不知道我应该如何处理始终连接的网络。

      这是一张有助于了解我需要的图画: Data flow required

      感谢您的回复,并花时间阅读这个庞然大物的问题。

1 个答案:

答案 0 :(得分:1)

  

一个。可以24/7在手机上安装这样的TCP套接字吗?   湾它只会每天交换几次数据。打开连接会杀死电池吗?

持久性服务器连接附带了一些挑战。你肯定需要每隔几分钟发送一次keep-alive数据包,否则懒惰的路由器会认为你的连接已经死了,并在你真正需要时丢弃数据包(问题是google themselves had)。是的,这肯定会drain the battery,因为它需要一直倾听。也就是说,如果您设法保持连接打开,因为Android具有省电功能,只能禁用后台应用程序的网络。

  

℃。我可以使用这个'始终运行'服务从服务器收到消息后启动我的应用程序活动?此外,我可以轻松地将消息从后台服务发送到应用程序吗? (我不太了解穿线......这对我来说很困难)。

是的,你可以。它start Activities from a service也相当容易,您可以像Intent中的消息一样传递数据。 Wrt Threads,后台服务实际上并没有在线程中运行,而是在主ui线程中运行。你可以在它们中启动线程。在网络连接的情况下,您甚至必须这样做,否则服务会阻止UI线程。该应用程序的活动也使用相同且唯一的ui线程。

  

一个。我从来没有使用GCM,只是昨天刚才了解到它。这是用于它的那种东西吗?

这正是它的目的。它也为您解决了上述所有挑战。

  

湾如果我使用GCM,我是否还需要创建一个始终运行的'无论如何开始启动的后台服务?或者GCM是否有一些内置的方式可以随时监听?

没有。您定义的<receiver> / BroadcastReceiver即使应用未运行也会被触发。系统的GCM服务(您需要安装的Google Play服务应用程序的一部分)会为您完成所有等待消息的操作。从那里你可以开始活动/服务或(可能是最好的事情)显示点击时打开应用程序的通知。从背景事件中打开活动是非常具有破坏性的。如果它不是太大,您甚至可以将消息本身放在GCM有效负载内,这样您就可以保存1个Web请求并加快初始显示。

GCM通常可以很快地传递信息,但正如您可以从中看到的那样。 http://support.whispersystems.org/hc/en-us/articles/213190487-Why-is-there-a-delay-in-receiving-messages-https://threema.ch/en/faq/push_andr有些情况会导致延误。除非你有非常特殊的要求并且你不关心电池,否则不要像1)那样实现自己的电池 - 使用GCM。

有没有办法知道手机是否收到GCM内置的GCM消息。所以你可以在超时后发送备份短信,当设备没有连接到你的服务器时)