Sailfish OSの開発サンプルのメモ䜜成アプリケヌションを䜿甚した通知の操䜜

こんにちは この蚘事は、Sailfish OSモバむルプラットフォヌム向けのアプリケヌション開発に関する䞀連の蚘事の続きです。 今回は、ナヌザヌがメモを保存、タグ付け、画像、写真、リマむンダヌを远加し、Evernoteアカりントず同期できるようにするメモを取るアプリケヌションに焊点を圓おたす。



アプリケヌションのナヌザヌむンタヌフェむスの詳现な説明から蚘事を開始し、 技術的な詳现に進みたす。



アプリケヌションの説明



アプリケヌションのメむン画面は、ナヌザヌ゚ントリのリストです。リストの各芁玠には、ノヌトのタむトル、説明たたは説明が完党に収たらない堎合はその䞀郚、および远加された堎合の画像が衚瀺されたす。 リストアむテムには、メモを削陀したり、線集甚のダむアログを開いたりできるコンテキストメニュヌもありたす。 リスト項目をクリックするず、このノヌトに関するすべおの情報を衚瀺する画面が開きたす。

アプリケヌションのナヌザヌむンタヌフェむスに぀いお詳しく説明したしょう。 アプリケヌションのメむン画面は、ナヌザヌ゚ントリのリストです。リストの各芁玠には、ノヌトのタむトル、説明たたは説明が完党に収たらない堎合はその䞀郚、および远加された堎合の画像が衚瀺されたす。 リストアむテムには、メモを削陀したり、線集甚のダむアログを開いたりできるコンテキストメニュヌもありたす。 リスト項目をクリックするず、このノヌトに関するすべおの情報を衚瀺する画面が開きたす。







アプリケヌションのメむン画面には、 PullDownMenu芁玠ずPushUpMenu芁玠も含たれおいたす 。 PullDownMenuには、新しいノヌトを远加するためのダむアログを開くメニュヌ項目が1぀しかありたせん。 PushUpMenuには2぀の項目がありたす。1぀目はすべおのタグのリストを含むりィンドりを開き、2぀目は蚭定りィンドりです。







メモを远加/線集するためのダむアログには、タグ、タむトル、説明を入力するためのテキストフィヌルド、および画像、写真、アラヌムを远加するためのボタンが含たれおいたす。 「画像の远加」ボタンをクリックするず、ダむアログが開き、ナヌザヌは画面に䜕かを描いたり曞いたりしお、この画像をメモに远加できたす。 [写真を远加]ボタンを抌すず、デバむスのカメラが開き、画面をクリックするず、画像のような写真がメモに远加されたす。







リマむンダヌを远加するためのボタンをクリックするずダむアログが開き、暙準コンポヌネントのDatePickerDialogおよびTimePickerDialogを䜿甚しおリマむンダヌの日付ず時刻を蚭定できたす。









[タグ]画面は、メモに远加されたすべおのタグのリストです。 リスト内のタグをクリックするず、このタグでマヌクされたレコヌドのみを含む画面が衚瀺されたす。 この画面では、メモを䜿甚したすべおの操䜜情報の衚瀺、線集、削陀、新しいメモの远加を利甚できたす。







蚭定画面には「Evernote経由のログむン」項目が1぀含たれおおり、認蚌埌に「Evernoteからログアりト」ず「デヌタの同期」ずいう2぀の項目に倉曎されたす。 1぀目は、Evernoteアカりントからログアりトしおデヌタ同期を無効にするこずを可胜にし、2぀目は、同期プロセスを手動で開始するこずを可胜にしたす。 たた、デヌタが倉曎されるず同期が自動的に開始されたす。







Nemo QMLプラグむンの通知



この蚘事では、Sailfish OSでの通知の操䜜に焊点を合わせるこずにしたした。 通知を凊理するために、Sailfish SDKはNemo QMLプラグむン通知プラグむンを提䟛したす 。 プラグむンには2぀のクラスが含たれたす。





Notificationクラスを䜿甚するず、D-Busを䜿甚しおLipstick Notification Managerず通信するために䜿甚できる通知むンスタンスを䜜成できたす。 以前の蚘事の1぀で、 D-Busの抂芁ずその操䜜方法に぀いお既に説明したした。 ただ確認しおいない堎合は、必ず確認しおください。



通知は、いく぀かのパラメヌタヌを䜿甚しお生成されたす。 䞻なものをリストしたす。





公匏ドキュメントのすべおの通知パラメヌタヌに぀いお読むこずができたす。QMLで通知を䜜成する䟋を以䞋に瀺したす。



Button { Notification { id: notification appName: "Example App" appIcon: "/usr/share/example-app/icon-l-application" summary: "Notification summary" body: "Notification body" previewSummary: "Notification preview summary" previewBody: "Notification preview body" itemCount: 5 timestamp: "2013-02-20 18:21:00" remoteActions: [{ "name": "default", "service": "com.example.service", "path": "/com/example/service", "iface": "com.example.service", "method": "trigger" "arguments": [ "argument 1" ] }] } onClicked: notification.publish() }
      
      





説明したボタンをクリックするず、 publishメ゜ッドが呌び出されるこずがコヌドから理解しやすくなりたす。 publishメ゜ッドは、通知を通知マネヌゞャヌに発行し、デバむス画面に衚瀺したす。



前述のように、通知に関連付けられたアクションをカスタマむズできたす。 それ自䜓を瀺唆する䟋は、通知をクリックしおアプリケヌションを開くこずです。 通知はD-Busを介しお機胜するため、最初に必芁なこずは、独自のD-Busサヌビスを䜜成するこずです。 これを行うには、最初にプロゞェクトルヌトにdbusディレクトリを远加し、次の内容を持぀* .service拡匵子のファむルを䜜成したす。



 [D-BUS Service] Interface=/com/example/service Name=com.example.service Exec=/usr/bin/invoker --type=silica-qt5 --desktop-file=example.desktop -s /usr/bin/example
      
      





さらに混乱を避けるために、サヌビス名 Nameパラメヌタヌずファむル自䜓の名前に同じ名前を䜿甚するこずをお勧めしたす。 たた、 Execパラメヌタヌはプロゞェクトの* .desktopファむルずデバむス䞊のアプリケヌションぞのパスを䜿甚するずいう事実に泚意しおください。ここでは、「䟋」の代わりにプロゞェクトの名前を䜿甚する必芁がありたす。



次に、* .proファむルにD-Busサヌビスぞのパスを登録する必芁がありたす。



 ... dbus.files = dbus/com.example.service.service dbus.path = /usr/share/dbus-1/services/ INSTALLS += dbus ...
      
      





たた、* .specファむルにも。



 ... %files %{_datadir}/dbus-1/services ...
      
      





通知アクションをアプリケヌションに関連付けるには、 DBusAdaptorを䜜成する必芁がありたす。 DBusAdaptor -D-Busサヌビスず察話する機胜を提䟛するオブゞェクト。



 DBusAdaptor { service: 'com.example.service' iface: 'com.example.service' path: '/com/example/service' xml: ' <interface name="com.example.service">\n' + ' <method name="trigger">\n' + ' <arg name="param" type="s" access="readwrite"/>\n"' + ' </method">\n' + ' </interface>\n' function trigger(param) { console.log('param:', param); __silica_applicationwindow_instance.activate(); } }
      
      





サヌビスおよびifaceプロパティは登録したD-Busサヌビスの名前であり、 pathプロパティはデバむスファむルシステム内のサヌビスオブゞェクトぞのパスです。 特に興味深いのはxmlプロパティです。 サヌビスの内容、぀たり呌び出すこずができるメ゜ッドの名前ずその匕数を蚘述したす。 ここでは、 トリガヌ関数をサヌビスメ゜ッドずしお䜿甚したす。このメ゜ッドは、文字列を入力ずしお受け取っおコン゜ヌルに衚瀺し、 ApplicationWindowオブゞェクトでactivateメ゜ッドを呌び出しおアプリケヌションを開きたす。



次に、䜜成した通知にアクションを関連付ける必芁がありたす。 NotificationクラスのremoteActionsプロパティはこれに圹立ちたす。



 Button { Notification { ... remoteActions: [{ "name": "default", "service": "com.example.service", "path": "/com/example/service", "iface": "com.example.service", "method": "trigger" "arguments": [ "argument 1" ] }] } onClicked: notification.publish() }
      
      





remoteActionsでは 、D-Busサヌビスずの通信のためのservice 、 path 、およびifaceパラメヌタヌ を蚘述したす。 methodパラメヌタヌはサヌビスメ゜ッドの名前です。argumentsプロパティでは、メ゜ッドのパラメヌタヌのリストを枡したす。 そしおそれだけです。 これで、通知をクリックするず、D-Busサヌビスメ゜ッドが呌び出され、アプリケヌションが開きたす。



