ガジェット通信Androidアプリの作り方 第3回:ガジェ通アプリの開発

写真拡大




ガジェット通信の最新記事を読めるAndroidアプリ『ガジェット通信 Getnews Reader』を開発いただいた、アンドロイド記者のnayutanoutyuさん連載第3回。「Androidアプリってどうやって作るの?」「これからAndroidアプリを開発してみたい!」という読者に向けて、nayutanoutyuさんにアプリ開発の一連の流れを全4回の記事で解説いただきます。今回は、いよいよガジェ通アプリの具体的な機能の実装について見ていきましょう。

第1回:開発環境のセットアップ
http://getnews.jp/archives/132193

第2回:「Hello World」とAndroidアプリ開発の基本
http://getnews.jp/archives/132376

■第3回:ガジェ通アプリの開発

ガジェ通アプリ『ガジェット通信 Getnews Reader』は、ガジェット通信で配信されている記事をAndroid端末上で閲覧するためのニュースアプリです。アプリ起動時に自動的に記事を取得して、一覧を表示してくれます。もし、ネットワークの問題で記事の取得ができなかった場合は、メニューの「更新」をタッチすることで記事の再取得ができます。記事の詳細画面では、メニューから簡単に記事の共有を行うための機能があります。お気に入りの『Twitter』クライアントや、メールクライアント、『Facebook』アプリを利用して、知人に記事を知らせることが手軽にできます。また、パソコン向けウェブサイトの画面で記事を読みたいなら、お気に入りのウェブブラウザで開くこともできます。

取得された記事は端末内に保持されます。そのため、ネットワークにつながらない場所に端末があっても、記事を読むことができます。ただし、キャッシュに保持されていない画像などは表示されません。地下鉄に乗る前に記事の取得を行い、後で記事を読むこともできます。

前回はAndroidアプリ開発の方法について「Hello World」アプリ作成を交えてご説明させていただきました。今回は、上述の機能がどのように実現されているかについてご説明したいと思います。

●Android アプリの構成要素
Androidアプリには、重要な4種類の構成要素(コンポーネント)があります。

・アクティビティ
・サービス
・コンテンツプロバイダー
・ブロードキャストレシーバー

これらは、アプリ一つに対して一つ、または複数含めることができます。つまり、それぞれ排他的なものではなく、各構成要素が連携して、一つのアプリを形作ることができます。

先に、アクティビティ以外の3種類の要素について簡単に説明します。サービスは、アプリがバックグランドで動作することが想定される場合に利用される要素です。コンテンツプロバイダーは、別のアプリケーションに何かデータを渡す場合に利用される要素です。ブロードキャストレシーバーは、システムやアプリが提供する、何かの状態変化を意味するデータ(例えば、電池の残量変化)を受け取るための要素です。

アクティビティは、アプリのインタフェースを表示するための要素です。恐らく、Androidアプリを開発する場合、大抵この要素が利用されると思います。ガジェ通アプリでは、この要素のみ利用して作成されました。最新記事をバックグランドで自動的に取得したりする機能などは必要なかったので、他の要素は必要になりませんでした。

詳細は『Android Developers』をご参照下さい。

Android Developers
http://developer.android.com/sdk/index.html

●ガジェ通アプリの構成要素
先ほどは、Androidの構成要素について説明しました。今度は、ガジェ通アプリの構成要素についてご説明します。これは、Android固有の概念のお話ではなく、このアプリ固有のお話です。

ガジェ通アプリは、アクティビティを中心に複数の要素から成り立っています。この複数の要素を厳密な言葉で表現すると複数の“パブリッククラス”になります。後述の説明では、要素と呼ばずクラスとしてご説明します。

1. メインクラス
このクラスは、アプリの中心になるもので、アクティビティでもあります。このクラスで、記事の一覧を表示したり、ほかのクラスを利用して色々な処理を行います。


