RemoteServiceException: Context.startForegroundService тогда не вызывал Service.startForeground - PullRequest
4 голосов
/ 06 июня 2019

Я получаю следующее исключение от Device Monitor:

//FATAL EXCEPTION: main
//Process: com.xxx.yyy, PID: 11584
//android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()
//    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1881)
//    at android.os.Handler.dispatchMessage(Handler.java:105)
//    at android.os.Looper.loop(Looper.java:164)
//    at android.app.ActivityThread.main(ActivityThread.java:6944)
//    at java.lang.reflect.Method.invoke(Native Method)
//    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
//    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

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

public class MyService extends Service {

    private static final int forgroundId = 55544433; //Unique for each Service
    private Notification notification;

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        initNotification(); //Creates a notification

        startForeground(forgroundId, notification); //Start foreground, very first thing..

        //Do Stuff

        return START_STICKY;
    }
}

Для запуска сервисов я использую следующее:

Intent i = new Intent(context, MyService.class);
i.SetAction("myaction..");
i.PutExtra(...);
android.support.v4.content.ContextCompat.startForegroundService(context, i);

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

  • Fabric.io
  • Firebase Messaging / Analytics / пр.
  • Сервисы Google Play Analytics / GCM / Задачи / и т. Д.
  • Android-Job от Evernote

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

Есть ли в любом случае [ловить / бросать / я не знаю ] какой-либо намек на то, откуда исходит исключение?

Я прочитал все следующие посты без всякой удачи:

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

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

1 Ответ

2 голосов
/ 06 июня 2019

Если вы звоните startForegroundService(), вам необходимо разрешить запуск услуги.В противном случае вы получите сообщение «Context.startForegroundService () не вызывал исключение Service.startForeground ()».

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

Один из подходов - не использовать свой собственный сервис.Для подобных работ типа «запусти и забудь» используйте WorkManager или, возможно, JobIntentService, и вам больше не нужно беспокоиться о переднем плане.

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

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