†この章では簡易RSSリーダーにアプリケーションウィジェットを追加します。アプリケーションウィジェットとは、Androidのホーム画面に設置可能なアプリケーションコンポーネントの一つです。図6-1が今回作成するウィジェットのイメージで、サービスがバックグラウンドで取得したRSSフィードのリストから、3つのチャネルから最新フィードの記事タイトルを表示するというものです。5で拡張した簡易RSSリーダーをベースに修正を加えていきます。†まずはサービスが発行するブロードキャストにウィジェットが表示するための情報を追加します。FeedService.javaを開いて、runメソッドをリスト6-1のように修正します。bcastを生成したあと、フィードのリストを走査して各チャネルの最初の記事タイトルを取得し、「Title0〜2」というキーでインテントの拡張データとして設定しています。これにより、ブロードキャストを受け取ったレシーバは同キーを使用してフィードのタイトルを取得することが出来るようになります。最初にアプリケーションウィジェットで使用するレイアウトを作成します。widget.xmlというレイアウトファイルを生成し、リスト6-2のように修正して下さい。/></LinearLayout>LinearLayoutにWidgetLayoutというIDを付け、textView1、textView2、textView3という3つのTextViewを縦に配置し、背景を白、文字色を黒に設定しています。次にアプリケーションウィジェットを公開する際に必要となるXMLファイルを作成します。このファイルにはアプリケーションウィジェットの機能を提供するAppWidgetProviderクラスのメタデータ(AppWidgetProviderInfo)が含まれます。Other...」を選択します。File」を選択して「Next」ボタンをクリックして下さい。Provider」に変更し、Fileに「widget.xml」と入力して「Finish」ボタンをクリックします。widget.xml(レイアウトファイルと同名にしていますが別ファイルとなります)が作成されます。図6-2作成されたファイルに修正を加え、リスト6-2のように変更して下さい。></appwidget-provider>android:initialLayoutには先程作成したレイアウトをリソースIDで指定しています。android:minHeightとandroid:minWidthでこのウィジェットがホーム画面上に配置する際の最小サイズを指定します。ホーム画面の設置スペースとウィジェットのサイズはグリッドと呼ばれる単位で管理され、設置可能なグリッドの数はデバイスにより異なります。nとした以下の計算式で概算することが出来ます。(dip)今回作成するウィジェットは横4x縦1セルのグリッドを使用するため、minHeightは40dip、minWidthは250dipを指定しています。android:updatePeriodMillisは定期的に更新が必要なウィジェットについて、何ミリ秒間隔で更新処理(onUpdate)を呼び出して欲しいかを指定する属性で、0を指定した場合は起動時の一回のみ更新処理が呼び出されます。今回のウィジェットはサービスからブロードキャストを受信したタイミングで更新を行うため0に設定しています。†android.appwidget.AppWidgetProviderをベースクラスとしたRSSReaderWidgetを生成し、onReceivedメソッドを実装します(リスト6-3)。}アプリケーションウィジェットの情報を取得・更新するため、最初にAppWidgetManagerのインスタンスを取得しています。続いて別プロセスにあるViewを操作するためのRemoteViewsを、今回作成するウィジェットのレイアウトリソースwidgetを指定して生成しています。続く三行では簡易RSSリーダーのメインアクティビティであるRSSReaderActivityの呼び出しを行うインテントをもとにPendingIntentを生成、ウィジェットのトップビューであるWidgetLayoutのonClick時に発行されるインテントとして登録しています。これにより、ウィジェットをタップすることでメインアクティビティを表示することが出来るようになります。forループにより、サービスがインテントの拡張データとして設定したRSS記事タイトルを取得し、RemoteViewsのsetTextViewTextでウィジェットの各テキストビューに設定しています。最後にRSSReaderWidgetのコンポーネントネームを生成して、RemoteViewsに設定した変更をウィジェットに反映するためAppWidgetManagerに更新の依頼を行います。作成したウィジェットを公開するため、RSSReaderのマニフェストファイル(AndroidManifest.xml)を開いて、application要素の子要素としてウィジェットの情報を追加します(リスト6-4)。</receiver>インテントフィルタのうち、android.appwidget.action.APPWIDGET_UPDATEはウィジェットの更新処理(onUpdate)を受け取るために必要です。com.beatcraft.rssreader.BROADCAST_MSGを追加しています。メインアクティビティとサービスで定義した定数BROADCAST_MSGと同じ物が指定されていることに注目して下さい。最後にmeta-data要素として、先程作成したAppWidgetProviderのメタデータファイルwidget.xmlを指定しています。以上で全ての実装は完了です。ホーム画面に作成したウィジェットを貼り付け、動作を確認してみて下さい。