我有一个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中的每个服务中,都可以作为前台或后台运行。如果您想退出服务。您只需致电stopSelf();
onDestroy中的方法,但您需要确保在调用stopSelf();