Можете ли вы предложить простой способ заставить мое приложение Android Client продолжать работать, когда оно свернуто? - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь создать приложения, которые автоматически синхронизируют буфер обмена между Android телефонами и linux компьютерами, которые находятся в одной сети. Программное обеспечение сервера и клиента, которое я сделал для компьютера linux, работает нормально. Я добавлю windows позже и сделаю его бесплатным.

Моя проблема с приложением Android на телефоне. Это приложение отправляет содержимое буфера обмена на сервер при изменении буфера обмена телефона. Он также обновляет буфер обмена телефона при получении нового с сервера. Проблема в том, что ничего не работает, когда приложение свернуто. Повторное открытие приложения после изменения буфера обмена телефона или для получения буфера обмена с компьютера linux становится обязательным и раздражающим. Я знаю, что Android запрещает не перегружать процессор телефона.

Я искал inte rnet, чтобы найти решение, но обнаружил, что это очень трудная проблема для новичка ie, такого как я. , Потоки, процессы, службы и т. Д. c - непростые понятия.

Может кто-нибудь дать мне понять, как изменить мой код для решения этой проблемы?

Я занимаюсь разработкой на Qt в C ++.

Заранее спасибо, март c.

Вот весь мой код:

.h

#ifndef FENCLIENT_H
#define FENCLIENT_H

#include <QtWidgets>
#include <QtNetwork>
#include <QClipboard>
#include "ui_fenclient.h"


class FenClient : public QWidget, private Ui::FenClient
{
    Q_OBJECT

    public:
        FenClient();

    private slots:
        void on_boutonConnexion_clicked();
        void on_boutonEnvoyer_clicked();
        void on_message_returnPressed();
        void donneesRecues();
        void connecte();
        void deconnecte();
        void erreurSocket(QAbstractSocket::SocketError erreur);
        void copiage();

    private:
        QTcpSocket *socket; // Représente le serveur
        quint16 tailleMessage;
        QClipboard *clipBoard;

};


#endif // FENCLIENT_H

the. cpp

#include "fenclient.h"

using namespace std;
#include<iostream>
#include <ostream>//sinon cout marche pas

FenClient::FenClient()
{
    setupUi(this);

    socket = new QTcpSocket(this);
    connect(socket, SIGNAL(readyRead()), this, SLOT(donneesRecues()));
    connect(socket, SIGNAL(connected()), this, SLOT(connecte()));
    connect(socket, SIGNAL(disconnected()), this, SLOT(deconnecte()));
    connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(erreurSocket(QAbstractSocket::SocketError)));

    tailleMessage = 0;

    clipBoard = QGuiApplication::clipboard();//Ca a été long mais il me faut ca...pas tout compris
    //QClipboard *clipBoard = QGuiApplication::clipboard();// Bad because it shadows FenClient::clipBoard
    connect(clipBoard, SIGNAL(dataChanged()), this, SLOT(copiage()));//serait mieux connect(clipBoard, &QClipboard::dataChanged, this, &FenClient::copiage);
}

// Tentative de connexion au serveur
void FenClient::on_boutonConnexion_clicked()
{
    // On annonce sur la fenêtre qu'on est en train de se connecter
    listeMessages->append(tr("<em>Tentative de connexion en cours...</em>"));
    boutonConnexion->setEnabled(false);

    socket->abort(); // On désactive les connexions précédentes s'il y en a
    socket->connectToHost(serveurIP->text(), serveurPort->value()); // On se connecte au serveur demandé
}

// Envoi d'un message au serveur
void FenClient::on_boutonEnvoyer_clicked()
{
    QByteArray paquet;
    QDataStream out(&paquet, QIODevice::WriteOnly);

    // On prépare le paquet à envoyer
    QString messageAEnvoyer = message->text();//on enlève tr("<strong>") + pseudo->text() +tr("</strong> : ") +

    out << (quint16) 0;
    out << messageAEnvoyer;
    out.device()->seek(0);
    out << (quint16) (paquet.size() - sizeof(quint16));

    socket->write(paquet); // On envoie le paquet

    message->clear(); // On vide la zone d'écriture du message
    message->setFocus(); // Et on remet le curseur à l'intérieur
}

// Appuyer sur la touche Entrée a le même effet que cliquer sur le bouton "Envoyer"
void FenClient::on_message_returnPressed()
{
    on_boutonEnvoyer_clicked();
}

