Ответ 1
Я не уверен, что здесь "правильный сбор мусора". Скорее всего, ваша активность просто закрывается Android, потому что вы создаете соединение в Activity.
Но вы правы, чтобы поддерживать стабильное соединение, вам нужно поставить XMPP-соединение в Service. Но убедитесь, что соединение находится в дополнительном потоке, потому что сервис для себя не является дополнительным процессом или потоком. Это можно сделать, например, с помощью Handler.
HandlerThread thread = new HandlerThread(SERVICE_THREAD_NAME);
thread.start();
handlerThreadId = thread.getId();
serviceLooper = thread.getLooper();
serviceHandler = new ServiceHandler(serviceLooper);
Затем вы можете общаться с сервисом через сообщения/намерения. Другой альтернативой будет Binder интерфейс.
Вы также можете посмотреть, как это делают другие: Beem и GTalkSMS являются проектами с открытым исходным кодом, которые реализуют XMPP-соединение с сервисом Android. GTalkSMS использует подход IntentService, тогда как Beem использует Binder для связи с XmppConnection.
Обратите внимание, что мы достигаем довольно стабильного соединения с GTalkSMS, но это никогда не так хорошо, как запасной GTalk Service/Client. Одна из причин заключается в том, что таймер проверки по умолчанию по умолчанию остается 5 минут, что часто бывает для мобильного устройства, когда вы хотите сохранить как можно больше батареи. Поэтому мне пришлось установить его на более высокую ценность, что связано с некоторыми недостатками. У вас всегда будет компромисс между быстрым, отзывчивым и стабильным соединением и временем автономной работы, когда дело доходит до этого.