IntentService、Service 或 AsyncTask

5
什么是最好的实现方式?我有一个安卓应用程序,需要使用我的Python服务器来允许两个电话之间的往返通信。往返通信意味着在开始一轮之前,它们不能相互通信,一旦他们发送了消息,就不能再发送另一个消息,直到对方响应并开始新的一轮。
我考虑使用IntentService,但是让服务器不停地启动和停止似乎不太对,而且我也不想要处理异步任务的问题,或者那是处理它的最佳方式吗?如何才能让服务接收和发送消息给客户端,因为服务似乎更多是单向的东西?
4个回答

16

Intent服务实际上就是由意图触发的工作线程,它们在单独的线程中执行操作,然后被关闭。它们被设计成可以启动和停止。

如果您需要执行诸如HTTP GET之类的任务,或者在任何情况下进行交互而不需要保持与服务器的连接,请使用Intent服务,并通过广播事件通知您的活动。

如果您的应用需要与服务器保持连接(即永久TCP连接),我建议使用一个服务(而不是Intent服务),该服务使用异步任务或托管在服务中的更经典的线程执行网络操作。然后,您可以使用bindToService()方法使活动与服务交互。

我建议不要在活动中使用异步任务。如果发生水平/垂直视图更改,就会丢失服务器响应,正如oneilse14在他的回复中所述。


你可以使用Fragment来解决旋转问题,这里有参考代码 https://gist.github.com/daichan4649/2480065 - MSaudi
使用AsyncTask会导致在关闭屏幕时失去服务器连接。 - albertTaberner

5
我强烈推荐使用IntentService/Broadcast Receiver方法。避免与AsyncTask相关的恶劣配置更改问题将使您的生活轻松十倍。

我了解,但是标准的带消息的线程也可以实现相同的功能,不是吗?即使配置更改后,活动仍将从后台线程接收消息,是吗? - Yar
1
线程将保留对原始上下文的引用。如果在配置更改后重新注册上下文/处理程序,则可以解决此问题,但接收器路由仍然更容易。 - SeanPONeil

2
据我所理解,您遇到的问题是工作者队列模型(生产者-消费者模型)。IntentService就是为此而设计的。仅当您需要进行多线程操作时才应使用服务。您可以使用IBinder接口与Activity和Service进行通信。
Asynctask只是一种专门的线程,以便您可以轻松更新UI。但对于您的情况,IntentService似乎是最佳选择。

你错了:
  • 注意,像其他应用程序对象一样,服务运行在其主机进程的主线程中。这意味着,如果您的服务将执行任何需要CPU资源(如MP3播放)或阻塞操作(如网络连接),它应该在其自己的线程中生成并完成该工作。
  • 服务不是线程。它本身不是在主线程之外执行工作的手段(以避免应用程序未响应错误)。
因此,并不是仅当需要使用多线程时才需要使用服务。
- roiberg
1
IntentService在底层使用AsyncTask来处理主线程之外的处理,@roiberg。 - lilbyrdie
@roiberg 正确。服务将在主线程上运行。为了使这个答案更清晰,服务将对于多线程(线程池)非常有用,或者在后台保持一个序列化的执行器/处理程序线程很长时间。 - manjusg

0

我会使用通过AlarmManager调度的警报,因为这样可以设置检查回合是否开始/轮流。 它具有服务的优点,但不会造成电池耗尽的恐惧。 它需要频率以确定警报应该运行的频度,其中甚至包括时间枚举(例如,每天/每周1小时)。

当警报运行时,它可以进行轮询以查看当前状态并根据情况做出反应。 例如,通知可以进入状态栏,手机可以发出听得见的声音和振动。这样做的好处是用户不必保持应用程序运行,因为警报将触发广播接收器。

警报代码示例:http://www.androidcompetencycenter.com/2009/02/android-basics-alarm-service/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接