SHOEISHA iD

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

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

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

japan.internet.com翻訳記事

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

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

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

onUpdate()の実装

 何も表示されないApp Widgetはあまり実用的ではありません。幸い、今回作成するApp WidgetのRemoteViewオブジェクトの実装は簡単で、アプリケーションのdrawableリソースディレクトリに格納されている一連の画像を使用します。アプリケーションはこれらの画像リソースをR.drawable.[imagename]として参照します。今回のコードでは画像リソースの名前を格納する配列を作成することで、簡単にどれか1つの画像をランダムに描画できるようにします。次のコード例は、用意されている画像のうちの1つをランダムに描画するonUpdate()の実装を表しています。

@Override
public void onUpdate(Context context,
   AppWidgetManager appWidgetManager,
   int[] appWidgetIds) {
   for (int appWidgetId : appWidgetIds) {
      int imageNum = (new
         java.util.Random().nextInt(IMAGES.length));
      RemoteViews remoteView = new
         RemoteViews(context.getPackageName(),
         R.layout.widget);
      remoteView.setImageViewResource(
         R.id.image, IMAGES[imageNum]);
      appWidgetManager.updateAppWidget(
         appWidgetId, remoteView);
   }
}

 onUpdate()メソッドが最後のパラメータとしてApp Widgetインスタンスのリストを要求していることに注目してください。それぞれのインスタンスは別々に処理する必要があります。App Widgetフレームワークに存在する欠陥のため、提供されるインスタンスのなかには表示不能なものや使用不能なものもあるかもしれません。しかし、今回のサンプルではこの問題を無視しても構いません。今後皆さんが作成する実装では、どのApp Widgetが実際にアクティブなのかを追跡する必要があるかもしれないということを覚えておいてください。

 この記事のダウンロード可能なコードに含まれる簡単なR.layout.widget XMLのレイアウト定義をよく見ると分かりますが、これは基本的には単純なImageViewです。RemoteViewsは、一部の限られた種類のViewオブジェクト、例えばButton、ImageButton、ImageView、TextView、AnalogClock、Chronometer、ProgressBarだけを使用でき、しかもこれらはFrameLayout、LinearLayout、またはRelativeLayout内でのみ使用できます。RemoteViewのアクセスはsetImageViewResource()setTextViewText()のようなメソッドによって制御されるため、RemoteViewは簡素に保つようにしてください。RemoteViewは別のプロセス内にViewを描画することを目的としたものなので、通常のレイアウトよりもアプリケーションからの制御性が低くなっています。

 ここまでで、App Widgetの基本的な説明は完了です。ただし、ユーザーが画像の更新間隔を設定できるようにするには、設定Activityを実装し、RemoteViewの更新スケジュールについての処理を行う必要があります。

App Widgetの設定Activityの実装

 マニフェストファイルにImagesWidgetConfigurationとして定義されている設定Activityは、基本的には他のActivityと同様ですが、次の2つの例外があります。

  1. 起動すると結果が返されるようになっています。従って、実装する際は必ずsetResult()メソッドを呼び出し、適切な結果(RESULT_CANCELEDまたはRESULT_OK)を返す必要があります。
  2. 結果を設定するときには、AppWidgeManager.EXTRA_APPWIDGET_IDで参照される追加情報(extra)にApp Widget IDの値を記述する必要があります。

 次のコード例は、この2つの例外についての対応を示しています。ユーザーがActivityを取り消した場合は、setResult()を呼び出し、既定の結果をRESULT_CANCELEDとして設定しています。

Bundle extras = launchIntent.getExtras();
if (extras != null) {
   appWidgetId = extras.getInt(
      AppWidgetManager.EXTRA_APPWIDGET_ID,
      AppWidgetManager.INVALID_APPWIDGET_ID);
   Intent cancelResultValue = new Intent();
   cancelResultValue.putExtra(
      AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
   setResult(RESULT_CANCELED, cancelResultValue);
}

 この2点の制限を除けば、好きなように設定Activityを実装して構いません。図1は今回のサンプルで使用する単純な設定Activityを表しています。RESULT_CANCELEDが返された場合、App Widgetはユーザーに表示されません。RESULT_OKが返された場合は、App Widgetはユーザーに表示されます。個々のApp Widgetインスタンス用の設定データを保管するには、どの格納メカニズムを使っても構いません。この例では、SharedPreferencesインターフェースを使い、特定のApp Widget IDと一緒に更新間隔を保管します。完全な実装については、この記事のダウンロード可能なコードを参照ください。

図1 設定画面: この単純な設定画面で、ユーザーはApp Widgetの画像表示が変わる時間間隔を設定できる
図1 設定画面: この単純な設定画面で、ユーザーは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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー