降りつぶし.net~同期するWebアプリ・スマホアプリの開発・運用~

第6回(最終回) Android用アプリケーション「降りつぶしroid」の開発

この記事を読むのに必要な時間:およそ 7 分

全事業者画面・事業者画面・路線画面・駅一覧画面

ナビゲーションドロワーの「全事業者」を選択すると開く画面です。リストビューによる一覧表示で,Webアプリと全く同じ遷移第3回参照)を行います。各項目の表示順もWebアプリと完全に同一です。

図6 全事業者画面・事業者画面・路線画面・駅一覧画面

図6 全事業者画面・事業者画面・路線画面・駅一覧画面

この画面のレイアウトは,一覧表示系のすべての画面で共通です。共通のフラグメントをベースクラスとして実装しています。

リストビューの項目の表示および操作は,i降りつぶしとまったく同じです第5回参照⁠⁠。

全都道府県画面・読み画面・乗下車年月別画面

図7 全都道府県画面・読み画面・乗下車年月別画面

図7 全都道府県画面・読み画面・乗下車年月別画面

これらは,表示は前述の事業者画面などと同じ,また機能は同名のi降りつぶしの各画面とまったく同じであり第5回参照⁠⁠,画面のみの紹介とします。

ただし,第5回で触れた,⁠読みが『つ』の駅の統計表示がおかしくなる」というi降りつぶしの不具合は,降りつぶしroidにははじめから存在しません。

同じSQLiteデータベースを使っていても,すなわち同じSQL文を実行しているはずでも,結局アクセス部分の実装が言語からして異なるため,こういう問題も発生してしまいます(と居直り⁠⁠。

同期画面

第4回で解説した,本ソリューション最大のキモである同期機能を,実際に実行する画面です。

ナビゲーションドロワーからの遷移だけでなく,アクションバーに同期アイコンがあり,そのタップで直接この画面に入ることもできます。

図8 初期の同期画面

図8 初期の同期画面

初期の画面は,i降りつぶしのものとは若干異なっています。

同期画面を表示すると,より正確には「同期画面フラグメントが生成された直後に⁠⁠,バックグラウンドで降りつぶし.netへの照会を実行し,ログインユーザ名を取得します。

既にログイン済だった場合はログインユーザ名が表示され,その右のボタンはログアウトボタンとして機能します。ログインしていなかった場合は「ログインしていません」と表示され,右のボタンはログインボタンとして機能します。通信エラーの場合はその旨が表示され,右のボタンは再ロードボタンとなります。

図9 Webアプリ・Twitterからの認証画面

図9 Webアプリ・Twitterからの認証画面

ログインしていない状態でログインボタンをタップすると,ログインのための遷移となります。

これは,i降りつぶしと同様に,降りつぶし.netやTwitter OAuth認証のHTMLを,ウェブビューで表示しています。内部の実装の詳細も含めて,第5回3ページで解説したものと同じです。

加えて認証画面をキャンセルしたくなった場合,Androidの特徴の1つであるバックキーを押せば,初期画面に戻ることができます。

図10 同期実行中の画面

図10 同期実行中の画面

ログインしていると初期画面の「同期を開始する」ボタンがタップ可能となり,実際にタップすると同期が実行されます。

i降りつぶしでは同期の実行(もちろん,http通信を伴います)は,同期画面自身がワーカスレッド(厳密にはGCD)を立ててその中で実行しています。そして同期画面から離れたり,ホームボタンが押されてアプリがバックグラウンド化したりした場合,同期処理を中断します。

一方Androidには,正式にバックグラウンドで処理を実行するための仕組みとしてサービスがあります。同期機能はサービスとして実行されます。

後述するとおり,データベースアクセス自体もサービスが行わなければならないため,実際には「DBアクセス・同期の実行」をまとめ,1つのサービスとして実装しています。

同期画面はサービスを実行し,画面内のUIを操作不能とし(プログレスバー(という名前なんです,くるくる回るアイコンが!)つきの半透明なビューをかぶせています⁠⁠,後は何もしません。

フォアグラウンドサービスとして実行される同期は,その進行状態を自アプリの画面ではなく,ステータスバーに直接表示します。また,画面を切り替えても同期の実行は中断しません。

お知らせ画面・設定画面

降りつぶしroidにはあと2つの画面があります。

これらの画面にも,ナビゲーションドロワーからだけでなく,アクションバーのアイコンのタップでも遷移できます。

図11 お知らせ画面・設定画面

図11 お知らせ画面・設定画面

いずれもi降りつぶしと完全に同じ内容です第5回4ページ⁠。しかし内部の実装はいろいろ異なります。

まずお知らせ画面ですが,これは単に降りつぶし.netの特定のURLをリクエストし,その内容第3回参照。ただし現在の表示内容はまったく異なっており,Twtter APIで自サーバに取り込んだタイムラインを独自のHTMLで出力)を表示しているだけだ,という点はi降りつぶしの同画面と同じです。しかし,Androidには後述するフラグメントライフサイクル問題があり,そのままですと画面が再生成されるたびに,さほど更新されないお知らせの内容をサーバにリクエストしてしまうことになります。

そのため,最新の降りつぶしroidではこの画面も「インスタンス保持」に設定し,インスタンス作成時に非同期通信でHTMLを取得して内部に保持してしまい,画面再生成時にはその取得したHTMLをウェブビューに直接流し込むことで表示させています。

もう1つの設定画面は,本来ならば設定画面の構造をXMLで記述するだけで済み,コードをほとんど書かなくてよいのです。旧版の降りつぶしroidでは,設定画面用のアクティビティクラスを使い,お手軽に実現していました。

しかし,フラグメントなど最新の機能を古いAndroidで実行するためのサポートライブラリには,現在のところ設定画面用のフラグメントクラスが移植されていません。

そのため,最新の設定画面フラグメントのソースコードをコピペして,若干手直しをして使っています。

著者プロフィール

よねざわいずみ

合資会社ダブルエスエフ代表社員。学習塾講師やら芸能ライターやら劇団主宰やらいろいろ経て現在はよろず請負プログラマ。最近の開発はPHP,JavaScript,Java,MTプラグインなど。お仕事随時募集中。

Twitter:@yonezawaizumi

鉄道旅行ブログ:http://feelfine.blog.izumichan.com/