【问题标题】:RemoteServiceException: Context.startForegroundService did not then call Service.startForegroundRemoteServiceException:Context.startForegroundService 没有调用 Service.startForeground
【发布时间】:2019-10-22 01:40:30
【问题描述】:

我从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 消息传递/分析/等。
  • Google Play 服务分析/GCM/Tasks/等。
  • Android-Job 来自Evernote

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

无论如何 [catch/throw/我不知道] 是否有任何关于异常来自何处的提示?

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

只有在打开应用程序时才会出现这种情况,所以对我来说我的代码是正确的吗?

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

【问题讨论】:

  • 你能重现这个吗(即使只是偶尔)?如果是这样,您应该能够返回 Logcat 并找出最近启动的服务。但是,如果您只是从生产用户那里获得此信息,那么这种方法将行不通。
  • @CommonsWare 感谢您的回答,通过弄清楚您的意思是为启动的服务添加日志行,然后查看它可能是哪一个?它确实经常发生,但不能直接重现。
  • “你的意思是为启动的服务添加日志行,然后看看它可能是哪一个?” -- 不,我认为有报告服务启动的系统日志消息。当然有活动开始。
  • 可能。您可能会考虑摆脱所有这些,并在工作完成后让服务自行停止。或者,您可以考虑切换到 WorkManager(或 Android-Job,因为您似乎已经在使用它),而不是为此推出自己的服务。
  • @CommonsWare Removing onDestroy 和 onLowMemory 停止服务为我解决了这个问题

标签: android service android-notifications foregroundnotification


【解决方案1】:

如果你调用startForegroundService(),你需要让服务启动。否则会出现“Context.startForegroundService()没有再调用Service.startForeground()”异常。

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

一种方法是不使用您自己的服务。对于像这样“一劳永逸”的工作,请使用WorkManager,或者可能是JobIntentService,您不再需要担心前景问题。

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

【讨论】:

  • 这不是我的情况。我不会直接停止服务。相反,我发送在服务的“onStartCommand”(调用“startForeground”)中注册的广播“关闭服务”。这样就永远不会发生服务在调用“startForeground”之前停止。但是我仍然看到有时会报告错误。
猜你喜欢
  • 2017-11-09
  • 2019-01-09
  • 2018-03-29
  • 2018-03-04
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多