Notifications

Overview

Usage

final NOTIFICATION_ID = 1;

NotificationCompat.Builder builder = new NotificationCompat.Builder(
        getApplicationContext())
        .setAutoCancel(true)
        .setSmallIcon(android.R.drawable.stat_sys_warning)
        .setContentTitle("Notification Title")
        .setContentText("Here is a notification text.");
((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE))
        .notify(NOTIFICATION_ID, builder.build());

TaskStackBuilder

通知をタップした際のアクションは NotificationCompat.Builder#setContentIntent(PendingIntent) で設定する。

Launcher から起動して、順に履歴に積んでいく場合とは異なり、Notification Bar から子アクティビティを起動すると、遷移が不自然になってしまう。親アクティビティからの遷移が必要な場合は、新規に TaskStackBuilder を使って履歴を組み直すようにする。

Context context = getApplicadtionContext();
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
// ParentActivity > SubActivity
stackBuilder.addNextIntent(new Intent(context, MainActivity.class));
stackBuilder.addNextIntent(new Intent(context, SubActivity.class)));
contentIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(
        getApplicationContext())
        .setContentIntent(contentIntent)
        ...

AndroidManifest.xml 内で android:parentActivityName を指定していれば、TaskStackBuilder#setParentStack を使って組み直す事も出来る。

<activity
    android:name=".SubActivity"
    android:parentActivityName=".MainActivity" />
stackBuilder.setParentStack(SubActivity.class);
stackBuilder.addNextIntent(new Intent(context, SubActivity.class)));

対象アクティビティが単独で成立するのであれば、Intent のフラグを指定するだけでもよい。

Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
contentIntent = PendingIntent.getActivity(
        context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  • FLAG_ACTIVITY_SINGLE_TOP
    • 対象アクティビティが最終履歴(Back Stack 先頭)であれば、アクティブにするのみで履歴に新規追加しない。
  • FLAG_ACTIVITY_CLEAR_TOP
    • 対象アクティビティが履歴にあれば、それを最終履歴(Back Stack 先頭)にして、以降の履歴を削除する。