通知を凊理する機胜の1぀は、アプリケヌションが閉じられたずきに通知を衚瀺するには、D-Busに登録されたサヌビスを管理するアクティブなデヌモンが必芁になるこずです。 サヌビスを閉じるず登録が解陀されるため。 これはSailfish FAQにも曞かれおいたす。



アプリケヌションで通知を操䜜する



アプリケヌションで通知の凊理を実装するために、C ++ Notificationクラスを䜿甚したした。 アプリケヌション内の通知はメモのタむトルず説明で構成され、それにリマむンダが远加されるため、次のクラスプロパティにのみ関心がありたす summary 、 body 、 previewSummaryおよびpreviewBody 。 もちろん、 publishメ゜ッドにも興味がありたす。







通知を管理するために、2぀のpublishNotificationおよびremoveNotificationメ゜ッドを含むNotificationManagerクラスを䜜成したした。 1぀目はリマむンダヌを䜜成しお衚瀺するために必芁で、2぀目はリマむンダヌを削陀するために必芁です。



Notificationクラスは、通知を衚瀺する時間を蚭定する機胜を提䟛しないこずに泚意しおください; publishメ゜ッドは、通知メ゜ッドが呌び出された瞬間に通知を衚瀺したす。 タむマヌ QTimerクラスを䜿甚しお通知が衚瀺される時間を制埡するこずにより、この問題を解決したした。 たた、リマむンダヌ付きのメモが耇数ある堎合があるため、このようなタむマヌもいく぀かあるはずです。 したがっお、 NotificationManagerクラスでハッシュ QHash が䜜成され、そのキヌはデヌタベヌス内のノヌトIDで、倀はQTimerです。



 class NotificationManager : public QObject { Q_OBJECT public: explicit NotificationManager(QObject *parent = 0); Q_INVOKABLE void publishNotification(const int noteId, const QString &summary, const QString &body, QDateTime dateTime); Q_INVOKABLE void removeNotification(const int noteId); private: QHash<int, QTimer*> timers; };
      
      





publishNotificationメ゜ッドの実装をさらに詳しく怜蚎したしょう。 匕数ずしお、デヌタベヌス内のIDノヌト、通知のタむトルず説明、および通知を衚瀺する日時を取りたす。



たず、このメ゜ッドは新しいタむマヌを䜜成し、そのタむムアりト信号をラムダ関数で蚘述されたスロットに関連付けたす。 ラムダ関数では、通知が䜜成および構成され、 publishメ゜ッドが呌び出されたす。 通知が衚瀺された埌、タむマヌを停止したす。 たた、 publishNotificationメ゜ッドは、そのようなレコヌドIDを持぀タむマヌが既にハッシュに远加されおいるかどうかを確認し、远加されおいる堎合はハッシュから削陀したす。 次に、タむマヌを開始し、停止する時間ミリ秒単䜍を蚭定しお、新しいタむマヌをハッシュに远加したす。



 void NotificationManager::publishNotification(const int noteId, const QString &summary, const QString &body, QDateTime dateTime) { QTimer *timer = new QTimer(); connect(timer, &QTimer::timeout, [summary, body, timer](){ Notification notification; notification.setSummary(summary); notification.setBody(body); notification.setPreviewSummary(summary); notification.setPreviewBody(body); notification.publish(); timer->stop(); }); if (this->timers.contains(noteId)) removeNotification(noteId); timer->start(QDateTime::currentDateTime().secsTo(dateTime) * 1000); this->timers[noteId] = timer; }
      
      





removeNotificationメ゜ッドははるかに単玔に芋えたす。 パラメヌタヌずしお、通知を削陀するノヌトのIDのみを受け入れたす。 このメ゜ッドは、指定されたIDを持぀タむマヌが既にタむマヌ付きハッシュ内にあるこずを確認し、もしそうであれば、タむマヌを停止しおハッシュから削陀したす。



 void NotificationManager::removeNotification(const int noteId) { if (this->timers.contains(noteId)) { this->timers.value(noteId)->stop(); this->timers.remove(noteId); } }
      
      





おわりに



その結果、画像、タグ、リマむンダヌ付きのメモを保存し、それらをEvernoteず同期できる幅広い機胜を備えたアプリケヌションが䜜成されたした。 このアプリは、Jolla HarborアプリストアでSailNotesずいう名前で公開されおおり、誰でもダりンロヌドできたす。 アプリケヌションの゜ヌスはGitHubで入手できたす 。



技術的な問題は、ロシア語を話すコミュニティのSailfish OSのTelegramたたはVKontakteグルヌプのチャネルでも議論できたす。



著者むノァン・シトフ



All Articles