Skip to content

Most visited

Recently visited

navigation

通知

通知は、アプリケーションの通常の UI 以外で、ユーザーに表示できるメッセージです。システムが通知を発行通知すると、通知はまず通知エリアにアイコンで表示されます。 通知の詳細を確認するには、ユーザーが通知ドロワーを開く必要があります。 ドロワー通知エリアと通知ドロワーはどちらも、システムによって制御されているエリアであり、ユーザーはいつでも見ることができます。

図 1. 通知エリアの通知。

図 2. 通知ドロワーの通知。

注: 別途記載がある場合を除き、このガイドでは、バージョン 4 の サポート ライブラリNotificationCompat.Builder クラスについて記述しています。クラス Notification.Builder は、Android 3.0(API レベル 11)で追加されました。

設計上の考慮事項

通知は、Android ユーザー インターフェースの重要なパーツであり、独自の設計ガイドラインが設けられています。Android 5.0 (API レベル 21)で導入されたマテリアル デザインの変更は特に重要です。詳細については、「マテリアル デザイン」をご覧ください。 通知とその操作の設計方法については、通知設計ガイドをご覧ください。

通知を作成する

通知のための UI 情報とアクションを、NotificationCompat.Builder オブジェクトに指定します。通知自体を作成するには、NotificationCompat.Builder.build() を呼び出します。これにより、指定された UI 情報とアクションを含む Notification オブジェクトが返されます。 通知を発行するには、NotificationManager.notify() を呼び出して、この Notification オブジェクトをシステムに渡します。

必須通知コンテンツ

Notification オブジェクトの必須コンテンツは次のとおりです。

省略可能な通知コンテンツと設定

上記以外のすべての通知設定とコンテンツは省略可能です。省略可能な通知設定とコンテンツについては、NotificationCompat.Builder のリファレンスをご覧ください。

通知アクション

通知アクションは省略可能ですが、通知には、少なくとも 1 つのアクションを追加する必要があります。 アクションは、ユーザーが通知からアプリケーションの Activity に直接移動することを可能にします。ユーザーは、移動先で、イベントを確認したりさらに作業を行ったりすることができます。

1 つの通知が複数のアクションを提供することもあります。そのため、ユーザーが通知をクリックした時にトリガーされるアクションを必ず定義してください。通常、このアクションは、アプリケーション内で Activity を開きます。 また、アラームのスヌーズやテキスト メッセージへの即時返信などの追加のアクションを実行するボタンを、通知に追加することもできます。この機能は、Android 4.1 から利用できるようになりました。 追加のアクション ボタンを使用する場合、それらのボタンの機能をアプリの Activity で利用できるようにする必要があります。詳細については、互換性の確保についてのセクションをご覧ください。

Notification 内部では、アクションは、アプリケーションで Activity を開始する Intent が含まれる PendingIntent によって定義されます。 PendingIntent を操作と関連付けるには、NotificationCompat.Builder の該当するメソッドを呼び出します。 たとえば、ユーザーが通知ドロワーで通知のテキストをクリックしたときに Activity を開始する場合、setContentIntent() を呼び出して PendingIntent を追加します。

ユーザーが通知をクリックしたときに Activity を開始することは、最も一般的なアクション シナリオです。 ユーザーが通知を閉じた場合に Activity を開始することもできます。 Android 4.1 以降では、アクション ボタンから Activity を開始できます。 詳細については、NotificationCompat.Builder のリファレンスをご覧ください。

通知の優先度

必要に応じて、通知の優先度を設定できます。通知の優先度は、通知の表示方法についての端末 UI へのヒントの役割を果たします。 通知の優先度を設定するには、otificationCompat.Builder.setPriority() を呼び出し、NotificationCompat 優先度定数の 1 つを渡します。 優先度レベルには、PRIORITY_MIN (-2)から PRIORITY_MAX (2)までの 5 段階あります。優先度レベルが設定されていない場合、優先度はデフォルト値の PRIORITY_DEFAULT (0)になります。

適切な優先順位の設定方法については、通知設計ガイドの「Correctly set and manage notification priority」をご覧ください。

簡単な通知を作成する

次のスニペットでは、ユーザーに通知がクリックされたときに起動するアクティビティを指定する簡単な通知を作成しています。 このコードでは TaskStackBuilder オブジェクトを作成し、そのオブジェクトを使用して、アクションのための PendingIntent を作成していることにご注意ください。 詳細は、アクティビティの開始時のナビゲーションの維持セクションで説明しています。

NotificationCompat.Builder mBuilder =
        new NotificationCompat.Builder(this)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!");
// Creates an explicit intent for an Activity in your app
Intent resultIntent = new Intent(this, ResultActivity.class);

// The stack builder object will contain an artificial back stack for the
// started Activity.
// This ensures that navigating backward from the Activity leads out of
// your application to the Home screen.
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// Adds the back stack for the Intent (but not the Intent itself)
stackBuilder.addParentStack(ResultActivity.class);
// Adds the Intent that starts the Activity to the top of the stack
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
        stackBuilder.getPendingIntent(
            0,
            PendingIntent.FLAG_UPDATE_CURRENT
        );
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager =
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// mId allows you to update the notification later on.
mNotificationManager.notify(mId, mBuilder.build());

これで、ユーザーに通知が行われました。

通知に拡張レイアウトを適用する

通知を拡張ビューに表示するには、まず NotificationCompat.Builder オブジェクトを任意の標準ビュー オプションで作成します。 次に、Builder.setStyle() を拡張レイアウト オブジェクトを引数に指定して呼び出します。

通知の拡張機能は、Android 4.1 より前のバージョンでは利用できないことにご注意ください。Android 4.1 とそれ以前のプラットフォームでの通知の処理方法については、互換性の確保についてのセクションをご覧ください。

たとえば、次のコード スニペットでは、先ほどのスニペットで作成した通知を変更して、拡張レイアウトを使用するようにしています。

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
    .setSmallIcon(R.drawable.notification_icon)
    .setContentTitle("Event tracker")
    .setContentText("Events received")
NotificationCompat.InboxStyle inboxStyle =
        new NotificationCompat.InboxStyle();
String[] events = new String[6];
// Sets a title for the Inbox in expanded layout
inboxStyle.setBigContentTitle("Event tracker details:");
...
// Moves events into the expanded layout
for (int i=0; i < events.length; i++) {

    inboxStyle.addLine(events[i]);
}
// Moves the expanded layout object into the notification object.
mBuilder.setStyle(inBoxStyle);
...
// Issue the notification here.

互換性を確保する

通知機能をセットするメソッドはサポート ライブラリのクラス NotificationCompat.Builder に登録されていますが、特定のバージョンですべての通知機能が利用できるわけではありません。 たとえば、アクション ボタンは拡張通知の機能ですが、拡張通知自体が Android 4.1 以上でしか利用できないため、Android 4.1 以上でのみ表示されます。

可能な限り互換性を確保するには、NotificationCompat とそのサブクラス、特に NotificationCompat.Builder を使用して通知を作成します。 さらに、通知の実装時に次の処理を行ってください。

  1. ユーザーが利用しているバージョンにかかわらず、通知機能のすべてをすべてのユーザーに提供します。 それには、アプリの Activity からすべての機能が利用できるようにする必要があります。このために、新しい Activity を追加した方がよい場合もあります。

    たとえば、addAction() を使用してメディア再生の開始と停止を行うコントロールを提供する場合、まずこのコントロールをアプリの Activity に実装します。

  2. ユーザーが通知をクリックしたときにその Activity が起動するようにして、すべてのユーザーがその機能にアクセスできるようにします。 それには、Activity のための PendingIntent を作成する必要があります。 setContentIntent() を呼び出し、PendingIntent を通知に追加してください。
  3. 利用したい拡張通知機能を通知に追加します。追加した機能は、ユーザーが通知をクリックしたときに開始する Activity でも利用できることにご注意ください。

通知を管理する

