このページの本文へ

前へ 1 2 次へ

これで作れる! Androidのアプリケーション 第10回

ブロードキャストへの応答とタイマ割り込み

2010年09月09日 12時00分更新

文● 塩田紳二

  • この記事をはてなブックマークに追加
  • 本文印刷

システムからの通知に用いるブロードキャスト

 インテント呼び出しの1種にBroadcastがあります。インテントは特定の機能を持ったアプリケーションの呼び出しだけでなく、システムからの通知にも利用されます。これがBroadcastで、たとえばシステムの時計などが変更されたことをアプリケーションに通知する場合に使われます。つまり、システムが特定のブロードキャストインテントに応答するアプリケーションを“呼び出す”わけです。

システム設定で時間を変更した際など、システムからのアプリケーションへの通知に用いられるのがブロードキャストだ

 システム側は、どのアプリケーションがシステムで発生するどのイベントが必要なのかはわからないので、宛先を特定しないBroadcastという形でインテント呼び出しを行ない、アプリケーションはフィルターとハンドラをレシーバーとして登録しておきます。フィルターは、アプリケーションが必要なブロードキャストインテントのみを通し、それ以外には応答しないようにするためのものです。ハンドラはフィルターを通過してきたBroadcastに応答するコードです。

 サンプルで作成した「世界時計サンプル」では、システム側での日付、時間関係の変更を検出する必要があります。実際には秒単位で画面を更新しているので、もし変更があればjava内で現在時刻を表示したタイミングで表示を変えます。つまり、実際にはシステムでの設定後、若干遅れて反映されるだけで問題は生じないのですが、将来的なことを考慮し、「時刻の変更」「日付の変更」「タイムゾーンの変更」の3つを検出することにしました。

 まずは、レシーバーの登録までのコードです。これは、「世界時計サンプル」のWorldClock.javaの80行目からに相当します。

IntentFilter myFilter = new IntentFilter(); myFilter.addAction(Intent.ACTION_DATE_CHANGED); myFilter.addAction(Intent.ACTION_TIME_CHANGED); myFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED); registerReceiver(changeTime, myFilter);

 まずはIntentFilterを作り、ここに通過させるインテントのアクションを追加していきます。最後にブロードキャストが起こったときのハンドラとフィルターをregisterReceiverメソッドで登録します。これで、Broadcastがやってきたとき、ハンドラであるchangeTimeが呼び出されるようになっています。ハンドラはBoradcastReceiverオブジェクトになっています。

 このregisterReceiverは、android.content.ContextWrapperで定義されるメソッドですが、Activityは、このandroid.content.ContextWrapperのサブクラスになっているため、直接呼び出すことができます。

 次にハンドラを見てみることにしましょう。ハンドラの定義は、WorldClock.javaの365行目からになります。

private BroadcastReceiver changeTime = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    refresh();
  }
};

 ハンドラは、BroadcastReceiverオブジェクトで、Broadcastがやってきたら「onRecive」メソッドが呼び出されます。あとは、この中で日時などの表示を更新するメソッド(refresh)を実行するだけです。

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン