2012年9月18日火曜日

通知(Notification) #3 (実行中/キャンセル)

Notificationは、実行結果を「通知」する以外に、「実行中」であることを示すこともできます。

これはAndroid 2.2英語版での例です。"Ongoing"が「実行中」、"Notifications"が「通知」です。


通知(Notification) #3 (実行中/キャンセル)

前回のサンプルではラジオボタンを使って通知のIDを変更しました。今回はそれに加えて通知の種類も変えてみましょう。

これまで通知を削除する方法は説明しませんでしたが、通知エリアの「Clear」ボタンで消すことができます。当然プログラム内からも削除できます。アプリケーションで通知を消すための「Clear」ボタンも今回のサンプルに追加します。

NotificationTest3aActivity.java
package jp.co.triware.samples.NotificationTest3a;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioGroup;

public class NotificationTest3aActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final NotificationManager notifMgr = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        final EditText etTickerText = (EditText)findViewById(R.id.tickerText_et);
        final EditText etContentText = (EditText)findViewById(R.id.contentText_et);
        final RadioGroup rgSelect = (RadioGroup)findViewById(R.id.group_rg);

        // Notifyボタン
        Button btnNotify = (Button)findViewById(R.id.notify_btn);
        btnNotify.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                // ステータスバーと通知エリアに表示する内容をセット
                int icon = R.drawable.ic_launcher; // アイコン
                String tickerText = etTickerText.getText().toString(); // テキスト(ステータスバー)
                long when = System.currentTimeMillis(); // 時刻
                Notification notif = new Notification(icon, tickerText, when);

                // ラジオボタンのIDを通知のIDとして使用する
                int id = rgSelect.getCheckedRadioButtonId();
                if (id == R.id.select2_rb) {
                    notif.flags |= Notification.FLAG_ONGOING_EVENT; // 「実行中」
                }

                // 通知エリアに表示する内容をセット
                String contentTitle = getString(R.string.app_name); // タイトル
                String contentText = etContentText.getText().toString(); // 通知メッセージ
                Intent intent = null; // タップ時の処理(今回は何もしない)
                PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
                notif.setLatestEventInfo(getApplicationContext(), contentTitle, contentText, contentIntent);

                // 通知
                notifMgr.notify(id, notif);
            }
        });

        // Clearボタン
        Button btnClear = (Button)findViewById(R.id.clear_btn);
        btnClear.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // ID取得
                int id = rgSelect.getCheckedRadioButtonId();

                // キャンセル
                notifMgr.cancel(id);
            }
        });
    }
}

前回とほとんど同じですが、「Ongoing」ボタンがクリックされた場合はNotificationのフラグを変更しています(39-41行目)。
また、「Clear」ボタンがクリックされたときは、NotificationManagerのcancel()メソッドを呼び出しています(64行目)。通知のIDとしてラジオボタンのリソースIDを使っていますので、cancel()メソッドの引数で渡すIDはラジオボタンのリソースIDとなります。

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    >
    <RadioGroup
        android:id="@+id/group_rg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >
        <RadioButton
            android:id="@+id/select1_rb"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Notify"
            android:checked="true"
            />
        <RadioButton
            android:id="@+id/select2_rb"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Ongoing"
            />
    </RadioGroup>
    <EditText
        android:id="@+id/tickerText_et"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="Ticker Text"
        />
    <EditText
        android:id="@+id/contentText_et"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="Content Text"
        />
    <Button
        android:id="@+id/notify_btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Notify"
        />
    <Button
        android:id="@+id/clear_btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Clear"
        />
</LinearLayout>

Androidプロジェクトの設定
プロジェクト名:NotificationTest3a
アプリケーション名:NotificationTest3a
パッケージ名:jp.co.triware.samples.NotificationTest3a
アクティビティーの作成:NotificationTest3aActivity
ビルドターゲットや最小SDKバージョンは、お使いの開発環境に合わせて設定してください。

実行結果

アプリケーション起動直後の画面です。

最初に「Notify」のラジオボタンを選択、テキストを入力して、「Notify」ボタンを押して・・・

通知エリアを確認します。

次は「Ongoing」のラジオボタンを選んで、テキストを入力、そして「Notify」ボタンを押します。

通知エリアを見ると、「実行中」を示す「Ongoing」のエリアが表示されていますね。ここで「Clear」ボタンを押してみましょう。

通知エリアが消えて、サンプルアプリが表示されますので、もう一度通知エリアを見てみます。すると「Notifications」は消えていますが「Ongoing」は残ったままですね。

アプリに戻って「Clear」ボタンを押すと(ラジオボタンは「Ongoing」のまま)ステータスバーのアイコンが消えて、通知エリアからも「Ongoing」が消えました。

Ongoing(実行中)だけでなく、Notifications(通知)もアプリから削除できることを確認しておきましょう。
ラジオボタンは「Notify」を選びます。テキストを入力して、「Notify」ボタンを押します。

そしてサンプルアプリの「Clear」ボタンを押すと、ちゃんと「Notifications」も消えました。

0 件のコメント:

コメントを投稿