Android OSのNotification(通知)を実装するためのクラスとして、Notificationクラスと、NotificationManagerクラスの2つがあります。

Notificationの動作

Notificationとは、Androidのホーム画面最上段のステータスバーに表示される物で、例えば、バックグラウンドでメールを受信した時に、アイコンを出して新規メールがある事をユーザに伝えるために使用されます。

下の画像は、tPodcastプログラムのアイコンが左上に表示されています。tPodcastでは、定期的に新しいアーティクルがないかの問い合わせを行い、新しい物が見つかった時に上記のようにステータスバーに、Notificationを表示させています。

statusbar.png

この状態から、ステータスバーを下にドラッグすると、ステータスバーが開き、以下のような画面になります。
この状態でNotificationをクリックすると、そのプログラムの指定したInentへ遷移します。

また、Clear Notificationボタンをクリックすることで、Notificationを総てクリアできます。

Notification Manager

Notification Managerは、Notificationを管理し、Notificationを画面に表示、非表示をするためのマネージャークラスです。 Notification Managerにはコンストラクタは存在せず。インスタンスは、getSystemService(NOTIFICATION_SERVICE)で取得します。
メソッドは3つしかありません。

  • cance(int id)

    指定されたIDのNotificationを画面から削除します。

    この時使用されるidはnotifyメソッドで指定された物です

    キャンセルをすると、Notificationは画面上から消えてしまうのでこのメソッドの使用頻度は高くありません。

  • CancelALL

    総てのNotificationを削除します。 総てといっても他のアプリケーションが表示しているNotificationは削除できません。

  • notify(int id, Notification notification)

    ステータスバーにNotificationを表示します。

    notifacationオブジェクトにはどのように表示をするのかを格納します(下記参照)。

Notification

ステータスバーにどのような情報を表示するのかを設定するクラスです。 重要なメソッドは、コンストラクタと、setLatestEventInfoです。

contentTitleや、tickerText等指定するテキストが数多くあります、どの値がどこに表示されるのか以下の画像に簡単にまとめました。

Notification(int icon, CharSequence tickerText, long when)

コンストラクタは3つ用意されていますが、通常このコンストラクタを使用します。

  • icon

    ステータスバーに表示するアイコンのリソースIDを指定

  • tickerText

    ステータスバーにNotificationアイコンが表示される前に、表示される短いテキストです。ステータスバー上に表示された後すぐに消えてしまいます。tRSSReaderの場合は「tRSSReader」と表示させています。

  • when

    表示する時刻を設定します。特殊な事をしない限りSystem.currentTimeMillis()を設定します。

setLatestEventInfo (Context context, CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent)
  • context

    アプリケーションコンテキストを設定します

  • contentTitle

    アイコンの横にボールドで表示される文字列

  • contentText

    contextTitleの下に表示される文字列

  • contentIntent

    ステータスバーを広げた状態でユーザがNotificationをクリックした時に起動するIntentを指定します。このinitentには、FLAG_ACTIVITY_NEW_TASK を付けます。

PendingIntentの作成

起動するIntentクラスを指定して、Intent.FLAG_ACTIVITY_NEW_TASKを指定します。


PendingIntent intent = PendingIntent.getActivity(this, 0,
new Intent(this, jp.co.taosoftware.android.podcast.ChannelView.class),
Intent.FLAG_ACTIVITY_NEW_TASK);
Vibratorやサウンド

Norificationクラスにはバイブレータや音による通知等を設定するメソッドが用意されていません。 ステータスバーにNotificationを表示する時に、音やバイブレーションを行う時は、メンバ変数に直接値を格納します。


notification.defaults |= Notification.DEFAULT_VIBRATE;
Uri sound = Uri.parse(ringtoneStr);
notification.sound = sound;

サンプルソース


NotificationManager mNM;
mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
Notification notification;
notification = new Notification(R.drawable.podcast_demo_notify,  tickerText,System.currentTimeMillis());
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, jp.co.taosoftware.android.podcast.ChannelView.class),
Intent.FLAG_ACTIVITY_NEW_TASK);
notification.setLatestEventInfo(this,
getText(R.string.podcast_service_name),
getText(R.string.service_new_articles), contentIntent);
int notificationId = R.string.service_new_articles_format;
mNM.notify(notificationId, notification);

ブログ内の関連する記事