如何在应用程序中保持XMPP连接活动?

时间:2013-02-11 07:02:24

标签: android service connection xmpp keep-alive

我目前正在开发一个使用asmack lib连接到XMPP服务器的应用程序。此应用程序主要包括发送/接收消息,更改状态等。

目前,XMPP连接存在于应用程序内部,而不是某种后台服务。所以现在我想知道,最好是使用服务保持连接活着,或者只是在我的应用程序实际运行时保持连接处于活动状态。

这是考虑到我希望在我的应用程序运行后台以及用户返回任何具有XMPP连接的活动时始终保持与XMPP服务器的连接。我确实喜欢这个,如果它涉及主要活动(意味着我连接凭证)重新连接XMPP连接与相同的凭据。但我面临的问题是,当我在联系人视图中停留一段时间后,连接在一段时间后会被关闭,如果该活动恢复到连接时取消预告(即空指针异常)。这里是不可能重新连接连接。

所以在某种程度上我问,一旦我的Activity被带到前台/开始,(重新)连接/登录是否更好,或者最好在服务内部连接一次并保持这种连接活?

如果服务创建是更好的方法,如何创建片段以及如何创建XMPP连接,我必须使用按钮登录和注销。如何维护这些选项。

提前致谢,

1 个答案:

答案 0 :(得分:6)

如果您希望始终连接到XMPP服务器,Service即可。

因此,一旦用户登录,您就可以开始通信service并保持其正常运行,当用户退出时停止service

您可以显示service的通知,该通知会在点击时打开活动。

如果您在服务和活动之间进行简单的通信(例如传递少量命令),则可以使用LocalBroadcastManager执行此操作,但如果您的通信更复杂(例如,活动在服务中监听事件),请考虑创建service binder

中使用的activity

这是支持bind

的服务的示例框架
public class MyService extends Service {
    private final IBinder binder = new ServiceBinder();

   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
      onHandleIntent(intent);
      return START_STICKY;
   }

   protected void onHandleIntent(Intent intent) {
       // handle intents passed using startService()
   }

   @Override
   public IBinder onBind(Intent intent) {
    return binder;
   }

   public class ServiceBinder extends Binder {
        MyService getService() {
            return MyService.this;
        }
    }
}