Android IntentService、Service或AsyncTask

Android IntentService、Service或AsyncTask,android,Android,实现这一点的最佳方式是什么。我有一个Android应用程序,它将使用我的python服务器来允许两部手机之间进行轮次通信。轮次意味着他们在轮次开始前不能互相交谈,一旦他们发送了一条信息,他们就不能再发送另一条信息,直到对方做出回应,然后开始新的轮次 我想我会使用IntentService,但让服务器不断地启动和停止似乎是错误的,我不必担心asynctask的问题,或者这是处理它的最佳方式。我怎样才能拥有一个应该接收并向客户端发送消息的服务,似乎服务是单向的呢?我强烈推荐IntentService

实现这一点的最佳方式是什么。我有一个Android应用程序,它将使用我的python服务器来允许两部手机之间进行轮次通信。轮次意味着他们在轮次开始前不能互相交谈,一旦他们发送了一条信息,他们就不能再发送另一条信息,直到对方做出回应,然后开始新的轮次


我想我会使用IntentService,但让服务器不断地启动和停止似乎是错误的,我不必担心asynctask的问题,或者这是处理它的最佳方式。我怎样才能拥有一个应该接收并向客户端发送消息的服务,似乎服务是单向的呢?

我强烈推荐IntentService/Broadcast接收器路由。避免与AsyncTask相关的讨厌的配置更改问题将使您的生活轻松十倍。

我会使用一个警报,该警报通过调度,然后可以设置为检查回合是否已开始/回合。它有服务的优点,但没有电池耗电的恐怖。警报运行频率需要一定的频率,甚至包括时间枚举(例如1小时/天/周)

当警报运行时,它可以轮询以查看当前状态,并做出相应的反应。例如,一个通知可能进入状态栏,手机可能发出声音和振动。这样做的好处是,用户不必让应用程序一直运行,因为警报会触发广播接收器


报警代码的一个示例:

意图服务只不过是由意图触发的工作线程,在单独的线程中执行其操作,然后关闭。它们设计用于启动和停止

如果您需要执行http get之类的操作,或者在任何情况下都不需要与服务器保持连接的交互,请使用intent services并使用广播事件通知您的活动

如果你的应用程序需要保持与服务器的连接(即永久tcp连接),我会选择使用一个服务(而不是一个目的服务),该服务使用异步任务或服务中托管的更经典的线程来执行联网工作。然后可以使用bindToService()使活动与服务交互


我建议不要在活动中使用异步任务。正如oneilse14在其回复中所述,如果水平/垂直视图发生变化,您将有可能失去服务器响应。

据我所知,您的问题属于工作队列模型(生产者-消费者模型)。IntentService就是要这样做的。当且仅当您需要执行多线程时,您应该使用服务。您确实可以使用IBinder接口与活动和服务进行通信


Asynctask只是一个专门的线程,因此您可以轻松地更新UI。但是对于您的案例来说,IntentService似乎是最好的选择。

我明白了,但是一个带有消息的标准线程不也能做到这一点吗?即使在配置更改之后,活动也会从后台线程接收消息,不是吗?线程将保留对原始上下文的引用。如果在配置更改后重新注册上下文/处理程序,您可以绕过此问题,但接收方路由更容易。您错了:*请注意,服务与其他应用程序对象一样,在其宿主进程的主线程中运行。这意味着,如果您的服务要执行任何CPU密集型(如MP3播放)或阻塞(如网络)操作,它应该生成自己的线程来执行该操作。*服务不是线程。它本身并不是一种脱离主线程工作的方法(以避免应用程序不响应错误)。因此,这不是当且仅当您需要多线程时才需要。IntentService在后台使用AsyncTask来处理主线程之外的处理,@roiberg@roiberg Correct。服务将在主线程上工作。为了更清楚地回答这个问题,服务对于多线程(线程池)或在后台很长时间保持序列化的执行器/handlerthread非常有用。而且,您可以使用片段解决旋转问题,请检查此处使用AsyncTask将使您在关闭屏幕时失去服务器连接。