然后Context.startForegroundService()没有调用Service.startForeground

时间:2017-10-18 05:57:50

标签: android foreground-service

我的应用会在startForegroundService(intent)的{​​{1}}中致电onCreate。我将MainActivity放在startForeground(ON_SERVICE_CONNECTION_NID, notification)的{​​{1}}和onCreate中。 但我偶尔也会收到这个错误。

startCommand

怎么会发生这种情况? 是否有可能在5秒内调用ServiceException android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground() android.app.ActivityThread$H.handleMessage (ActivityThread.java:1775) android.os.Handler.dispatchMessage (Handler.java:105) android.os.Looper.loop (Looper.java:164) android.app.ActivityThread.main (ActivityThread.java:6541) java.lang.reflect.Method.invoke (Method.java) com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:240) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:767) ? 如果是这样,我们应该如何调用onCreate而没有错误?

2017-12-09更新

我不知道为什么每个人都说这与这个问题相同:Context.startForegroundService() did not then call Service.startForeground() 你甚至可以在那里找到我的评论。

你可以在这个问题的第一行看到它与众不同的原因。我已将startCommandstartForegroundService放在正确的位置,但它仍然会随机显示此错误。

以下是Google问题跟踪器:https://issuetracker.google.com/issues/67920140

  

在此之前停止服务将导致崩溃。

这是关于服务生命周期的另一个问题。 服务关闭后,可能会错误地触发断言。

3 个答案:

答案 0 :(得分:0)

我面临同样的问题,花了很长时间找到解决方案,你可以尝试下面的代码。如果您使用Service然后将此代码放入onCreate,则使用Intent Service,然后将此代码放入onHandleIntent

if (Build.VERSION.SDK_INT >= 26) {
    String CHANNEL_ID = "my_app";
    NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
            "MyApp", NotificationManager.IMPORTANCE_DEFAULT);
    ((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(channel);
    Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
            .setContentTitle("")
            .setContentText("").build();
    startForeground(1, notification);
}

并调用此

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        context.startForegroundService(getSyncIntent(context));
    } else {
        context.startService(getSyncIntent(context));
    }

答案 1 :(得分:0)

我遇到了同样的问题 最终帮助我的是,尽早初始化NotificationChannel(我在应用程序类本身中完成),然后在服务中创建和使用通知。

我把它放在Application类中:

$('.wrapper').draggable({
  start: function(e, ui) {
    // Getting start position
    var parentOffset = $(this).parent().offset();
    var relX = e.pageX - parentOffset.left;
    var relY = e.pageY - parentOffset.top;
    $("#start").html(" x: " + relX + ", y: " + relY);
  },
  stop: function(e, ui) {
    // Getting stop position
    var parentOffset = $(this).parent().offset();
    var relX = e.pageX - parentOffset.left;
    var relY = e.pageY - parentOffset.top;
    $("#end").html(" x: " + relX + ", y: " + relY);
  }
});

并在我调用的服务的onStartCommand方法中:

private void createNotificationChannel() {
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        CharSequence name = "MyStreamingApplication";
        String description = "radio";
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, name, importance);
        mChannel.setSound(null, null);
        mChannel.enableVibration(false);
        mChannel.setDescription(description);
        notificationManager.createNotificationChannel(mChannel);
    }
}

答案 2 :(得分:0)

我在Galaxy Tab A(Android 8.1.0)上遇到了此问题。在我的应用程序中,我在MainApplication(应用程序扩展类)的构造函数中启动了前台服务。使用调试器,我发现在OnCreate()之后花了超过5秒的时间才能到达服务startForegroundService(intent)。即使startForeground(ON_SERVICE_CONNECTION_NID, notification)OnCreate()中被调用,我还是崩溃了。

尝试了不同的方法后,我发现以下一项对我有用:

在构造函数中,我使用AlarmManager唤醒接收器,并在接收器中启动了前台服务。

我猜我之所以有这个问题,是因为应用程序的繁重工作启动延迟了前台服务的创建。

尝试我的方法,您也可以解决该问题。祝好运。