我正在启动一个将在后台访问 Xmpp 服务器的项目。它将保持连接活动并在需要时重新连接+做其他 Xmpp 事情。
我想实现一个类来完成这项工作。该类必须与其他Services
(Location
...)和BroadcastReceivers
(CONNECTIVITY_CHANGE ....)交互。基本上,Activity 和 Broadcast 接收器会要求 Xmpp 类启动一个动作,例如:CONNECT、DISCONNECT、RECONNECT、JOIN CHAT、SEND MESSAGE 等。
第一种方法是将其实现为Service
但服务在主线程中运行,因此实现是错误的。
其次,我想把它做成一个,IntentService
因为它onHandleIntent
是异步运行的,然后我就退出了主线程。
但是onHandleIntent
它只运行一次来执行异步任务。所以,如果我想Activity
执行另一个“动作”,我只能发送一个广播事件,我将再次陷入主线程问题。此外,IntentService
它的目标并不是一直“活着”。
在谷歌文档中,他们说你需要AsyncTask
为每个网络访问运行......这是进行网络访问的唯一方法......这很可悲。
我查看了 GTalkSMS 中的实现,他们似乎也有同样的问题。实际上,他们使用 aService
和这样的ServiceHandler
管理:
// some stuff for the async service implementation - borrowed heavily from // the standard IntentService, but that class doesn't offer fine enough // control for "foreground" services. private static volatile Looper sServiceLooper; private static volatile ServiceHandler sServiceHandler; private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { onHandleIntent((Intent) msg.obj, msg.arg1); } }