提问者:小点点

即使我停止了服务,Context.startForegroundService()也没有调用Service.startForeground()


所以我的应用程序有一些触发服务和通知的远程操作。在调用< code > startForegroundService 和服务尝试启动通知之间,事情可能会发生变化,因此服务会再次检查事情的状态,然后决定要做什么。

因此,如果我的服务决定不需要运行它,它将调用:

stopForeground(true);
stopSelf();

但是由于某种原因,这似乎不起作用,因为我在打完那些电话后几乎立刻就得到这个异常。

11-16 13:34:23.488 15099-15099/mypackage E/AndroidRuntime: FATAL EXCEPTION: main
Process: mypackage, PID: 15099
android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1768)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

那么我该如何解决这个问题呢?

谢谢

编辑:

我创建了一个示例项目,它所做的就是在活动开始时调用< code > startForegroundService ,然后在服务上这样做:

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG,"start");
        stopForeground(true);
        stopSelf();
        return super.onStartCommand(intent, flags, startId);
    }

无论我是否使用< code > stop foreground(true),它都会崩溃。

编辑:这似乎可以修复它,但为了取消它而不得不创建一个假的通知似乎真的很难看。

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG,"start");
        String CHANNEL_ID = "my_channel_01";
        NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(this, CHANNEL_ID)

                        .setContentTitle("My notification")
                        .setContentText("Hello World!");

        startForeground(-1,mBuilder.build());
        stopForeground(true);
        stopSelf();
        return super.onStartCommand(intent, flags, startId);
    }

共1个答案

匿名用户

我有同样的问题,我在stopSelf()之前使用相同的解决方法:

private void fakeStartForeground() {
        NotificationCompat.Builder builder =
                new NotificationCompat.Builder(this, CHANNEL_ID)
                        .setContentTitle("")
                        .setContentText("");

        startForeground(NOTIFICATION_ID, builder.build());
}

我认为谷歌的某个人应该给我们一些解决方案。你在Google Bugs报告论坛上发帖了吗?