Итак, по ходу разработки приложений в sailfish необходимо достаточно часто вызывать уведомления. Мне помогли реализовать данный функционал, а я расскажу Вам. Итак...что должно получиться в итоге:
Если кратко то техзадание такое:
1 - Программа должна при нажатии на какую то кнопку высылать уведомления
2 - При нажатии на уведомление должно открываться окно
Итак приступим.
Открываем Sailfush OS SDK создаём простое приложение. Назовём его SimpleNotify. Да очень оригинально.
Так как уведомления работают через DBUS (подробнее об этом
тут) то в первую очередь импортируем поддержку dbus
Код QML:import org.nemomobile.dbus 2.0
Пишем обработчик
Создаём DBusAdaptor который будет связывать действия с уведомлениями с нашим приложением
Код QML: DBusAdaptor{
id: dbus
service: "ru.omprussia.notify"
iface: "ru.omprussia.notify"
path: "/ru/omprussia/notify"
xml: ' <interface name="com.omprussia.notify">' +
' <method name="activateApp">' +
' <arg name="message" type="s" direction="in"/>' +
' </method>' +
' </interface>'
function activateApp(message)
{
app.label = message
app.activate();
}
}
Разберём подробнее что мы тут натворили. Если с id всё понятно то service/iface/path это жуткие пути из DBus. Они должны быть уникальными для каждого приложения. Если не так, то поправьте меня.
Дальше идёт xml - описание содержимого необходимого для dbus.
особенно обратите внимание на параметры метода и аргумента - их может быть несколько для одного приложения. Для примера: если мы хотим показывать уведомления отдельно для лайков и комментариев то необходимо создать несколько методов с различным действием. С аргументами так же, имя тип и направление может быть различным. На данном этапе нам будет достаточно тип - строка (type="s") и направление в функцию (direction="in").
Функция внутри DBusAdaptor и есть обработчик метода. Всего лишь мы присваиваем заголовку сообщение из интерфейса, которое мы передадим чуть позже.
Кстати: Необходимо добавить id к ApplicationWindow и добавить параметр к нему. Итоговый SimpleNotify будет выглядеть так:
Код QML:import QtQuick 2.0
import Sailfish.Silica 1.0
import org.nemomobile.dbus 2.0
import "pages"
{
id: app
cover: Qt.
resolvedUrl("cover/CoverPage.qml") allowedOrientations: Orientation.All
_defaultPageOrientations: Orientation.All
property string label: qsTr("Hello Sailors")
DBusAdaptor{
id: dbus
service: "ru.omprussia.notify"
iface: "ru.omprussia.notify"
path: "/ru/omprussia/notify"
xml: ' <interface name="ru.omprussia.notify">' +
' <method name="activateApp">' +
' <arg name="message" type="s" direction="in"/>' +
' </method>' +
' </interface>'
function activateApp(message)
{
app.label = message
app.activate();
}
}
}
Приводим код в порядок
Далее чуть поправим pages/FirstPage.qml для того чтобы корректно отображался наш app.label . Находим в нём Label и приводим к следующему виду:
Код QML: x: Theme.paddingLarge
text: app.label
color: Theme.secondaryHighlightColor
font.pixelSize: Theme.fontSizeExtraLarge
}
суть этой правки достаточно проста: текст берём из параметра app.label который мы добавили выше.
А теперь самая магия
Нам необходимо вызвать само уведомление. Будем его вызывать из обложки - так что открываем cover/CoverPage.qml и в первую очередь добавляем поддержку самих уведомлений:
Код QML:import org.nemomobile.notifications 1.0
Далее создаём уведомления:
Код QML:Notification{
id: simpleNotify
category: "x-nemo.example"
summary: ""
body: ""
itemCount: 1
remoteActions: [ {
"name": "default",
"service": "ru.omprussia.notify",
"path": "/ru/omprussia/notify",
"iface": "ru.omprussia.notify",
"method": "activateApp",
"arguments": [ "Hello OMP! You have notify" ]
}]
}
Имя, достаточно понятная переменная, сервис путь и интерфейс мы берём из написанного выше DBusAdaptor метод - тоже я думаю понятен - тот который мы объявляли там же. Аргументы - те данные которые получит функция.
Осталось только вызывать само уведомление. Задействуем CoverAction. Добавим немного кода:
Код QML:onTriggered: {
simpleNotify.summary = "Hello OMP! You have notify"
simpleNotify.publish()
}
summary это тот текст который увидит пользователь. Ну и конечно же publish достаточно понятная функция - получим наше опубликованное уведомление при нажатии на которое откроется приложение.
Ну и где доказательства про 18 запусков у маска в 2018 году? Или ты предпочтешь и тут...