Как всегда выполнять сервис в фоновом режиме?

Я нахожусь в процессе создания приложения, которое подобно встроенному приложению SMS.

В чем я нуждаюсь:

  • сервис, который всегда работает в фоновом режиме
  • каждые 5 минут сервис проверяют текущее местоположение устройства и называют веб-сервис
  • если определенным критериям соответствуют, сервис должен генерировать уведомление (точно так же, как приложение SMS)
  • когда уведомление нажато, пользователь взят к приложению (точно так же, как приложение SMS)
  • когда приложение установлено, сервис должен быть запущен
  • когда устройство перезагружается, сервис должен быть запущен

Что я попробовал:
- выполнение регулярного рейса, который работал просто великолепно до Android, уничтожает сервис
- использование AlarmManager для создания 5 минимальных вызовов интервала к сервису. Но я не смог сделать эту работу.

73
задан Vadim Kotov 29 September 2017 в 11:55
поделиться

2 ответа

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

Иметь поле обработчика:

private final Handler handler = new Handler();

и средство обновления Runnable

private final Runnable refresher = new Runnable() {
  public void run() {
    // some action
  }
};

. Вы можете запускать свои уведомления в runnable.

При создании службы и после каждого выполнения запускайте ее следующим образом:

handler.postDelayed(refresher, /* some delay in ms*/);

В onDestroy () удалите сообщение

handler.removeCallbacks(refresher);

Чтобы запустить службу во время загрузки, вам понадобится автозапуск. Это входит в ваш манифест

<receiver android:name="com.example.ServiceAutoStarter">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
  </receiver>

, а ServiceAutoStarter выглядит следующим образом:

public class ServiceAutoStarter extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
    context.startService(new Intent(context, UpdateService.class));
  }
}

Остановить ОС от отключения службы сложно. Также у вашего приложения может быть RuntimeException и сбой, или ваша логика может остановиться.

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

В службе:

private BroadcastReceiver screenOnReceiver; 

В службе onCreate ()

screenOnReceiver = new BroadcastReceiver() {

  @Override
  public void onReceive(Context context, Intent intent) {
    // Some action
  }
};

registerReceiver(screenOnReceiver, new IntentFilter(Intent.ACTION_SCREEN_ON));

Затем отмените регистрацию службы в onDestroy () с помощью

unregisterReceiver(screenOnReceiver);
26
ответ дан 24 November 2019 в 12:25
поделиться

служба, которая всегда выполняется в фоновом режиме

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

каждые 5 мин. служба проверяет текущее местоположение устройства и вызывает веб-службу

Используйте AlarmManager .

с помощью AlarmManager установите 5 мин. интервальный вызов сервисной службы. Но я не смог выполнить эту работу.

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

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

33
ответ дан 24 November 2019 в 12:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: