Yutaro

2015.12.14

Parse.comを使って、Androidメッセンジャーアプリっぽいことをしてみる

この記事は今流行りのAdventCalendarとは、関係ありません。
諸事情あり、このタイミングでの公開となりました。

  4月よりアライドアーキテクツ (以下、弊社) で新卒エンジニアとして従事しております、ゆーたろーと申します:) 大学時代はプログラムとはほぼ無縁の研究をしていました。ネズミの解剖をしていました。ディズニーシーが好きです。

前提

  • 弊社2015年度新卒開発研修は3人1チームで行うAndroidアプリ開発 (詳細は他の新卒の記事に上がっているかもしれません。)
  • 我々Bチームはメッセンジャーアプリに挑戦
  • サーバーサイドで便利なParse.comを紹介してもらい導入
  • ネイティブアプリなんだしPush通知は使っときたいよね (結果、サーバーサイドも割りかし実装するはめに)
  • Parse.com Android_SDK_1.9.2を使用
  • 研修アプリに準拠しているため、スタンダードと齟齬のある可能性大いにあり

ということで、今回はメッセンジャーアプリでよくある

①友達からのメッセージがPush通知でお知らせされる
②Pushから受け取ったデータを自動的にviewに追加する

という2点について実装したいと思います。

今回やってみること

やることはざっくり以下4点

  • Parse.comからPush通知を受け取るための準備
  • ParseCloudCodeでPushを投げる
  • ParsePushBroadcastReceiverを継承したReceiverの実装
  • 表示用のActivityとListViewAdapterの実装

準備

①Parse.comからテスト用Push通知を受け取れるようにする

  まずはParse.comへのアプリの登録からPush通知を受け取れるところまでの準備をしてください。基本的に公式のTutorialに則って行けると思います。
これでParse.comからPush通知を受け取れるようになったはず。

②ParseCloudCodeの準備

   Parse.comを使うのなら、サーバーサイドの実装なんて考えなくてもいい気もしますが、そうも言ってられないのでCloudCodeを実装するための準備をします。これも公式QuickStart参照
Mac/Linux or Window
CloudCodeの実装はJavaScriptです。 (自分は初めて書きました。)

③Messageテーブルを作成

   Parse.comにはDBも付属していますので、これを使います。Parse.comではテーブルのことをクラスと呼んでいますが、わかりづらいのでテーブルで進めます。ユーザーの登録等に関しては割愛します。

今回はMessageテーブルを作り、「username」と「body」のカラムをString型で追加しました。
MessageTable

Pushを投げるParseColudCodeの実装


  やっと本題な気がします。まずはMessageテーブルに保存された情報を元に、AndroidにPush通知を投げるためのサーバー側の実装です。トリガFunctionのafterSave()を使いました。この関数はオブジェクトがMessageテーブルに保存される度に呼び出されます。

main.js

useMasterKey()についてはこちら、トリガFunctionについてはこちら

完成したらdeployしましょう。
ここまでで「①友達からのメッセージがPush通知でお知らせされる」のためにやることは完了です。

ParsePushBroadcastReceiverを継承したReceiverの実装


  次は「②Pushから受け取ったデータを自動的にviewに追加する」を実装していきます。まずAndroid側でParsePushBroadcastReceiverを継承したReceiverを実装します。Push通知を受け取ってのもろもろはこのクラスが処理を行います。

CustomReceiver.java

jsonデータの受け取りに関しては、こちらを参考にしました。


  別途Messageクラスを作り、CustomReceiverで受け取ったJsonObjectをList<Message>としてAdapterに渡しています。

Message.java


  また、Activityの判別をするためにEventBusを使用しました。

CustomEvent.java

EventBusは今回実装にはあまり関与していませんが、Push通知を開いた時など複数のイベントにActionをつけたり、非同期処理の結果を用いて次の処理を行ったりするとなると必要かと思います。

表示用のActivityとカスタムListView用のAdapter


  最後に受け取ったメッセージを表示するActivityとAdapterを用意してください。ListViewを想定しています。自分はListViewViewHolderで勉強しました。

CustomListItemAdapter.java


MainActivity.java

   MainActivityを開いている時にPushが来ると、addMessage関数でListViewに追加していくといった具合です。

メッセージを送ってみる


  これでメッセージの受信は完璧です。しかし、今回はメッセージの送信 (Messageテーブルへの保存) は実装していません。おとなしくAPIを叩いてMessageテーブルに保存します。

こんな感じにできれば完成

TestApp

まとめ

  今回は通知を受け取った時の処理についてまとめました。LINEなどのメッセンジャーアプリの内部がどうなってるのかはわかりませんが、websocketでサーバーサイドを実装しなくても、Pushをトリガーに (見た目上は) リアルタイム更新っぽいことができます。
ちなみに

  • 通知を受け取った時  :onPushReceive
  • 通知を開いた時    :onPushOpen
  • 通知を解放した時   :onPushDismiss
  • 通知自体のカスタマイズ:getNotification

をオーバーライドすれば、それぞれのイベントに対しても処理を追加できます。

注意点としてReceiverの中で重い処理はできないようです。
非同期処理をしようとするとフリーズして落ちます。
onPushReceiveやonPushOpenで新しいActivityをスタートさせるのが、正しい使い方のような気がします。新しいActivityをスタートさせる方法についてはこちらが参考になります。

  今回のソースコードはGitHubに上げたので、参考にしていただければ幸いです!!!

おわりに

  初ブログは研修で行ったAndroidについてでしたが、配属後はiOSアプリ開発に携わることになりました 携わっています。業務ではObjective-Cですが、SwiftもOSS化したタイミングなので、こっちも触っていきたいですね!

  今回の記事についてのご指摘やご質問等ありましたら@yutailang0119までお願い致します:)

Yutaro

2015年新卒入社のひよっこエンジニア。 図らずも新規事業チームでiOSアプリ開発を担当することに。Pythonにも興味を示しています。 ひよっこなりに、身に付けた成果を発信して行ければと思います。

RELATION ENTRY

Yutaroの記事一覧へ

▶︎