同じタイプのイベントのために通知を複数回発行する場合、そのたびに新しい通知を作成することは避ける必要があります。 新しい通知を作成する代わりに、以前の通知を更新して一部の値を変更することやいくつかの値を追加することを検討してください。

たとえば、Gmail は新しいメールが届いたことを、未読メッセージの数を増やし通知に各メールの概要を追加することで、ユーザーに通知します。 これは、通知の「スタッキング」と呼ばれています。詳細については、通知設計ガイドをご覧ください。

注: この Gmail 機能には、「受信トレイ」の拡張レイアウトが必要です。これは、Android 4.1 以降で利用可能な拡張通知機能の 1 つです。

次のセクションでは、通知の更新方法と通知の削除方法を説明します。

通知を更新する

後で更新できるように通知をセットアップするには、NotificationManager.notify() を呼び出し、通知 ID を指定して通知を発行します。 発行後に通知を更新するには、NotificationCompat.Builder オブジェクトを更新または作成し、そのオブジェクトから Notification オブジェクトをビルドし、以前使用した ID と同じ ID で Notification を発行します。 以前の通知がそのまま表示されている場合は、Notification オブジェクトのコンテンツから、その通知が更新されます。 以前の通知が閉じられている場合は、代わりに新しい通知が作成されます。

次のスニペットでは、発生したイベントの数を反映するために通知が更新されています。 このスニペットは通知をスタックし、概要を表示します。

mNotificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// Sets an ID for the notification, so it can be updated
int notifyID = 1;
mNotifyBuilder = new NotificationCompat.Builder(this)
    .setContentTitle("New Message")
    .setContentText("You've received new messages.")
    .setSmallIcon(R.drawable.ic_notify_status)
numMessages = 0;
// Start of a loop that processes data and then notifies the user
...
    mNotifyBuilder.setContentText(currentText)
        .setNumber(++numMessages);
    // Because the ID remains unchanged, the existing notification is
    // updated.
    mNotificationManager.notify(
            notifyID,
            mNotifyBuilder.build());
...

通知を削除する

次のいずれかが発生するまで、通知は表示され続けます。

アクティビティの開始時にナビゲーションを維持する

通知から Activity を開始する場合、ユーザーが期待するナビゲーション操作を変えないようにする必要があります。 たとえば、 [戻る] がクリックされた場合、アプリケーションの標準的なワークフローでは、ホーム画面に戻る必要があります。また、 [最近使ったアプリ] がクリックされた場合、Activity を別のタスクとして表示する必要があります。 このナビゲーション操作を変えないようにするには、新たなタスクで Activity を開始する必要があります。 PendingIntent を設定して新たなタスクを生成する方法は、開始する Activity の性質によって異なります。 通常は、次の 2 つの場合があります。

通常のアクティビティ
アプリケーションの標準的なワークフローの一部である Activity を開始します。 この場合、PendingIntent を設定して新たなタスクを開始し、PendingIntent にバックスタックを提供します。これにより、アプリケーションの標準的な 「戻る」 動作を再現します。

Gmail アプリからの通知は、このタイプのアクティビティの一例です。1 つの電子メール メッセージの通知をクリックすると、メッセージそれ自体が表示されます。 [戻る] をタップすると、通知から移動してきたのでなくホーム画面から Gmail に移動してきたかのように、Gmail からホーム画面に戻ります。

これは、通知のタップ時に使用していたアプリケーションに関係なく発生します。 たとえば、Gmail でメッセージを作成しているときに、1 つのメールの通知をクリックすると、すぐにそのメールに移動します。 その場合、 [戻る] をタップすると、作成中のメッセージに戻るのではなく、受信トレイ、ホーム画面の順に移動します。

特殊なアクティビティ
ユーザーは、この Activity を、通知から開始した場合のみ見ることができます。 ある意味では、通知自体に表示するのは難しい情報を提供することで、この Activity が通知を拡張しているということができます。 このタイプのアクティビティでは、PendingIntent を設定して新たなタスクを開始します。 ただし、開始した Activity はアプリケーションのアクティビティ フローには含まれていないので、バックスタックを作成する必要はありません。 たとえば、 [戻る] をクリックすると、ユーザーはホーム画面に移動します。

通常のアクティビティの PendingIntent を設定する

ダイレクト エントリの Activity を開始する PendingIntent を設定するには、次の手順に従います。

  1. マニフェストに、アプリケーションの Activity の階層を定義します。
    1. Android 4.0.3 以前へのサポートを追加します。これには、<meta-data> 要素を <activity> の子として追加して、開始する Activity の親を指定します。

      この要素に、android:name="android.support.PARENT_ACTIVITY" を設定します。 <parent_activity_name> が親 <activity> 要素の android:name の値の場合は、android:value="<parent_activity_name>" を設定します。 例については、以下の XML をご覧ください。

    2. また、Android 4.1 以降のサポートを追加します。これには、開始する Activity<activity> 要素に、android:parentActivityName 属性を追加します。

    最終的な XML は、次のようになります。

    <activity
        android:name=".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=".ResultActivity"
        android:parentActivityName=".MainActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity"/>
    </activity>
    
  2. Activity を開始する Intent に基づくバックスタックを作成します。
    1. Activity を開始する Intent を作成します。
    2. TaskStackBuilder.create() を呼び出して、スタック ビルダーを作成します。
    3. addParentStack() を呼び出し、バックスタックをスタック ビルダーに追加します。 マニフェストに定義した階層のそれぞれの Activity ごとに、バックスタックに、Activity を開始する Intent が含まれます。 このメソッドは、新たなタスクでスタックを開始するためのフラグも追加します。

      注: addParentStack() の引数は開始した Activity への参照ですが、このメソッドの呼び出しによって、Activity を開始する Intent が追加されることはありません。 追加は、次の d. で行われます。

    4. addNextIntent() を呼び出して、通知から Activity を開始する Intent を追加します。 a. で作成した Intent を、引数として addNextIntent() に渡します。
    5. 必要に応じて、TaskStackBuilder.editIntentAt() を呼び出し、スタック上の Intent オブジェクトに引数を追加します。 これは、場合によっては、ターゲット Activity に、ユーザーが [戻る] を使って移動したときに、適切なデータが表示されるようにするために必要です。
    6. getPendingIntent() を呼び出し、このバックスタックのための PendingIntent を取得します。 この PendingIntent は、setContentIntent() の引数として使用できます。

次のコード スニペットでは、上記の処理を行っています。

