SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

Androidのホーム画面用App Widgetを作成する

従来のモバイルアプリの枠を超えるAndroidアプリ機能を実現

ダウンロード サンプルコード (99.0 KB)

更新スケジュールの実装

 前述したように、AppWidgetProviderInfoクラス内の設定値はイミュータブルです。updateTimeMillisの値はこのクラス内にあるため、この値セットを持つAppWidgetProviderInfoを使って作成されたApp Widgetインスタンスは、指定の頻度で更新されますが、その頻度を変更することはできません。今回のアプリケーションでは、それぞれのApp Widgetインスタンス内で画像が表示される頻度をユーザーに設定させるため、この機能を独自に実装する必要があります。

 AlarmManagerクラスは、この目的に使用できる非常に論理的な更新メカニズムで、繰り返し通知をサポートしています。この通知は単純なPendingIntentオブジェクトのトリガーによって実現されます。

 では、具体的にどのようにしたらよいのでしょうか。まず思いつくのはこんな方法でしょう。まず単純にAppWidgetManager.ACTION_APPWIDGET_UPDATEというaction値を持つIntentオブジェクトを作成し、extras値を特定のApp Widget IDに設定し、その後、AlarmManagerのsetRepeating()メソッドを呼び出して、更新を繰り返し行うようスケジュール設定するという方法です。しかし残念ながら、それではうまくいきません。Androidシステムはaction値とscheme値の両方が一致するIntentを再利用する仕組みになっており、「extras」の値は比較されません。これはつまり、それぞれのApp Widget IDに対応するIntentは実際には同じIntentであるという意味です。幸い、この問題は簡単に解決できます。App Widgetのscheme値を定義し、これを使用して一意のIntentインスタンスを定義すればよいのです。これを実現するコード例を次に示します。

Intent widgetUpdate = new Intent();
widgetUpdate.setAction(
   AppWidgetManager.ACTION_APPWIDGET_UPDATE);
widgetUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, 
   new int[] { appWidgetId });
// make this pending intent unique
widgetUpdate.setData(
   Uri.withAppendedPath(Uri.parse(
   ImagesWidgetProvider.URI_SCHEME + "://widget/id/"), 
   String.valueOf(appWidgetId)));
PendingIntent newPending = PendingIntent.getBroadcast(
    getApplicationContext(), 0, widgetUpdate, 
    PendingIntent.FLAG_UPDATE_CURRENT);
// now schedule it
AlarmManager alarms = (AlarmManager) getApplicationContext().
   getSystemService(Context.ALARM_SERVICE);
alarms.setRepeating(AlarmManager.ELAPSED_REALTIME, 
   SystemClock.elapsedRealtime(), updateRateSeconds * 1000, 
   newPending);

 この記述はImagesWidgetConfiguration Activityの実装コードに含まれています。マニフェストファイルには、この特定のscheme値を扱うための<receiver>ブロックが示されています。これに加えて、AppWidgetProviderインターフェースのonDeleted()メソッド内で繰り返し通知を停止する必要があるでしょう。また、携帯電話を再起動したときに更新スケジュールも同様に再開する必要があります。

 これに対する簡単なソリューションは、AppWidgetProviderのonReceive()メソッド内で、あるロジックを直接利用することです。まず、更新アクションかどうかをチェックします。更新の場合は、scheme値が含まれていないことを確認します。含まれていない場合は、AlarmManagerにスケジュール設定されているPendingIntentは、このアクションを起動しません。その場合は、各App Widget IDに対してプリファレンス値が設定されているかどうかを調べます。プリファレンス値が設定されていない場合は、この更新アクションはApp Widgetが設定される前に受信されたことが分かります。一方、プリファレンス値が設定されている場合は、PendingIntentをスケジュール設定できることが分かります。繰り返しになりますが、このロジック全体はonReceive()メソッド内で実装されています。

 図2に表すように、このスキーマを使用すると、同じ種類のApp Widgetsを複数同時に表示できます。更新頻度はさまざまに設定でき、それぞれに表示される画像は、用意された一連の画像ファイルの中からランダムに選ばれます。

図2 複数のWidgetインスタンス: この図は、同時に起動する2つの異なる最終的なApp Widgetのインスタンスを表す
図2 複数のWidgetインスタンス: この図は、同時に起動する2つの異なる最終的なApp Widgetのインスタンスを表す

 この記事では、Androidのプラットフォーム上で基本的なApp Widgetを作成する方法について解説してきました。ホーム画面に表示されるこのApp Widgetの各インスタンスは、それぞれユーザーが設定したスケジュールで個別に動作しますが、この機能はApp Widgetフレームワークから直接利用できるものではありません。今後の記事では、App Widgetの機能を拡張し、インターネットからダウンロードした画像を使用できるようにする方法や、画面上のインターフェースを使用して画像表示を直接制御できるようにする方法について解説していきたいと思います。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Shane Conder(Shane Conder)

 モバイル技術やウェブ技術を得意とするソフトウェア開発者(現在は小さなモバイルソフトウェア会社に勤務)。先日、Androidプログラミングに関する詳しい解説書『Android Wireless Application Development』を、同じく開発者であるLauren Darceyと共同執筆...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Lauren Darcey(Lauren Darcey)

 ソフトウェア制作の分野で約20年の経験を持ち、商用モバイルアプリケーションの開発を専門とする開発者。先日、Androidプログラミングに関する詳しい解説書『Android Wireless Application Development』を、同じく開発者であるShane Conderと共同執筆し、...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4407 2009/10/05 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー