[Android]通知を表示する。その3。 | 妄想プログラマのらくがき帳

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の親アクティビティ表示

という動作になります。

0 件のコメント:

コメントを投稿