...
Intent resultIntent = new Intent(this, ResultActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// Adds the back stack
stackBuilder.addParentStack(ResultActivity.class);
// Adds the Intent to the top of the stack
stackBuilder.addNextIntent(resultIntent);
// Gets a PendingIntent containing the entire back stack
PendingIntent resultPendingIntent =
        stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
...
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager =
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(id, builder.build());

特殊なアクティビティの PendingIntent を設定する

次のセクションでは、特殊なアクティビティのための PendingIntent の設定方法を説明します。

特殊な Activity はバックスタックを必要としません。そのため、マニフェストにその Activity の階層を定義する必要はありません。また、バックスタックを作成するために addParentStack() を呼び出す必要もありません。 代わりに、マニフェストを利用して Activity のタスク オプションを設定し、getActivity() を呼び出して PendingIntent を作成します。

  1. マニフェストで、Activity<activity> 要素に、次の属性を追加します。
    android:name="activityclass"
    アクティビティの完全修飾クラス名。
    android:taskAffinity=""
    コードにセットした FLAG_ACTIVITY_NEW_TASK フラグと組み合わせて、Activity がアプリケーションのデフォルトのタスクに入ることがないようにします。 アプリケーションのアフィニティがデフォルトのままの既存タスクは影響を受けません。
    android:excludeFromRecents="true"
    新しいタスクを、 [最近使ったアプリ] から除外し、ユーザーが新しいタスクに間違って戻ることがないようにします。

    次のスニペットは、この要素を示しています。

    <activity
        android:name=".ResultActivity"
    ...
        android:launchMode="singleTask"
        android:taskAffinity=""
        android:excludeFromRecents="true">
    </activity>
    ...
    
  2. 通知をビルドし発行します。
    1. Activity を開始する Intent を作成します。
    2. フラグ FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TASK を指定して setFlags() を呼び出し、Activity を新しい空のタスクで開始するように設定します。
    3. Intent に、必要に応じてオプションを設定します。
    4. getActivity() を呼び出し、Intent から PendingIntent を作成します。 この PendingIntent は、setContentIntent() の引数として使用できます。

    次のコード スニペットでは、上記の処理を行っています。

    // Instantiate a Builder object.
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    // Creates an Intent for the Activity
    Intent notifyIntent =
            new Intent(this, ResultActivity.class);
    // Sets the Activity to start in a new, empty task
    notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                            | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    // Creates the PendingIntent
    PendingIntent notifyPendingIntent =
            PendingIntent.getActivity(
            this,
            0,
            notifyIntent,
            PendingIntent.FLAG_UPDATE_CURRENT
    );
    
    // Puts the PendingIntent into the notification builder
    builder.setContentIntent(notifyPendingIntent);
    // Notifications are issued by sending them to the
    // NotificationManager system service.
    NotificationManager mNotificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    // Builds an anonymous Notification object from the builder, and
    // passes it to the NotificationManager
    mNotificationManager.notify(id, builder.build());
    

通知に進捗状況を表示する

通知には、進行中の処理の状況をユーザーに示すアニメーション表示の進捗インジケーターを表示できます。 その処理にどれくらいの時間がかかるかと、ある時点でその処理がどれだけ完了しているかを見積もることができる場合、「確定(determinate)」タイプのインジケーター(プログレスバー)を使用します。 処理にかかる時間を見積もることができない場合は、「不確定(indeterminate)」タイプのインジケーター(アクティビティ インジケーター)を使用します。

進捗インジケーターは、ProgressBar クラスのプラットフォーム実装で表示されます。

Android 4.0 以降のプラットフォーム上で進捗インジケーターを使用するには、setProgress() を呼び出します。 それ以前のバージョンでは、ProgressBar ビューを含むカスタム通知レイアウトを作成する必要があります。

次のセクションでは、setProgress() を使用して、通知に進捗状況を表示する方法を説明します。

範囲固定の進捗インジケーターを表示する

確定プログレスバーを表示するには、setProgress(max, progress, false) を呼び出して通知にバーを追加してから、その通知を発行します。 処理の進行に合わせて、progress の値を増やし、通知を更新します。 処理の最後には、progressmax と等しくなります。 setProgress() を呼び出す一般的な方法は、max に 100 を設定して、処理の「進捗度」の値である progress の値を増やすことです。

処理の完了時には、プログレスバーを表示したままにすることも、削除することもできます。いずれの場合でも、通知のテキストを更新して、処理が完了したことを示すことを忘れないでください。 プログレスバーを削除するには、setProgress(0, 0, false) を呼び出します。 次に例を示します。

...
mNotifyManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mBuilder = new NotificationCompat.Builder(this);
mBuilder.setContentTitle("Picture Download")
    .setContentText("Download in progress")
    .setSmallIcon(R.drawable.ic_notification);
// Start a lengthy operation in a background thread
new Thread(
    new Runnable() {
        @Override
        public void run() {
            int incr;
            // Do the "lengthy" operation 20 times
            for (incr = 0; incr <= 100; incr+=5) {
                    // Sets the progress indicator to a max value, the
                    // current completion percentage, and "determinate"
                    // state
                    mBuilder.setProgress(100, incr, false);
                    // Displays the progress bar for the first time.
                    mNotifyManager.notify(0, mBuilder.build());
                        // Sleeps the thread, simulating an operation
                        // that takes time
                        try {
                            // Sleep for 5 seconds
                            Thread.sleep(5*1000);
                        } catch (InterruptedException e) {
                            Log.d(TAG, "sleep failure");
                        }
            }
            // When the loop is finished, updates the notification
            mBuilder.setContentText("Download complete")
            // Removes the progress bar
                    .setProgress(0,0,false);
            mNotifyManager.notify(ID, mBuilder.build());
        }
    }
// Starts the thread by calling the run() method in its Runnable
).start();

進行中アクティビティ インジケーターを表示する

不確定アクティビティ インジケーターを表示するには、setProgress(0, 0, true)(最初の 2 つの引数は無視されます)を使用して通知に追加し、通知を発行します。 このインジケーターの外見は、アニメーションが常時表示されていること以外はプログレスバーと同じです。

処理の開始時に通知を発行します。通知を変更するまで、アニメーションは表示され続けます。 処理が完了したら、setProgress(0, 0, false) を呼び出し、次に通知を更新してアクティビティ インジケーターを削除します。 この操作を行わないと、処理が完了してもアニメーションが表示され続けることになります。また、通知のテキストを更新して、処理が完了したことを示すことを忘れないでください。

アクティビティ インジケーターの仕組みについては、上記のスニペットをご覧ください。次のコード行を探します。

// Sets the progress indicator to a max value, the current completion
// percentage, and "determinate" state
mBuilder.setProgress(100, incr, false);
// Issues the notification
mNotifyManager.notify(0, mBuilder.build());

見つけたコードを次のコードに置き換えます。

 // Sets an activity indicator for an operation of indeterminate length
mBuilder.setProgress(0, 0, true);
// Issues the notification
mNotifyManager.notify(0, mBuilder.build());

通知メタデータ

通知は、次の NotificationCompat.Builder メソッドを使用して割り当てるメタデータによって、ソートされることがあります。

図 3. ヘッドアップ通知を表示する全画面アクティビティ

ヘッドアップ通知

Android 5.0(API レベル 21)では、端末がアクティブな場合(端末がロックされておらず、画面がオンになっている場合)に、小さなフローティング ウィンドウ(ヘッドアップ通知とも呼ばれます)に通知を表示することができます。 これらの通知は、ヘッドアップ通知がアクション ボタンも表示すること以外は、通知をコンパクトにしたものと同じように表示されます。 使用中のアプリから移動しなくても、ユーザーは、ヘッドアップ通知に反応したりヘッドアップ通知を閉じたりすることができます。

ヘッドアップ通知のトリガーとなる条件には、たとえば以下のようなものがあります。

ロック画面通知

Android 5.0(API レベル 21)では、通知をロック画面に表示できるようになりました。 アプリは、この機能を利用してメディア再生コントロールやその他の一般的なアクションを提供できます。 ユーザーは設定でロック画面に通知を表示するかどうか選ぶことができます。また、開発者も、アプリからの通知をロック画面に表示するかどうか指定できます。

可視性を設定する

アプリでは、保護されたロック画面に表示される通知の表示の詳細レベルをコントロールできます。 setVisibility() を呼び出し、次の値のいずれかを指定してください。

VISIBILITY_PRIVATE を設定すると、特定の内容を非表示にした代替バージョンの通知コンテンツを提供できます。 たとえば、SMS アプリで 3 件の新しいテキスト メッセージがあることを示す通知を表示する場合に、メッセージ コンテンツと送信者を非表示にできます。 この代替通知を提供するには、NotificationCompat.Builder を使用してまず置換用の通知を作成し、 プライベート通知オブジェクトを作成したら、その置換用の通知をプライベート通知オブジェクトに setPublicVersion() メソッドを使用してアタッチしてください。

ロック画面でのメディア再生をコントロールする

Android 5.0(API レベル 21)では、RemoteControlClient を使用したメディア コントロールは、ロック画面に表示されません。このクラスは廃止済みです。 代わりに、Notification.MediaStyle テンプレートと addAction() メソッドを使用します。このメソッドは、アクションをクリックできるアイコンに変換します。

注: このテンプレートと addAction() メソッドはサポート ライブラリには含まれません。そのため、これらの機能は Android 5.0 以降でのみ動作します。

Android 5.0 でロック画面にメディア再生コントロールを表示するには、可視性を上記のVISIBILITY_PUBLIC に設定します。 その後、次のサンプルコードに従って、アクションを追加し Notification.MediaStyle テンプレートを設定します。

Notification notification = new Notification.Builder(context)
    // Show controls on lock screen even when user hides sensitive content.
    .setVisibility(Notification.VISIBILITY_PUBLIC)
    .setSmallIcon(R.drawable.ic_stat_player)
    // Add media control buttons that invoke intents in your media service
    .addAction(R.drawable.ic_prev, "Previous", prevPendingIntent) // #0
    .addAction(R.drawable.ic_pause, "Pause", pausePendingIntent)  // #1
    .addAction(R.drawable.ic_next, "Next", nextPendingIntent)     // #2
    // Apply the media style template
    .setStyle(new Notification.MediaStyle()
    .setShowActionsInCompactView(1 /* #1: pause button */)
    .setMediaSession(mMediaSession.getSessionToken())
    .setContentTitle("Wonderful music")
    .setContentText("My Awesome Band")
    .setLargeIcon(albumArtBitmap)
    .build();

注: RemoteControlClient の廃止は、他の点でもメディアのコントロールに影響を与えています。 新しい API でのメディア セッションの管理と再生のコントロールの詳細については、メディア再生コントロールをご覧ください。

カスタム通知レイアウト

通知フレームワークでは、カスタム通知レイアウトを定義することができます。カスタム通知レイアウトは、RemoteViews オブジェクトに通知の外観を定義します。 カスタム レイアウトの通知は通常の通知と似ていますが、XML レイアウト ファイルに定義された RemoteViews が使用されています。

カスタム通知レイアウトで使用できる高さは、通知ビューによって異なります。標準ビュー レイアウトでは 64 dp までで、拡張ビュー レイアウトでは 256 dp までです。

カスタム通知レイアウトを定義するには、まず、XML レイアウト ファイルをインフレートする RemoteViews オブジェクトのインスタンスを作成します。 次に、setContentTitle() などのメソッドを呼び出す代わりに、setContent() を呼び出します。 コンテンツの詳細をカスタム通知に設定するには、RemoteViews のメソッドを使用してビューの子の値を設定します。

  1. 別ファイルに通知の XML レイアウトを作成します。ファイル名はどのような名前でもかまいませんが、拡張子は必ず .xml にします。
  2. アプリで、RemoteViews メソッドを使用して、通知のアイコンとテキストを定義します。 setContent() を呼び出して、この RemoteViews オブジェクトを NotificationCompat.Builder にセットします。 RemoteViews オブジェクトに背景 Drawable を設定することは避けてください。文字が読めなくなる場合があります。

RemoteViews クラスには、通知のレイアウトに ChronometerProgressBar を簡単に追加できるメソッドも含まれています。 通知のカスタム レイアウトの作成についての詳細は、RemoteViews のリファレンスをご覧ください。

警告: カスタム通知レイアウトを使用する場合、そのカスタム通知レイアウトがさまざまな画面の向きと解像度で適切に表示されるかどうか、十分に注意してください。 すべてのビュー レイアウトでさまざまな画面の向きと解像度への対応に注意する必要がありますが、通知ドロワーのスペースが限られているため、通知では特に注意する必要があります。 カスタム レイアウトは複雑にし過ぎないようにしてください。また、必ずさまざまな構成でテストするようにしてください。

カスタム通知のテキストにスタイル リソースを使用する

カスタム通知のテキストには、必ずスタイル リソースを使用してください。通知の背景色は端末やバージョンによって異なりますが、スタイル リソースを使用することで、この問題に対処できます。 Android 2.3 以降では、標準の通知レイアウトのテキストのスタイルは、システムによって定義されています。 Android 2.3 以降を対象とするアプリケーションで同じスタイルを使用する場合は、表示される背景でテキストを読むことができるかご確認ください。

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience.
(Sep 2017 survey)