システムからの通知に用いるブロードキャスト
インテント呼び出しの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)を実行するだけです。

この連載の記事
- 第11回 アプリケーションをAndroidマーケットに登録する
- 第9回 Androidアプリで複数の項目を表示するリストビューを使う
- 第8回 Androidアプリに必要なダイアログを作る
- 第7回 Androidアプリの設定画面を作成する
- 第6回 Androidアプリ内で表示されるメニューを作成する
- 第5回 インテントによるアプリケーションとアクティビティの呼出し
- 第4回 Androidアプリを構成する「アクティビティ」を実際に作る
- 第3回 アプリケーションの基本となる「アクティビティ」
- 第2回 開発したアプリをエミュレーターやデバッガ上でテストする
- 第1回 Androidアプリの開発環境であるEclipseの使い方を知る
- この連載の一覧へ