2010-11-07 3 views
1

У меня есть приложение, которое запускается при загрузке с использованием широковещательного приемника, также у меня есть активность и процесс, потому что служба должна работать всегда на фоне, я запускаю службу на своем собственном процессе используя тег манифеста android: process.андроидный сервис работает в отдельной теме

Ui предназначен только для удовлетворения текущих потребностей, и я хотел бы, чтобы пользователь имел возможность запускать службу, даже если активность не активна.

Я начинаю службу, используя этот дополнительный параметр:

intent.putExtra(Intent.EXTRA_DONT_KILL_APP, true); 

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

ответ

1

, потому что служба должна работать всегда на фоне

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

Я запускаю сервис самостоятельно, используя тег android: process manifest.

Пожалуйста, не делайте этого. Вы тратите впустую RAM. Вам не нужен отдельный процесс для этой службы.

Я начинаю службу, используя этот дополнительный параметр:

Этот параметр не делает то, что вы думаете. Он не используется со стартовыми службами.

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

Шаг № 1: избавиться от существующего сервиса.

Шаг №2: Используйте AlarmManager и WakefulIntentService. Запланируйте будильник (возможно, используя ваш загрузочный приемник) для вызова «каждый Х-время». Имейте WakefulIntentService «подключитесь к сети и отправьте некоторые данные».

+0

спасибо за совет, но 1 Я использую около 3 мб бара, который немного совместим с любой другой службой, работающей по телефону, 2 для чего он используется (дополнительный параметр)? 3 почему бы не использовать отдельный процесс? когда я должен? 4 Я знаю о диспетчере аварий, но я хочу, чтобы мои обновления в определенные периоды, которые диспетчер аварийной сигнализации не может гарантировать. – maxsap

+0

@maxasp: 1. Android все равно. Пользователям все равно. 2. http://developer.android.com/reference/android/content/Intent.html#EXTRA_DONT_KILL_APP 3. Потому что вы тратите вдвое больше ОЗУ, не пользуясь преимуществами. 4. 'AlarmManager' работает отлично, спасибо. Если у вас есть доказательства обратного, отправьте его. – CommonsWare

+0

Фактическое приложение - это сервис, действие которого выполняется только в первый раз, когда программа запускается, поэтому зачем использовать двойную RAM? пожалуйста, объясните, андроид восстановит память, используемую процессом активности (исправьте меня, если я ошибаюсь). Я уже прочитал эту ссылку, поэтому я использовал ее, когда говорит, что «переопределить действие перезагрузки приложения по умолчанию» не влияет на службы? Не знаю о методе setRepeating извините, но могу ли я изменить интервал динамически? в текущей форме служба получает уведомление о новом интервале и задает задачу таймера. – maxsap

0

Я полностью согласен с ответом CommonsWare. Но, если вы действительно хотите беспокоить пользователей еще-еще-бесполезных-сервис-который-сидит-в-фона только поеданию-памяти можно использовать следующее:

В вашей деятельности:

Intent serviceIntent = new Intent(this, UpdateService.class); 
serviceIntent.setAction(Intent.ACTION_MAIN); 
startService(serviceIntent); 

в вашей службе:

public int onStartCommand(Intent intent, int flags, int startId) { 
    if (intent != null) { 
     .. do something here 
    } 
    return Service.START_STICKY; 
} 

Опять же, пожалуйста, не делайте этого просто выполнить какое-либо действие периодически.ПОЖАЛУЙСТА, используйте AlarmManager!

 Смежные вопросы

  • Нет связанных вопросов^_^