先日の記事でNotificationに関する解説をしたが、Notificationを実装する時は、アプリケーションの設定画面(PreferenseActivity)にNotification関連の設定を追加する必要がある。

この記事は、先日バージョンアップしたtRSSReaderで通知設定に、音とバイブレーションを追加したので、その時の作業をまとめた物です。

Notificationの設定画面は、ほぼ定型処理となり以下のような画面になる。

サンプルソースとしては、Messaging(MSM)ソフトを参照にするのが一番良い

notification setting

間違えやすい事項としては、 Notification設定をするソフトウェアは、サービスプログラムとして作成され、バックグラウンドで動作する事が多いが、NotificationsチェックボックをOFFにするという事は、サービスの動作をOFFにするということではない。サービスは動いているが、Notification tool bar(ステータスバー)に通知を表示するか、しないかということである。サービスの動作を停止、終了は別の項目を作成して行う。

NotificationsがOFFの時は、Select ringtone及びVibrateもdisableとなる。 VibrateがONでNotificationをOFFにすると、VibrateはONのままDisableとなるが、この時の動作は”Vibrateしない”となる。

上記動作については、Mms¥src¥com¥android¥mms¥transaction¥MessagingNotification.javaを参照

res/xml/preference_activity.xml


<PreferenceCategory android:title="@string/pref_notification_settings_title">
<CheckBoxPreference android:key="@string/pref_key_enable_notifications"
android:title="@string/pref_title_notification_enabled"
android:summary="@string/pref_summary_notification_enabled"
android:defaultValue="@string/pref_default_value_notification_enabled" />
<RingtonePreference android:layout="?android:attr/preferenceLayoutChild"
android:dependency="@string/pref_key_enable_notifications"
android:key="@string/pref_key_ringtone"
android:title="@string/pref_title_notification_ringtone"
android:ringtoneType="notification"
android:defaultValue="content://settings/system/notification_sound" />
<CheckBoxPreference android:layout="?android:attr/preferenceLayoutChild"
android:dependency="pref_key_enable_notifications"
android:key="@string/pref_key_vibrate"
android:defaultValue="@string/pref_default_value_vibrate"
android:title="@string/pref_title_notification_vibrate"
android:summary="@string/pref_summary_notification_vibrate" />
</PreferenceCategory>

補足:DefaultValue及び、KeyはStringリソースを参照に変更することで、プログラム内部から機械的ににgetterを作成可能となるため、Messagingソフトとは一部ソースが異なります。

res/values/strings.xml


<string name="pref_notification_settings_title">Notification settings</string>
<string name="pref_title_notification_enabled">Notifications</string>
<string name="pref_summary_notification_enabled">Display message notifications in status bar</string>
<string name="pref_title_notification_vibrate">Vibrate</string>
<string name="pref_summary_notification_vibrate">Also vibrate when notified</string>
<string name="pref_title_notification_ringtone">Select ringtone</string>
<string name="pref_key_notification_enabled">pref_key_notification_enabled</string>
<string name="pref_key_ringtone">pref_key_ringtone</string>
<string name="pref_key_vibrate">pref_key_vibrate</string>
<string name="pref_default_value_notification_enabled">true</string>
<string name="pref_default_value_vibrate">false</string>

res/values-ja/strings.xml

日本語リソースです。以下はAndroid SDK1.5preのMessangerから取ってきたものです。

言葉の統一をはかるため以下の文字列をそのまま使用するのがよいでしょう。


<string name="pref_notification_settings_title">"通知設定"</string>
<string name="pref_title_notification_enabled">"通知"</string>
<string name="pref_summary_notification_enabled">"メッセージ受信: ステータスバーで通知"</string>
<string name="pref_title_notification_vibrate">"バイブレーション"</string>
<string name="pref_summary_notification_vibrate">"通知: バイブレーションON"</string>
<string name="pref_title_notification_ringtone">"着信音を選択"</string>

このようなXMLを記載すると自動的にNotification画面が出来上がり、ソースコードは何も書く必要はありません。

着信音設定のダイアログも自動的に使用できるようになります。

ringertone

SettingActivity.hava

PreferenceActivityを継承した設定画面用のクラスです。

プリファレンスの現在の設定値を取得する関数を、このクラスに纏めておくと分かりやすいので、メンバメソッドとして実装しています。


public class SettingActivity extends PreferenceActivity{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.rssreader_preferences);
}
 /**
  * Notification設定
  *
  * Onの時True,Offの時falseを返す。
  *
  * NotificationがOffの時は、着信音、Vibrateが設定されていても無視をする。
  *
  * @param ctx
  * @return
  */
public static boolean isNotification(Context ctx){
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(ctx);
return settings.getBoolean(ctx.getString(R.string.pref_key_notification_enabledion_enabled)));
}
/**
* RingToneの種類設定
*
* OFFの場合はNULLを返す。
* @param ctx
* @return
*/
public static Uri getRingTone(Context ctx){
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(ctx);
String ringtoneStr  = settings.getString(ctx.getString(R.string.pref_key_ringtone), null);
return TextUtils.isEmpty(ringtoneStr) ? null : Uri.parse(ringtoneStr);
}
/**
* Vibrate設定
*
* Onの時Trueを返し、Offの時Falseを返す。
* Notificationの設定がOffの時は、このメソッドでTrueを返してもVibrate処理はしない事
*
* @param ctx
* @return
*/
public static boolean isVibrate(Context ctx){
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(ctx);
return settings.getBoolean(ctx.getString(R.string.pref_key_vibrate), new Boolean(ctx.getString(R.string.pref_default_value_vibrate)));
}
}

サービスプログラム等でのNotification表示例


void doNotification(Context ctx){
if(!SettingActivity.isNotification(ctx)) return;
.....
if(SettingActivity.isVibrate(ctx)){
notification.defaults |= Notification.DEFAULT_VIBRATE;
}
Uri sound = SettingActivity.getRingTone(ctx);
if(null != sound){
notification.sound = sound;
}
}

注意事項

バイブレーション機能を実装しているので、Manifestファイルに、VIBRATE使用パミッションを付ける事を忘れないようにすること


<uses-permission android:name="android.permission.VIBRATE" />

ブログ内の関連する記事

ブログ内の関連する記事2