mucchinのAndroid戦記

Androidアプリから通知アイコンを出す方法

バックグラウンドで動作中のAndroidアプリから、画面のステータスバーの部分に通知アイコンを出す方法は?

バックグラウンドで動作しているAndroidアプリから、ステータスバーに通知アイコンを出したり、文字列を表示させたりする事ができます。
この機能をノーティフィケーションといいます。
なお、今回の記事ではAndroidアプリをバックグラウンドで動作させるService(サービス)については触れません。


単純にノーティフィケーションを設定する簡単な例を説明します。
ノーティフィケーションの設定の仕方は、まず、どのような通知の仕方を行うかという情報を設定したNotificationインスタンスを生成します。

Noticationオブジェクトの生成

Notificationクラスは、以下のプロパティを持っています。

audioStreamType ノーティフィケーション発生時に鳴動させるオーディオのタイプを指定します。設定する値は、AudioManagerクラスで定義されている「STREAM_」で始まる定数です。
詳しくは、Android SDKのドキュメントの、docs/reference/android/media/AudioManager.htmlを参照してください。
contentIntent ステータスバーをタップされたときに発行されるインテントを指定します。
contentView ステータスバーに表示するViewを指定します。
contentIntent、contentViewを設定する方法ですが、プロパティに直接指定するのではなく、NotificationクラスのsetLatestEventInfo()というメソッドの方が使いやすいかもしれません。
defaults ノーティフィケーション発生時の音、バイブレート、LEDに関して、デフォルトの設定を用いるときに使います。音をデフォルトとするときは「DEFAULT_SOUND」、バイブレートをデフォルトとするときは「DEFAULT_VIBRATE」、LEDをデフォルトとするときは「DEFAULT_LIGHTS」を設定します。
複数を用いる場合は、論理和で結びます。
全てをデフォルトとするときは「DEFAULT_ALL」を設定すればOKです。
これらはNotificationクラスで定義されている定数です。
※AndroidのSDKドキュメントより、おそらく上記の認識でよいと思いますが、実機を持っていないので実動作を試したわけではありません。
ちなみにAndroid端末の「設定」->「サウンド&画面設定」->「通知音」の設定がデフォルトとなるのかな?と思いますが、これも実機が無いので定かではありません。
deleteIntent ノーティフィケーションをクリアしたときに発行されるインテントを指定します。
icon ノーティフィケーション発生時、ステータスバーに表示するアイコンのリソースIDを指定します。
iconLevel アイコンのレベルらしいが、いまいち用途は不明です・・・。
ledARGB LEDの色を指定します。
ledOffMS LEDが消灯する時間をマイクロ秒単位で指定します。
ledOnMS LEDが点灯する時間をマイクロ秒単位で指定します。
number このノーティフィケーションが表すイベントが複数回起きた場合等に回数を通知するために使用します。例えばメールの件数とか、不在着信の件数とかを想像してもらったら、意味がわかりやすいかなと思います。
sound ノーティフィケーションの通知音を指定します。型はUrl型です。
tickerText ノーティフィケーション発生時にスクロールするテキスト文字を指定します。
vibrate バイブレートの振動パターンを指定します。
when ノーティフィケーションが発生する時間を指定します。ノーティフィケーションの一覧画面では、この値を元にソートされます。
flags APIドキュメントに何も書かれていないので謎ですが、Notificationクラスの「FLAGS_」で始まる定数を論理和した値を設定して使うのだと思います。

それでは簡単な設定方法を見てみましょう。
例えば、ボタンを押されたらノーティフィケーションを発行する、という事にします。
最後に、サンプルのコードをダウンロードできるリンクを用意しておきますが、以下のようなコードです。



//Notificationインスタンスの生成と設定
Notification n = new Notification();
n.icon = R.drawable.icon;
n.tickerText = “ティッカーテキスト”;
n.number = 2;
try{
   SimpleDateFormat date = new SimpleDateFormat(“yy/mm/dd HH:mm”);
   n.when = date.parse(“2010/5/20”).getTime();
}catch(Exception e){
   n.when = System.currentTimeMillis();
}

Intent i = new Intent(getApplicationContext(),NotifyActivity.class);
PendingIntent pend = PendingIntent.getActivity(this, 0, i, 0);
n.setLatestEventInfo(getApplicationContext(), “タイトル”, “テキスト”,setIntent() );

//NotificationManagerへNotificationインスタンスを設定して発行!
NotificationManager mManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
mManager.notify(1,n);


まずはNotificationインスタンスを生成します。
今回は適当に、icon、TickerText、number、whenのプロパティを設定して、そして、contentView、contentIntentのプロパティを設定する代わりに、setLatestEventInfo()メソッドを使って、ノーティフィケーション一覧画面での表示内容やタップされたときに発行されるIntentを設定しています。
引数は適当にベタ書きにしているところがありますが、サンプルなんでご容赦を。

そして、NotificationManagerというノーティフィケーションを司るマネージャを取得して、生成したノーティフィケーションを発行する、という流れです。


スポンサーリンク




今回説明に使うAndroidアプリのプロジェクトは、以下からダウンロードできます。
Android ノーティフィケーションのサンプルコード

このアプリを起動すると、以下のような画面が表示されます。

「通知設定」ボタンを押すと、先ほどのサンプルコードが実行されるような作りとなっています。
この「通知設定」ボタンを押すと、Notificationが発生します。
以下の画面上部のステータスバー部を見てください。

コードで設定した「TickerText」と、「icon」が表示されていますね。
しばらく経過すると、以下のような画面になります。

コードで設定した「number」が表示されます。
このステータスバーを、タップして下に引き伸ばす(PCのエミュレータでの操作としては、ステータスバーを画面下の方へドラッグする)と、以下のようなノーティフィケーション一覧画面(英語のドキュメントでは、「expand」と表現されています。)が表示されます。

このノーティフィケーションをタップ(クリック)すると、設定したIntentが発行されます。
今回のサンプルアプリでは、わかりやすいように、同じアプリ内の別アクティビティを指定しています。
以下のような画面が起動されます。


サンプルコードと照らし合わせながら動かせば、基本的な事は理解いただけるかと思います。
あとは、応用次第です!