Преимущество LocalService? - PullRequest
1 голос
/ 16 марта 2012

Я прочитал всю документацию об AsyncTasks, Службах, ... Довольно ясно, для чего нужна удаленная Служба.Но у меня возникают проблемы, получая выгоду от LocalService?Типичный пример - «воспроизведение музыки» или загрузка большого файла.Но зачем мне для этого запускать локальную Службу?

Я выполнил небольшую асинхронную задачу, имитирующую такую ​​задачу.

AsyncTask<String, Integer, String> async = new AsyncTask<String, Integer, String>() {
            @Override
            protected String doInBackground(String... params) {
                for (int i = 0; i < 100; i++) {
                    try {
                        Thread.sleep(500);
                        System.out.println(i);
                    } catch (InterruptedException e1) {
                        e1.printStackTrace();
                    }
                }

                return null;
            }
        };
        async.execute("");

Большинство ответов таково, что (Локальная) Служба предназначена длядолгосрочные действия, которые должны выполняться, даже когда основное действие закрыто.Хорошо, но я могу сделать это также с помощью задачи Async в Main Activity:

Button btnFinish = (Button) findViewById(R.id.button1);
        btnFinish.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                finish();
            }
        });

Нажатие кнопки вызывает onDestroy (), но задача Async все еще выполняется?Так разве это не то же самое, что запуск AsyncTask из службы?

// РЕДАКТИРОВАТЬ: Я выполнил пару тестов, и я почти уверен, что Async Task работает так же долго, как процесс делает.Так что, если бы я обернул его в локальную службу (обычным способом) - он бы тоже дожил до тех пор, пока процесс ...

Так почему же все используют локальную службу для таких задач, как загрузка файлов?, синхронизация, ...?!

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

Большинство ответов таковы: (локальная) служба предназначена для длительных операций, которые должны выполняться, даже когда основная деятельность закрыта. ОК - но я могу сделать это также с помощью асинхронной задачи в основной операции:

Не без утечки памяти. Никогда не вытекать нити из компонента. Когда действие уничтожено, убедитесь, что все потоки, запущенные этим действием, будут закрыты быстро .

Я провел пару тестов, и я почти уверен, что Async Task работает так же долго, как и процесс.

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

Сервис - это маркер, сообщающий Android: «Йо! Я все еще здесь работаю, йо!». Этот маркер не может поддерживать процесс в течение неопределенного времени, но обычно он хорошо работает для вещей, которые будут работать порядка минут или часов.

Служба также имеет собственный жизненный цикл, независимый от действий. Например, если вы хотите получать контроль каждые 15 минут для выполнения какой-либо работы, правильное решение состоит в том, чтобы использовать AlarmManager и IntentService, и это приложение может не работать вокруг.

Так почему же все используют локальный Сервис для таких задач, как загрузка файлов, синхронизация

Потому что мы хотим, чтобы он работал правильно.

0 голосов
/ 16 марта 2012

Как я понимаю, предполагаемое использование AsyncTask больше соответствует обновлению вашего пользовательского интерфейса после некоторой фоновой обработки.Идея состоит в том, что когда они завершены, вы можете выполнить какое-либо действие в потоке пользовательского интерфейса.То, как вы предлагаете использовать их как сервис, похоже на слепую постановку в очередь Runnable и запуск его в фоновом потоке до тех пор, пока его обработка не будет завершена, полностью независимо от остальной части жизненного цикла действия.Как правило, эти дополнительные зависающие темы можно отменить в onPause или onDestroy.Плохо поступать иначе, так как они могут вызвать ошибки, из-за которых диалоговое окно сбоя отображается для пользователя даже после закрытия вашей активности.

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

...