[Android:调用stopSelf后未执行onDestroy

问题描述 投票:0回答:1

我有一个QtAndroid应用程序,该服务带有使用QtService实现的服务。如果我想退出该服务,请按以下步骤操作:

在C ++中:

QtAndroid::androidService().callMethod<void>("quit");

在Java服务中:

public void quit() {
    stopSelf();
}

然后有一个onDestroy函数:

@Override
public void onDestroy() {
    Log.d("MyService", "Called onDestroy");
    super.onDestroy();
}

日志信息从不显示,我想onDestroy函数不会被调用。在我的应用程序中,服务甚至没有停止。我尝试了基于this guide的最小示例。通过这种最小的实现,该服务将停止,但不会同时调用onDestroy函数。

为了演示该问题,我采用了示例源代码并对其进行了如下修改:

server.cpp

#include <QAndroidService>
#include <QtAndroid>
#include "rep_pingpong_source.h"

class PingPong : public PingPongSource {
public slots:
    // PingPongSource interface
    void ping(const QString &msg) override {
        qDebug() << "KDAB: Message "+msg;
        emit pong(msg + " from server");
        if (msg == "Quit") {
            qDebug() << "MyService: C++ quit";
            QtAndroid::androidService().callMethod<void>("quit");
        }
    }
};

int main(int argc, char *argv[])
{
    QAndroidService app(argc, argv);

    QRemoteObjectHost srcNode(QUrl(QStringLiteral("local:replica")));
    PingPong pingPongServer;
    srcNode.enableRemoting(&pingPongServer);

    return app.exec();
}

MyService.java

// java file android/src/com/kdab/training/MyService.java
package com.kdab.training;

import android.content.Context;
import android.content.Intent;
import android.util.Log;

import org.qtproject.qt5.android.bindings.QtService;

public class MyService extends QtService
{
    public static void startMyService(Context ctx) {
        ctx.startService(new Intent(ctx, MyService.class));
    }

    @Override
    public void onDestroy() {
        Log.d("MyService", "Called onDestroy");
        super.onDestroy();
    }

    public void quit() {
        Log.d("MyService", "Called quit");
        stopSelf();
    }
}

如果我检查日志,则会显示Called quit消息,但永远不会显示Called onDestroy。您是否知道为什么会发生这种情况以及如何调试该行为?另外,我的服务无法停止的原因可能是什么?我如何找出阻止它退出的原因?

谢谢!

android qt service ondestroy
1个回答
0
投票

在android中的每个服务中,都可以作为前台或后台运行。如果您想退出服务。您只需致电stopSelf();onDestroy中的方法,但您需要确保在调用stopSelf();

之前没有发生回调
© www.soinside.com 2019 - 2024. All rights reserved.