Android Service vs Intentservice用于连接多个蓝牙设备

时间:2015-01-12 16:56:16

标签: android service bluetooth

我的应用程序连接到多个SPP蓝牙设备,所有这些设备都会流式传输数据。流有四个设备,一个是250赫兹,其余是100赫兹。我想将它们放在Service中,但也希望每个设备都在单独的Thread中运行。每个Thread还必须连接到SQLite数据库以实时插入数据。这些设备可以长时间连接,可以随时断开连接并随时重新连接。一旦启动,该应用程序可以运行24小时或更长时间,并始终寻找已配对设备的可用性。

问题是:在单独的Service运行多个Thread s(每个连接设备为Thread)中执行此操作是否更好?或者更好地运行一个单独的IntentService(当然会在自己的工作人员Thread中运行?

我已经在SO和其他地方阅读了许多其他问题和答案,并且可以看到每种方法的优点和缺点,但我找不到专门回答我的问题的答案。我不确定在Thread中运行多个Service是否仍然无法阻止主Thread。另一方面,我认为我不能同时在Thread中运行多个IntentService

1 个答案:

答案 0 :(得分:1)

在您预期的情况下,IntentService并不是一个坏主意,但不是您提出的方式。基于documentation

  

IntentService是处理异步的Services的基类   请求(表示为Intents)。客户端发送请求   通过startService(Intent)调用;该服务根据需要启动,   使用工作线程依次处理每个Intent,并自行停止   当它用完了。

     

这个"工作队列处理器"模式通常用于卸载任务   来自应用程序的主要线程。 IntentService类存在于   简化这种模式并处理机制。要使用它,   扩展IntentService并实现onHandleIntent(Intent)。   IntentService将接收Intents,启动一个工作线程,并且   酌情停止服务。

     

所有请求都在一个工作线程上处理 - 它们可以作为   只要有必要(并且不会阻止应用程序的主循环),   但一次只能处理一个请求。

因此,为每个蓝牙设备启动IntentService将意味着一个或另一个将被阻止。每当我与多个套接字(设备)通信时,我都会为每个套接字分配一个线程......然后,该线程负责根据需要连接,通信和重新连接到套接字。此模式与任何服务器程序中使用的模式相同:每个连接都有一个ClientThread,它由连接侦听器生成。

但是,IntentService也是一个好地方:将数据传递给您的sqlite数据库非常棒。将数据放入intent中,将其发送到IntentService,它将在需要时打开数据库(甚至可能启动事务),然后发布所有数据,当它失去工作时,提交事务并关闭数据库。 API提供了很多必要的管道。