妄想プログラマのらくがき帳 : 5月 2013

2013年5月27日月曜日

[Android]通知を表示する。その4。

通知ではプログレスバーを表示することもできます。

以下のサンプルコードでは、onClickBtnShowNotification()で通知を表示し、
onClickBtnUpdate()でプログレスバーを進め、onClickBtnFinish()でプログレスバーを終了しています。
public class MainActivity extends Activity {

    private final int notifyID = 100;
    private NotificationCompat.Builder m_builder;

    private int m_count = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public void onClickBtnShowNotification(View view) {
        // 通知を表示する
        m_builder = new NotificationCompat.Builder(this);
        m_builder.setSmallIcon(R.drawable.ic_launcher);
        m_builder.setContentTitle("notification title");
        m_builder.setContentText("notification text.");
        m_builder.setTicker("notification ticker");

        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        manager.notify(notifyID, m_builder.build());
    }

    public void onClickBtnUpdate(View view) {
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        // 第1引数に最大値、第2引数に現在値する。
        // 第3引数は値増加型プログレスバーの場合、falseを設定。
        m_builder.setProgress(100, m_count++, false);
        // マーキースタイルのプログレスバーにするには↓の引数でsetProgress()を呼び出す
        // m_builder.setProgress(0, 0, true);
        
        // 通知を更新する
        manager.notify(notifyID, m_builder.build());
    }

    public void onClickBtnFinish(View view) {
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        // プログレスバーを終了させるには、以下の引数でsetProgress()を呼び出す
        m_builder.setProgress(0, 0, false);
        
        // 通知を更新する
        manager.notify(notifyID, m_builder.build());
    }
}
サンプルなのでボタンクリックでプログレスバーを進めていますが、
実際は別スレッドの処理内でsetProgress()を呼び出すことになると思います。

2013年5月20日月曜日

[Android]通知を表示する。その3。

前回のエントリからの続きで、通知ドロワーから起動するアクティビティにbackスタックを設定する方法です。

まず、マニフェストファイルでアクティビティの階層を定義します。
以下の通りに子アクティビティにmeta-dataを追加します。
<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.notificationsample.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.example.notificationsample.NotificationActivity"
        android:label="@string/title_activity_notification" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
        <!-- 子アクティビティに以下のような meta-dataを追加する。以下の場合、親アクティビティにMainActivityを設定している。  -->
        <meta-data 
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity"/>
    </activity>
</application>

次にTaskStackBuilderでbackスタックを作成し、PendingIntentを取得します。
その取得したPendingIntentをsetContentIntent()の引数に指定して通知を表示します。
// 以下は、通知ドロワークリック時にNotificationActivityを表示する場合のコード

// TaskStackBuilderを作成
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(NotificationActivity.class); // スタックにNotificationActivityの親アクティビティを追加
// TaskStackBuilder.addNextIntent()でNotificationActivityをスタックに追加
Intent intent = new Intent(this, NotificationActivity.class);
stackBuilder.addNextIntent(intent);

// TaskStackBuilder.getPendingIntent()でPendingIntentを取得
PendingIntent pendingIntent =
    stackBuilder.getPendingIntent(0, PendingIntent.FLAG_CANCEL_CURRENT);

// 通知を表示
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setSmallIcon(R.drawable.ic_launcher);
builder.setContentTitle("notification title");
builder.setContentText("notification text.");
builder.setTicker("notification ticker");
builder.setContentIntent(pendingIntent);

int notifyID = 1;
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.notify(notifyID, builder.build());
上記のコードで表示した通知ドロワーをクリックすると、まずNotificationActivityが表示されます。
そこでbackボタンを押すと、NotificationActivityの親アクティビティであるMainActivityが表示されます。

TaskStackBuilder.addNextIntent()は複数回呼び出すことができ、
最後に渡したIntentのアクティビティが最初に表示されるアクティビティになります。
例えば、.addNextIntent(A)→.addNextIntent(B)→.addNextIntent(C)と呼び出すと、
A、B、Cの順にスタックに追加され、

[ドロワークリック]→C表示→[backボタン押下]→B表示→[backボタン押下]→
A表示→[backボタン押下]→Aの親アクティビティ表示

という動作になります。

2013年5月13日月曜日

[Android]通知を表示する。その2。

通知ドロワーでの通知クリック時に、アクティビティを起動させることができます。
方法は簡単で、PendingIntentを作成しNotificationCompat.Builder.setContentIntent()に渡すだけです。
以下がそのコード。
// まず画面遷移時と同様に、起動するアクティビティのintentを作成。
// putExtra()でデータを渡すことも可能。
Intent intent = new Intent(this, NotificationActivity.class);
intent.putExtra("text", "Notification Activity");

// アクティビティが新しい空のタスクで起動するようにフラグを設定
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

// intentからPendingIntentを作成
PendingIntent pendingIntent =
    PendingIntent.getActivity(this, 0, intent,
                              PendingIntent.FLAG_CANCEL_CURRENT);

// NotificationCompat.Builder.setContentIntent()に作成したPendingIntentを渡し、
// 通知を表示する。
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setSmallIcon(R.drawable.ic_launcher); // 通知ドロワーに表示するアイコンを設定
builder.setContentTitle("notification title");
builder.setContentText("notification text.");
builder.setTicker("notification ticker");
builder.setContentIntent(pendingIntent);

int notifyID = 1;
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.notify(notifyID, builder.build());
※putExtra()で渡したデータは、以下の方法でNotificationActivity内で取得できます。
Intent intent = getIntent();
String text = intent.getStringExtra("text");

上記コードによって、通知ドロワーに表示された通知をクリックすると、NotificationActivityが起動します。
ただし、NotificationActivity単独での起動となります。そのため、NotificationActivityでbackボタンを押すと
ホーム画面(または通知ドロワー表示前の画面)に戻ります。

通知の種類によってはこのような動作ではなく、あたかもアプリが起動されていたかのような動作にしたい場合があります(例えばGmailの場合、通知ドロワーをクリックすると受信メッセージが表示されますが、そこでbackボタンを押すと受信トレイが表示されます。この動作はGmailが通常起動されたときと同じ動作ですよね)。

このような場合、backスタックを作成する必要があるのですが、その方法は次回のエントリにて。

2013年5月8日水曜日

[Android]通知を表示する。その1。

通知をを表示するにはNotificationCompat.Builderを使います。
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setSmallIcon(R.drawable.ic_launcher);  // 左端に表示されるアイコン
builder.setContentTitle("notification title"); // 通知のタイトル
builder.setContentText("notification text.");  // 通知メッセージ
builder.setTicker("notification ticker");      // 通知バーに表示されるティッカー文字列

int notifyID = 1;
// NotificationManager.notify()に、通知IDとNotificationを渡すことで、通知が表示される
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.notify(notifyID, builder.build());
上記コードでは、以下のような通知が表示されます。


場合によっては、通知を通知バーから削除不可にしたい場合があります(プログレスバーの表示中とか)。
そういう場合は、NotificationCompat.Builder.setOngoing()を使います。
// 通知を通知バーから削除できなくする
builder.setOngoing(true);

// 引数falseで呼び出せば削除できるようになる
builder.setOngoing(false);