RemoteServiceException: Context.startForegroundService 然后没有调用 Service.startForeground

Pie*_*rre 4 service android android-notifications foregroundnotification

我从以下异常输出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)
Run Code Online (Sandbox Code Playgroud)

我的应用程序中有 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

要启动服务,我使用以下内容:

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

我还有一些其他库,它们也可能在我的项目中包含服务:

  • 面料网
  • Firebase 消息传递/分析/等。
  • 谷歌播放服务分析/GCM/任务/等。
  • 来自Evernote 的Android-Job

问题是,我无法确定导致此错误的确切服务。如果该类包含在异常中,我就不会在这里......

无论如何[捕获/抛出/我不知道]关于异常来自哪里的任何提示?

我已经阅读了以下所有帖子,但完全没有运气:

这只在打开应用程序时发生,所以对我来说我的代码是正确的?

我只想知道如何确定这是来自哪个服务。

Com*_*are 5

如果调用startForegroundService(),则需要让服务启动。否则,您将收到“Context.startForegroundService() 未调用 Service.startForeground()”异常。

在您的情况下,似乎有时您会在您致电之后startForegroundService()但在onStartCommand()服务被调用之前停止服务。而且,显然,这意味着该服务永远不会开始。这可以说是一个框架错误,但我们不太可能改变它,所以我们需要处理它。

一种方法是不使用您自己的服务。对于像这样的“即发即弃”类型的工作,使用WorkManager或 可能JobIntentService,您不再需要担心前景。

但是,如果您想坚持使用前台服务,请让服务启动。一种方法是让服务自行停止。例如,一个服务可以有自己的onLowMemory()方法,在那里它可以停止自己。该服务知道该服务是否已调用,startForeground()并且可以比外部方更优雅地处理它。


归档时间:

查看次数:

2111 次

最近记录:

6 年,3 月 前