RemoteServiceException: Context.startForegroundService 没有调用 Service.startForeground
RemoteServiceException: Context.startForegroundService did not then call Service.startForeground
我从 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/etc.
- Google 播放服务 Analytics/GCM/Tasks/etc.
- Android-工作来自 Evernote
问题是,我无法确定是哪个服务导致了这个错误。如果 class 包含在异常中,我就不会在这里...
[catch/throw/我不知道]是否有关于异常来自何处的任何提示?
我已经阅读了以下所有帖子,但一点运气都没有:
- Here
- Here
- Here
- Here
- Here
- Here
- Here
- Here
- 和Here
只有在打开应用程序时才会出现这种情况,所以对我来说我的代码是正确的吗?
我只想知道如何确定这是来自哪个服务。
如果调用startForegroundService()
,需要让服务启动。否则,您将得到 "Context.startForegroundService() did not then call Service.startForeground()" 异常。
在您的情况下,有时您会在调用 startForegroundService()
之后但在调用服务 onStartCommand()
之前停止服务。而且,显然,这意味着该服务永远不会启动。这可以说是一个框架错误,但我们不太可能改变它,所以我们需要处理它。
一种方法是不使用您自己的服务。对于 "fire and forget" 类这样的工作,使用 WorkManager
,或者可能 JobIntentService
,您不再需要担心前景。
不过,如果您想坚持使用前台服务,请启动该服务。一种方法是让服务自行停止。例如,服务可以有自己的 onLowMemory()
方法,它可以在其中自行停止。该服务知道该服务是否调用了 startForeground()
,并且可以比外部方更优雅地处理它。
我从 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/etc.
- Google 播放服务 Analytics/GCM/Tasks/etc.
- Android-工作来自 Evernote
问题是,我无法确定是哪个服务导致了这个错误。如果 class 包含在异常中,我就不会在这里...
[catch/throw/我不知道]是否有关于异常来自何处的任何提示?
我已经阅读了以下所有帖子,但一点运气都没有:
- Here
- Here
- Here
- Here
- Here
- Here
- Here
- Here
- 和Here
只有在打开应用程序时才会出现这种情况,所以对我来说我的代码是正确的吗?
我只想知道如何确定这是来自哪个服务。
如果调用startForegroundService()
,需要让服务启动。否则,您将得到 "Context.startForegroundService() did not then call Service.startForeground()" 异常。
在您的情况下,有时您会在调用 startForegroundService()
之后但在调用服务 onStartCommand()
之前停止服务。而且,显然,这意味着该服务永远不会启动。这可以说是一个框架错误,但我们不太可能改变它,所以我们需要处理它。
一种方法是不使用您自己的服务。对于 "fire and forget" 类这样的工作,使用 WorkManager
,或者可能 JobIntentService
,您不再需要担心前景。
不过,如果您想坚持使用前台服务,请启动该服务。一种方法是让服务自行停止。例如,服务可以有自己的 onLowMemory()
方法,它可以在其中自行停止。该服务知道该服务是否调用了 startForeground()
,并且可以比外部方更优雅地处理它。