Подтвердить что ты не робот

Запуск службы от BroadcastReceiver

В моем приложении есть Service и BroadcastReceiver, но как мне запустить сервис непосредственно из BroadcastReceiver? С помощью

startService(new Intent(this, MyService.class));

не работает в BroadcastReceiver, есть идеи?

РЕДАКТИРОВАТЬ:

context.startService(..);

работает, я забыл контекстную часть

4b9b3361

Ответ 1

Не забывайте

context.startService(..);

Ответ 2

должно быть таким:

Intent i = new Intent(context, YourServiceName.class);
context.startService(i);

обязательно добавьте службу в manifest.xml

Ответ 3

используйте context метода onReceive вашего BroadcastReceiver для запуска компонента службы.

@Override
public void onReceive(Context context, Intent intent) {
      Intent serviceIntent = new Intent(context, YourService.class);
      context.startService(serviceIntent);
}

Ответ 4

Лучшая практика:

При создании намерения, особенно начиная с BroadcastReceiver, не используйте этот как контекст. Возьмите context.getApplicationContext(), как показано ниже

 Intent intent = new Intent(context.getApplicationContext(), classNAME);
context.getApplicationContext().startService(intent);

Ответ 5

Поскольку метод приемника onReceive (Context, Intent) выполняется в основном потоке, он должен выполняться и быстро возвращаться. Если вам нужно выполнить длительную работу, будьте осторожны с порождением потоков или запуском фоновых служб, потому что система может завершить весь процесс после возврата onReceive(). Для получения дополнительной информации см. Влияние на состояние процесса. Для выполнения длительной работы мы рекомендуем:

Вызов goAsync() в методе onReceive() вашего приемника и передача BroadcastReceiver.PendingResult в фоновый поток. Это сохраняет трансляцию активной после возврата из onReceive(). Однако даже при таком подходе система ожидает, что вы закончите трансляцию очень быстро (до 10 секунд). Это позволяет вам перенести работу в другой поток, чтобы избежать сбоев основного потока. Планирование работы с JobScheduler developer.android.com

Ответ 6

 try {
        Intent intentService = new Intent(context, MyNewIntentService.class);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            context.startForegroundService(intentService );
        } else {
            context.startService(intentService );
        }
    } catch (Exception e) {
        e.printStackTrace();
    }