Фоновые задачи
Каждое приложение знает свой backroundTaskID и никуда его не передаёт.
onTaskStarted выполняется только если backroundTaskID будет совпадать со значением, зарегистрированным в desktop-файле приложения ([X-Task PushWorker]).
Для данного случая это PushWorker.
backroundTaskID задаётся в desktop-файле как [X-Task backgroundTaskId].
Подробнее о конфигурации .desktop-файла для push-уведомлений можно прочитать в разделе Дополнительные настройки конфигурации.
Пример из приложения, в котором используется один и тот же бинарный файл как для запуска фоновой задачи, так и самого приложения:
#include <RuntimeManager/RuntimeDispatcher>
#include <RuntimeManager/Task>
int main(int argc, char *argv[])
{
auto application = Aurora::Application::application(argc, argv);
RuntimeDispatcher *dispatcher = RuntimeDispatcher::instance();
// Если бинарный файл запустился для фоновой задачи
dispatcher->onTaskStarted(QStringLiteral("PushWorker"), [&application](const QString &taskID) {
QStringList applicationArguments = application->arguments();
// код, который должен исполняться в фоновой задаче
// ...
});
//бинарный файл запустился для приложения
dispatcher->onApplicationStarted([&application]() {
QStringList applicationArguments = application->arguments();
// ...
});
return application->exec();
}
Используется Aurora::PushNotifications::Client — клиента для системы push-уведомлений:
Application::Application(QObject *parent)
: QObject(parent),
m_client(new Aurora::PushNotifications::Client(this))
{
connect(m_client, &Aurora::PushNotifications::Client::registrationId, this, &Application::processRegistrationId);
connect(m_client, &Aurora::PushNotifications::Client::registrationError, this, &Application::processRegistrationError);
connect(m_client, &Aurora::PushNotifications::Client::notifications, this, &Application::processNotifications);
connect(m_client, &Aurora::PushNotifications::Client::clientInactive, this, &Application::handlePushClientInactivity);
connect(m_client, &Aurora::PushNotifications::Client::pushSystemReadinessChanged, this, [this](bool status) {
qDebug() << "Push system is" << (status ? "available" : "not available");
});
}
Примечание. Данный класс Application не связан с пространством имён Aurora::Application
из библиотеки libauroraapp.
Application — это отдельный класс для работы с фоновыми задачами.
Если бинарный файл запускается как фоновая задача:
dispatcher->onTaskStarted(backroundTaskID, [&application](const QString &taskID) {
qDebug() << "Background application task is running taskID=" << taskID;
QStringList applicationArguments = application->arguments();
auto pushExample = new Application(application);
pushExample->startAsTask(applicationArguments);
});
return application->exec();
Приложения, не поддерживающие работу с фоновыми задачами, должны обрабатывать аргументы командной
строки и запускать gui только в случае, если не был указан аргумент /no-gui.
Метод startAsApp(const QStringList &arguments) отправляет сигнал о том, что нужно открыть
графический интерфейс:
dispatcher->onApplicationStarted([&application]() {
QStringList applicationArguments = application->arguments();
// ...
auto pushExample = new Application(application);
pushExample->startAsApp(applicationArguments);
// ...
});