Android: onDestroy не выполняется после вызова stopSelf - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть приложение Qt Android со службой, реализованной с использованием 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 не вызывается. В моем приложении служба даже не остановлена. Я попробовал минимальный пример, основанный на этом руководстве . В этой минимальной реализации служба остановлена, но функция 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();
    }
}

Если я проверю журнал, Вызывается Quit сообщение появляется но Called onDestroy никогда. У вас есть идея, почему это происходит и как я могу отладить поведение? Кроме того, что может быть причиной того, что мой сервис не остановится? Как я могу узнать, что мешает ему выйти?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Вызов stopService с намерением вызовет onDestroy метод из действия или фрагмента

stopService(Intent(this, MyService.class))
0 голосов
/ 19 февраля 2020

в каждом сервисе в android может работать как передний план или как фон. если вы хотите выйти из сервиса. вам просто нужно вызвать stopSelf(); метод в onDestroy, но вы должны убедиться, что обратного вызова не происходит, прежде чем вызывать stopSelf();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...