// On a reçu un paquet (ou un sous-paquet)
void FenClient::donneesRecues()
{
    /* Même principe que lorsque le serveur reçoit un paquet :
    On essaie de récupérer la taille du message
    Une fois qu'on l'a, on attend d'avoir reçu le message entier (en se basant sur la taille annoncée tailleMessage)
    */
    QDataStream in(socket);

    if (tailleMessage == 0)
    {
        if (socket->bytesAvailable() < (int)sizeof(quint16))
             return;

        in >> tailleMessage;
    }

    if (socket->bytesAvailable() < tailleMessage)
        return;


    // Si on arrive jusqu'à cette ligne, on peut récupérer le message entier
    QString messageRecu;
    in >> messageRecu;

    // On affiche le message sur la zone de Chat
    listeMessages->append(messageRecu);

    //clipBoard->disconnect();
    //disconnect(clipBoard, SIGNAL(dataChanged()), this, SLOT(copiage()));
    //on met dans le clipBoard
    //QObject::disconnect(clipBoard);//cela cause un changement du clipboard et ca marche pas
    cout << "Avant " << endl;
    QString temporaire=clipBoard->text();
    if (messageRecu == temporaire)

    {
    }
    else
        {
        clipBoard->QObject::blockSignals(true);
        clipBoard->setText(messageRecu);
        clipBoard->QObject::blockSignals(false);
        }
    //connect(clipBoard, SIGNAL(dataChanged()), this, SLOT(copiage()));
    cout << "Après " << endl;

    // On remet la taille du message à 0 pour pouvoir recevoir de futurs messages
    tailleMessage = 0;
}

// Ce slot est appelé lorsque la connexion au serveur a réussi
void FenClient::connecte()
{
    listeMessages->append(tr("<em>Connexion réussie !</em>"));
    boutonConnexion->setEnabled(true);
}

// Ce slot est appelé lorsqu'on est déconnecté du serveur
void FenClient::deconnecte()
{
    listeMessages->append(tr("<em>Déconnecté du serveur</em>"));
}

// Ce slot est appelé lorsqu'on que le presse-papiers change
void FenClient::copiage()
{   cout << "Copiage= " << endl;

    QString textCopie;

    //clipBoard->blockSignals(true);
    textCopie = clipBoard->text();
    //clipBoard->blockSignals(false);

    QByteArray paquet;
    QDataStream out(&paquet, QIODevice::WriteOnly);

    // On prépare le paquet à envoyer
    QString messageAEnvoyer = textCopie;

    out << (quint16) 0;
    out << messageAEnvoyer;
    out.device()->seek(0);
    out << (quint16) (paquet.size() - sizeof(quint16));

    socket->write(paquet); // On envoie le paquet

    //message->clear(); // On vide la zone d'écriture du message
    //message->setFocus(); // Et on remet le curseur à l'intérieur

}



// Ce slot est appelé lorsqu'il y a une erreur
void FenClient::erreurSocket(QAbstractSocket::SocketError erreur)
{
    switch(erreur) // On affiche un message différent selon l'erreur qu'on nous indique
    {
        case QAbstractSocket::HostNotFoundError:
            listeMessages->append(tr("<em>ERREUR : le serveur n'a pas pu être trouvé. Vérifiez l'IP et le port.</em>"));
            break;
        case QAbstractSocket::ConnectionRefusedError:
            listeMessages->append(tr("<em>ERREUR : le serveur a refusé la connexion. Vérifiez si le programme \"serveur\" a bien été lancé. Vérifiez aussi l'IP et le port.</em>"));
            break;
        case QAbstractSocket::RemoteHostClosedError:
            listeMessages->append(tr("<em>ERREUR : le serveur a coupé la connexion.</em>"));
            break;
        default:
            listeMessages->append(tr("<em>ERREUR : ") + socket->errorString() + tr("</em>"));
    }

    boutonConnexion->setEnabled(true);
}

основной. cpp

#include <QApplication>
#include "fenclient.h"

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

    FenClient fenetre;
    fenetre.show();

    return app.exec();
}

Здравствуйте! Мне удалось добавить файл манифеста Android в мой проект. Сейчас я пытаюсь выполнить шаги, описанные здесь: https://www.kdab.com/qt-android-create-android-service-using-qt/, но я блокирую прямо на первом шаге! Мне не ясно, где автор просит поместить эти строки кода:

package com.kdab.training;
import org.qtproject.qt5.android.bindings.QtService;
public class MyService extends QtService
{
}

Можете ли вы сказать мне, где эти строки должны go? Кажется, проекту нужен где-то файл java, но я понятия не имею, где. Спасибо за вашу помощь.

...