2017-01-19 1 views
0

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

Есть ли подходящий способ сделать безошибочную службу фона, например, популярные приложения?

+0

Как вы знаете, что у этих приложений есть такая услуга? –

+0

@Tim Casteljins Я заметил, что эти услуги не убиты даже в режиме доз и агрессивных доз. Если они потом, они перезапускаются, и я никогда не пропускал сообщение от WhatsApp, поэтому я думаю, что у них есть хороший способ сохранить его в живых. –

+0

Что заставляет вас думать, что whatsapp использует фоновый сервис для обработки входящих сообщений? –

ответ

5

Создание службы фона, которая «не умирает», невозможно в Android.

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

Что вы можете сделать:

  • сделать сервис липким, так что она будет возобновлена ​​в ОС после OS убивает его. Невозможно предсказать, когда он будет перезапущен. Это может быть почти мгновенно, это может занять несколько секунд, минут, часов или больше.
  • Запустите службу при открытии приложения.
  • Запустите услугу, когда приложение обновлено, используя широковещательную передачу MY_PACKAGE_REPLACED.
  • Запустите услугу, когда устройство загружено (повторно), используя радиопередачи BOOT_COMPLETED и REBOOT.
  • Переустановите onTaskRemoved в сервисе, чтобы запланировать перезапуск службы, если пользователь отменит ваше приложение из списка последних приложений.
  • Используйте FCM для периодической отправки сообщений в приложение с инструкцией по запуску службы в случае, если она больше не работает.

У вас никогда не может быть 100% работоспособности, но это приблизит вас.

+0

У меня есть все, кроме последнего. Можете ли вы также рассказать мне, как управлять им в режиме доз в 7.0? –

+0

Доза не будет * убивать * ваше обслуживание. Однако он будет применять определенные ограничения, такие как отсутствие доступа в Интернет. Вы можете прочитать все об этом в дозах и резервных документах –

+0

Я читал это. Но я не знаю, почему, но мое служение мертво в режиме доз. Вот почему я пробовал планировщик заданий, и это очень медленно и непредсказуемо. –

0

Это не очень хорошая идея, ознакомьтесь с this article. Использование сервиса в этом случае не является хорошим подходом.

+0

В каком случае? Вы даже не знаете, что в его случае –

+0

В любом случае создание вечной службы, которая не умирает, не является хорошей идеей, не так ли? –

+0

Я бы сказал, что это зависит от используемого варианта –

2

Фоновая служба, если она не отображается пользователем, будет всегда убита ранее или позже системой Android. Это способ управления памятью.

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

Возможно, что-то, что может сделать whatsapp и facebook, - это разбудить приложение удаленно с помощью любых сообщений, таких как Firebase Cloud Messaging (ex-Google Cloud Messaging) или с помощью широковещательного приемника на сертификационных мероприятиях ... Но это, безусловно, не когда-либо на службе.

Прочтите эту часть документации для Android, чтобы лучше понять это: Service Process Lifecycle.

Как вы можете видеть, чтобы отдать приоритет процессу обслуживания, вам необходимо запустить его на переднем плане и передать ему постоянное уведомление с использованием startForeground (int id, Notification notification). Используйте setOngoing (true) в NotificationBuilder для установки уведомления как текущего: setOngoing(boolean b) doc.

Наконец, вы обычно хотите добавить действие в вашем текущем уведомлении (например, контроль игрока или возможность закрыть уведомление и, следовательно, к вашим услугам, когда память будет собираться)

Здесь полный образец коды:

Notification notification = new NotificationCompat.Builder(this) 
     .setContentTitle(getString(R.string.notification_title)) 
     .setContentText(getString(R.string.notification_text)) 
     .setSmallIcon(R.drawable.ic_small_icon) 
     .setColor(getResources().getColor(R.color.colorAccent)) 
     .setContentIntent(pendingIntent) 
     .setOngoing(true) 
     //.addAction(android.R.drawable.close_service,"Close", closeServiceIntent) 
     .build(); 
    startForeground(Constants.NOTIFICATION_ID, notification); 
+0

Спасибо за ответ. Я тоже это пробовал. Но пользователи жаловались, что им не нравится значок в строке состояния. Любой способ удалить значок? –

+0

no Вы не можете удалить значок из службы переднего плана –

+0

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

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