Использование службы Android для обработки сетевого подключения - PullRequest
4 голосов
/ 21 апреля 2011

Я работаю над приложением для Android, которое должно поддерживать сетевое соединение с сервером чата.Я понимаю, что могу создать службу для инициирования соединения с сервером, но как служба будет уведомлять активность Android о новых входящих сообщениях?Деятельность должна будет обновить представление, чтобы показать новые сообщения.Я довольно новичок в Android, поэтому любая помощь приветствуется.Спасибо!

Ответы [ 3 ]

8 голосов
/ 21 апреля 2011

Можете ли вы передать обработчик на службу?

Сначала определите ваш обработчик как интерфейс. Это пример, так что ваш может быть более сложным.

public interface ServerResponseHandler {

    public void success(Message[] msgs); // msgs may be null if no new messages
    public void error();

}

Определите экземпляр вашего обработчика в вашей деятельности. Поскольку это интерфейс, вы предоставите реализацию здесь в упражнении, поэтому вы можете ссылаться на поля и методы вложенного действия из обработчика.

public class YourActivity extends Activity {

// ... class implementation here ...

    updateUI() { 
        // TODO: UI update work here
    }

    ServerResponseHandler callback = new ServerResponseHandler() {

        @Override
        public void success(Message[] msgs) {
            // TODO: update UI with messages from msgs[]

            YourActivity.this.updateUI();
        }

        @Override
        public void error() { 
            // TODO: show error dialog here? (or handle error differently)
        }

    }

    void onCheckForMessages() { 
        networkService.checkForMessages(callback);
    }

и NetworkService будет содержать что-то вроде:

void checkForMessages(ServerResponseHandler callback) { 

    // TODO: contact server, check for new messages here

    // call back to UI
    if (successful) { 
        callback.success(msgs);
    } else {
        callback.error();
    }
}  

Кроме того, как говорит Aleadam, вы также должны знать, что служба по умолчанию работает в том же потоке. Это часто не предпочтительное поведение для чего-то вроде работы в сети. Страница Основы Android на Сервисах явно предупреждает о работе сети без отдельных потоков:

Внимание. Служба запускается в главном потоке процесса хостинга - служба не создать свой собственный поток и не запускается в отдельном процессе (если вы не укажете иначе). Это означает, что если ваш сервис будет выполнять какую-либо интенсивную работу процессора или блокируя операции (такие как воспроизведение MP3 или работа в сети), вы должны создать новый поток в службе, чтобы сделать эту работу. Используя отдельный поток, вы уменьшите риск ошибок приложения не отвечает (ANR), и основной поток приложения может оставаться выделенным для взаимодействия пользователя с вашими действиями.

Для получения дополнительной информации об использовании потоков в вашем сервисе, ознакомьтесь со статьями SO Потоки приложений против потоков сервисов и Как запустить сервис в новом потоке в android

0 голосов
/ 30 марта 2017

Одним из распространенных и полезных подходов является регистрация получателя широковещательной рассылки в вашей Деятельности, и служба должна отправлять уведомления о событиях, когда у нее есть полезные данные.Я считаю, что этим легче управлять, чем реализовывать обработчик с помощью обратного вызова, главным образом потому, что это делает его проще и безопаснее при изменении конфигурации.Если вы передаете прямую ссылку на активность в Службу, то вы должны быть очень осторожны, чтобы очистить ее, когда активность уничтожена (во время ротации или фоновой обработки), в противном случае вы получите утечку.

При использовании Broadcast Receiver вам все равно придется отменить регистрацию при уничтожении Действия, однако Служба никогда не имеет прямой ссылки на Это действие, поэтому, если вы забудете, Это действие не будет пропущено.Также легче иметь регистр Activity для прослушивания темы при ее создании, поскольку ему никогда не нужно получать прямую ссылку на Сервис ...

В статье Ларса Фогеля обсуждается этот подход, он определенностоит прочтения!http://www.vogella.com/tutorials/AndroidServices/article.html#using-receiver

0 голосов
/ 21 апреля 2011

Проверяли ли вы страницу API сервиса: http://developer.android.com/reference/android/app/Service.html?
В нем есть несколько примеров взаимодействия с Сервисом.

Служба работает в том же потоке и в том же контексте, что и действие. Проверьте также здесь: http://developer.android.com/reference/android/content/Context.html#bindService%28android.content.Intent,%20android.content.ServiceConnection,%20int%29

Наконец, взгляните также на статью Ларса Фогеля: http://www.vogella.de/articles/AndroidServices/article.html

...