Ответ 1
Не забывайте
context.startService(..);
В моем приложении есть Service
и BroadcastReceiver
, но как мне запустить сервис непосредственно из BroadcastReceiver
? С помощью
startService(new Intent(this, MyService.class));
не работает в BroadcastReceiver
, есть идеи?
РЕДАКТИРОВАТЬ:
context.startService(..);
работает, я забыл контекстную часть
Не забывайте
context.startService(..);
должно быть таким:
Intent i = new Intent(context, YourServiceName.class);
context.startService(i);
обязательно добавьте службу в manifest.xml
используйте context
метода onReceive
вашего BroadcastReceiver для запуска компонента службы.
@Override
public void onReceive(Context context, Intent intent) {
Intent serviceIntent = new Intent(context, YourService.class);
context.startService(serviceIntent);
}
Лучшая практика:
При создании намерения, особенно начиная с BroadcastReceiver
, не используйте этот как контекст.
Возьмите context.getApplicationContext()
, как показано ниже
Intent intent = new Intent(context.getApplicationContext(), classNAME);
context.getApplicationContext().startService(intent);
Поскольку метод приемника onReceive (Context, Intent) выполняется в основном потоке, он должен выполняться и быстро возвращаться. Если вам нужно выполнить длительную работу, будьте осторожны с порождением потоков или запуском фоновых служб, потому что система может завершить весь процесс после возврата onReceive(). Для получения дополнительной информации см. Влияние на состояние процесса. Для выполнения длительной работы мы рекомендуем:
Вызов goAsync() в методе onReceive() вашего приемника и передача BroadcastReceiver.PendingResult в фоновый поток. Это сохраняет трансляцию активной после возврата из onReceive(). Однако даже при таком подходе система ожидает, что вы закончите трансляцию очень быстро (до 10 секунд). Это позволяет вам перенести работу в другой поток, чтобы избежать сбоев основного потока. Планирование работы с JobScheduler developer.android.com
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();
}