2. 記事表示クラス
記事表示クラス
このクラスは、記事の詳細を表示するものです。これもアクティビティです。ガジェ通アプリは、リモートに存在する RSSフィードを取得して、フィードに含まれる記事の詳細を表示しています。記事の詳細は、htmlで構成されているので、WebViewウィジェットと呼ばれる Androidインタフェースの部品を利用してhtml文書を表示しています。

3. RSSフィード取得と解析クラス
このクラスは、RSSフィードをダウンロードし、さらに解析を行い、解析結果をデータベースに保存します。RSSフィードはXML文書の一種です。なので、Androidが用意しているXML解析用クラスを利用することで複雑な文字列処理なしに、解析を行うことができます。

RSSフィードは、RSS 0.92フォーマットになっており、記事一つ一つは、item要素に格納されています。解析は、item要素に含まれるtitle, description, pubdate, linkを取得するために必要になります。解析されたデータは、データベースに保存されます。

4. データ格納クラス
解析して得られたデータはデータベースに直接格納せずに、ある種の入れ物に一度保存されます。この入れ物もクラスとして作成されています。データの受け渡しは、データを意味のある形で一つにまとめてから行うと処理がしやすくなります。そのため、このクラスが必要になります。

●インテント
インテントを利用した機能
インテントとは聞きなれない単語ですが、これも、Androidアプリでは重要な概念です。インテントは、上述の4種類のコンポーネントを活性化させるために必要だったり、別のコンポーネント活性化時に何らかのデータを事前に渡すために利用されるものです。

ガジェ通アプリを例に説明しますと、メインクラスから記事表示クラスを起動するためにインテントが使用されています。メインクラスで記事一覧が表示されていますが、記事をタッチすると次の画面でその詳細が表示されます。これは、インテントの働きによるものです。

記事の詳細画面でメニューボタンを押下すると、オプションメニューが表示されます。「記事を共有する」は、Android端末にインストール済みのメッセージ系アプリを利用して、他者に記事タイトルと URLを知らせる(共有)機能です。「記事をブラウザで開く」は、記事をAndroid端末にインストール済みのウェブブラウザで開くための機能です。これらの機能も実は、インテントの働きにより実現されています。

インテントの利用は簡単です。ソースコードにインテントオブジェクトを生成する命令を記述し、アクティビティコンポーネントのメソッドを呼ぶだけです。もし、渡したいデータがあるならば、インテントオブジェクトにデータを渡す処理を2、3行追加するだけです。文章だけでは分かり辛いと思いますので、以下にソースコードの例を記載します。


// インテントオブジェクトを生成する
Intent intent = new Intent(android.content.Intent.ACTION_SEND);

// メッセージ系アプリにデータを渡すため、インテントの設定を行う。
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, "タイトル");
intent.putExtra(Intent.EXTRA_TEXT, "本文");

// インテントを送る
startActivity(intent);


* * * * *
Androidアプリを開発する場合には、4種類の構成要素についてあらかじめ理解しておくことが重要かと思いますが、アクティビティだけでも知っておけば、アプリは開発できることがご理解いただけたと思います。また、各コンポーネント、または、各アプリがインテントによって、連携して動作することがお分かりいただけたと思います。次回は、アプリをGoogleの『Android マーケット』に公開する方法を説明します。

※この記事は、アンドロイド記者nayutanoutyuさんの寄稿です。

Androidアプリ『ガジェット通信 Getnews Reader』についてはこちら

ガジェット通信がAndroidスマートフォンで読めるアプリになりました
http://getnews.jp/archives/131345

ガジェット通信 Getnews Reader(Androidマーケット)
https://market.android.com/details?id=jp.getnews.rssreader

■関連記事
27時間テレビでバスケボールをぶつけ岡村イジメ? YouTubeコメントが炎上中
世界美食ランキング50に韓国料理が1個も挙がらず…韓国ネット上はなぜか日本を非難
平野綾のニャンニャン流出画像が本物だった? バックバンドの相手男性がTwitter削除で逃亡!
【ピポトレ】たった2分で腰痛を解消 強くしなやかな腰を作るトレーニング
2011年上半期最も売れたハードは『ニンテンドー3DS』だった! 不調じゃなかったの?