Android でのローカル通知

このセクションでは、Xamarin.Android でローカル通知を実装する方法について説明します。 Android 通知のさまざまな UI 要素について説明し、通知の作成と表示に関連する API について説明します。

ローカル通知の概要

Android には、通知アイコンと通知情報をユーザーに表示するための 2 つのシステム制御領域が用意されています。 通知が最初に発行されると、次のスクリーンショットに示すように、そのアイコンが 通知領域に表示されます。

デバイスの通知領域の例

通知に関する詳細を取得するために、ユーザーは通知ドロワーを開き (各通知アイコンを展開して通知コンテンツを表示します)、通知に関連付けられているすべてのアクションを実行できます。 次のスクリーンショットは、上記の通知領域に対応する通知 ドロワー を示しています。

3 つの通知を表示する通知ドロワーの例

Android 通知では、次の 2 種類のレイアウトが使用されます。

  • 基本レイアウト – コンパクトで固定されたプレゼンテーション形式。

  • 展開レイアウト – より大きなサイズに展開して詳細情報を表示できるプレゼンテーション形式。

これらの各レイアウトの種類 (およびそれらを作成する方法) については、次のセクションで説明します。

注意

このガイドでは、Android サポート ライブラリNotificationCompat API に焦点を当てています。 これらの API により、Android 4.0 (API レベル 14) との下位互換性が最大限に確保されます。

基本レイアウト

すべての Android 通知は、基本レイアウト形式に基づいて構築されています。少なくとも、次の要素が含まれます。

  1. 元のアプリを表す 通知アイコン。アプリがさまざまな種類の通知をサポートしている場合は通知の種類を表します。

  2. 通知の タイトル、または通知が個人用メッセージの場合は送信者の名前。

  3. 通知メッセージ。

  4. タイムスタンプ

これらの要素は、次の図に示すように表示されます。

通知要素の場所

基本レイアウトの高さは、密度に依存しない 64 ピクセル (dp) に制限されます。 Android では、この基本的な通知スタイルが既定で作成されます。

必要に応じて、通知には、アプリケーションまたは送信者の写真を表す大きなアイコンを表示できます。 Android 5.0 以降の通知で大きなアイコンを使用すると、小さな通知アイコンが大きなアイコンの上にバッジとして表示されます。

簡単な通知写真

Android 5.0 以降では、通知をロック画面に表示することもできます。

ロック画面通知の例

ユーザーは、ロック画面の通知をダブルタップしてデバイスのロックを解除し、その通知を開始したアプリにジャンプするか、スワイプして通知を閉じます。 アプリは、通知の表示レベルを設定してロック画面に表示される内容を制御でき、ユーザーはロック画面の通知に機密性の高いコンテンツを表示するかどうかを選択できます。

Android 5.0 では 、ヘッドアップと呼ばれる優先度の高い通知プレゼンテーション形式が導入されました。 ヘッドアップ通知は画面の上部から数秒間下にスライドし、通知領域に戻ります。

ヘッドアップ通知の例

ヘッドアップ通知により、システム UI は、現在実行中のアクティビティの状態を中断することなく、ユーザーの前に重要な情報を配置できます。

Android には通知メタデータのサポートが含まれているため、通知をインテリジェントに並べ替えたり表示したりできます。 通知メタデータは、ロック画面とヘッドアップ形式での通知の表示方法も制御します。 アプリケーションでは、次の種類の通知メタデータを設定できます。

  • 優先度 – 優先度レベルによって、通知の表示方法とタイミングが決まります。 たとえば、Android 5.0 では、優先度の高い通知がヘッドアップ通知として表示されます。

  • 可視性 – 通知がロック画面に表示されたときに表示される通知コンテンツの量を指定します。

  • カテゴリ – デバイスが 応答不可 モードの場合など、さまざまな状況で通知を処理する方法をシステムに通知します。

注意

可視性カテゴリ は Android 5.0 で導入され、以前のバージョンの Android では使用できません。 Android 8.0 以降では、 通知チャネル を使用して、ユーザーに通知を表示する方法を制御します。

展開されたレイアウト

Android 4.1 以降では、ユーザーが通知の高さを拡張してより多くのコンテンツを表示できるようにする拡張レイアウト スタイルを使用して通知を構成できます。 たとえば、次の例は、コントラクト モードでの展開されたレイアウト通知を示しています。

契約済み通知

この通知が展開されると、メッセージ全体が表示されます。

拡張通知

Android では、単一イベント通知に対して 3 つの拡張レイアウト スタイルがサポートされています。

  • ビッグ テキスト – コントラクト モードでは、メッセージの最初の行の抜粋と 2 つのピリオドが表示されます。 展開モードでは、 はメッセージ全体を表示します (上記の例を参照)。

  • 受信トレイ – コントラクト モードでは、新しいメッセージの数が表示されます。 展開モードでは、受信トレイに最初のメール メッセージまたはメッセージの一覧が表示されます。

  • イメージ – コントラクト モードでは、メッセージ テキストのみが表示されます。 展開モードでは、テキストと画像が表示されます。

基本的な通知 (この記事の後半) では、 ビッグ テキスト受信トレイ画像 の通知を作成する方法について説明します。

通知チャネル

Android 8.0 (Oreo) 以降では、 通知チャネル 機能を使用して、表示する通知の種類ごとにユーザーがカスタマイズできるチャネルを作成できます。 通知チャネルを使用すると、チャネルに投稿されたすべての通知が同じ動作になるように通知をグループ化できます。 たとえば、すぐに注意を払う必要がある通知を目的とした通知チャネルと、情報メッセージに使用される別の "静かな" チャネルがあるとします。

Android Oreo と共にインストールされた YouTube アプリには、 通知のダウンロード一般的な通知という 2 つの通知カテゴリが一覧表示されます。

Android Oreo の YouTube の通知画面

これらの各カテゴリは、通知チャネルに対応しています。 YouTube アプリは、 ダウンロード通知 チャネルと 一般的な通知チャネルを 実装します。 ユーザーは 、[ 通知のダウンロード] をタップすると、アプリのダウンロード通知チャネルの設定画面が表示されます。

YouTube アプリの通知をダウンロードする画面

この画面では、ユーザーは次の操作を行って、 通知のダウンロード チャネルの動作を変更できます。

  • [重要度] レベルを [緊急]、[ 高]、[ ]、または [ ] に設定します。これにより、サウンドと視覚的な中断のレベルが構成されます。

  • 通知ドットをオンまたはオフにします。

  • 点滅するライトのオンとオフを切り替えます。

  • ロック画面で通知を表示または非表示にします。

  • [ 応答不可 ] 設定をオーバーライドします。

[全般通知] チャネルには、次のような設定があります。

YouTube アプリの一般的な通知画面

通知チャネルがユーザーとやり取りする方法を完全に制御していないことに注意してください。ユーザーは、上のスクリーンショットに示すように、デバイス上の通知チャネルの設定を変更できます。 ただし、既定値は構成できます (以下で説明します)。 これらの例が示すように、新しい通知チャネル機能を使用すると、ユーザーはさまざまな種類の通知をきめ細かく制御できます。

通知の作成

Android で通知を作成するには、Xamarin.Android.Support.v4 NuGet パッケージの NotificationCompat.Builder クラスを使用します。 このクラスを使用すると、古いバージョンの Android で通知を作成して発行できます。 NotificationCompat.Builder についても説明します。

NotificationCompat.Builder には、次のような通知のさまざまなオプションを設定するためのメソッドが用意されています。

  • タイトル、メッセージ テキスト、通知アイコンなどのコンテンツ。

  • 通知のスタイル ( ビッグ テキスト受信トレイ画像 スタイルなど)。

  • 通知の優先度:最小、低、既定、高、または最大値。 Android 8.0 以降では、 優先度は通知チャネルを介して設定されます。

  • ロック画面での通知の可視性:パブリック、プライベート、またはシークレット。

  • Android による通知の分類とフィルター処理に役立つカテゴリ メタデータ。

  • 通知がタップされたときに起動するアクティビティを示す省略可能な意図。

  • 通知が公開される通知チャネルの ID (Android 8.0 以降)。

ビルダーでこれらのオプションを設定した後、設定を含む通知オブジェクトを生成します。 通知を発行するには、この通知オブジェクトを Notification Manager に渡します。 Android には NotificationManager クラスが用意されています。このクラスは、通知を発行してユーザーに表示する役割を担います。 このクラスへの参照は、アクティビティやサービスなどの任意のコンテキストから取得できます。

通知チャネルの作成

Android 8.0 で実行されているアプリでは、通知用の通知チャネルを作成する必要があります。 通知チャネルには、次の 3 つの情報が必要です。

  • チャネルを識別するパッケージに固有の ID 文字列。
  • ユーザーに表示されるチャネルの名前。 名前は 1 から 40 文字にする必要があります。
  • チャネルの重要度。

アプリは、実行されている Android のバージョンをチェックする必要があります。 Android 8.0 より前のバージョンを実行しているデバイスでは、通知チャネルを作成しないでください。 次のメソッドは、アクティビティで通知チャネルを作成する方法の 1 つの例です。

void CreateNotificationChannel()
{
    if (Build.VERSION.SdkInt < BuildVersionCodes.O)
    {
        // Notification channels are new in API 26 (and not a part of the
        // support library). There is no need to create a notification
        // channel on older versions of Android.
        return;
    }

    var channelName = Resources.GetString(Resource.String.channel_name);
    var channelDescription = GetString(Resource.String.channel_description);
    var channel = new NotificationChannel(CHANNEL_ID, channelName, NotificationImportance.Default)
                  {
                      Description = channelDescription
                  };

    var notificationManager = (NotificationManager) GetSystemService(NotificationService);
    notificationManager.CreateNotificationChannel(channel);
}

通知チャネルは、アクティビティが作成されるたびに作成する必要があります。 メソッドの CreateNotificationChannel 場合は、アクティビティの メソッドで OnCreate 呼び出す必要があります。

通知の作成と発行

Android で通知を生成するには、次の手順に従います。

  1. NotificationCompat.Builder オブジェクトをインスタンス化します。

  2. 通知オプションを設定するには、 NotificationCompat.Builder オブジェクトのさまざまなメソッドを呼び出します。

  3. オブジェクトの Build メソッドを NotificationCompat.Builder 呼び出して、通知オブジェクトをインスタンス化します。

  4. 通知マネージャーの Notify メソッドを呼び出して、通知を発行します。

通知ごとに、少なくとも次の情報を指定する必要があります。

  • 小さいアイコン (サイズは 24 x 24 dp)

  • 短いタイトル

  • 通知のテキスト

次のコード例は、 を使用 NotificationCompat.Builder して基本的な通知を生成する方法を示しています。 メソッドではメソッド チェーンがサポートされていることNotificationCompat.Builderに注意してください。つまり、各メソッドはビルダー オブジェクトを返すので、最後のメソッド呼び出しの結果を使用して次のメソッド呼び出しを呼び出すことができます。

// Instantiate the builder and set notification elements:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
    .SetContentTitle ("Sample Notification")
    .SetContentText ("Hello World! This is my first notification!")
    .SetSmallIcon (Resource.Drawable.ic_notification);

// Build the notification:
Notification notification = builder.Build();

// Get the notification manager:
NotificationManager notificationManager =
    GetSystemService (Context.NotificationService) as NotificationManager;

// Publish the notification:
const int notificationId = 0;
notificationManager.Notify (notificationId, notification);

この例では、 というbuilder新しいNotificationCompat.Builderオブジェクトが、使用する通知チャネルの ID と共にインスタンス化されます。 通知のタイトルとテキストが設定され、通知アイコンが Resources/drawable/ic_notification.pngから読み込まれます。 通知ビルダー Build の メソッドを呼び出すと、これらの設定を使用して通知オブジェクトが作成されます。 次の手順では、通知マネージャーの Notify メソッドを呼び出します。 通知マネージャーを見つけるには、上記のように を呼び出 GetSystemServiceします。

メソッドは Notify 、通知識別子と通知オブジェクトの 2 つのパラメーターを受け取ります。 通知識別子は、アプリケーションへの通知を識別する一意の整数です。 この例では、通知識別子は 0 (0) に設定されています。ただし、運用アプリケーションでは、各通知に一意の識別子を指定する必要があります。 の呼び出し Notify で前の識別子値を再利用すると、最後の通知が上書きされます。

このコードが Android 5.0 デバイスで実行されると、次の例のような通知が生成されます。

サンプル コードの通知結果

通知アイコンは通知の左側に表示されます。円で囲まれた "i" のこの画像にはアルファ チャネルがあるため、Android はその背後に灰色の円形の背景を描画できます。 アルファ チャネルのないアイコンを指定することもできます。 写真画像をアイコンとして表示するには、このトピックで後述する 「大きなアイコン形式 」を参照してください。

タイムスタンプは自動的に設定されますが、通知ビルダーの SetWhen メソッドを呼び出すことで、この設定をオーバーライドできます。 たとえば、次のコード例では、タイムスタンプを現在の時刻に設定します。

builder.SetWhen (Java.Lang.JavaSystem.CurrentTimeMillis());

音と振動の有効化

通知をサウンドも再生する場合は、通知ビルダーの SetDefaults メソッドを呼び出して、 フラグを NotificationDefaults.Sound 渡します。

// Instantiate the notification builder and enable sound:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
    .SetContentTitle ("Sample Notification")
    .SetContentText ("Hello World! This is my first notification!")
    .SetDefaults (NotificationDefaults.Sound)
    .SetSmallIcon (Resource.Drawable.ic_notification);

この を呼 SetDefaults び出すと、通知が発行されたときにデバイスがサウンドを再生します。 デバイスでサウンドを再生するのではなく振動させる場合は、 にSetDefaults.NotificationDefaults.Vibrateすことができます。デバイスでサウンドを再生してデバイスを振動させる場合は、両方のフラグを にSetDefaults渡すことができます。

builder.SetDefaults (NotificationDefaults.Sound | NotificationDefaults.Vibrate);

再生するサウンドを指定せずにサウンドを有効にすると、Android では既定のシステム通知サウンドが使用されます。 ただし、通知ビルダーの SetSound メソッドを呼び出すことで再生されるサウンドを変更できます。 たとえば、(既定の通知音ではなく) 通知でアラーム音を再生するには、 着信音マネージャー からアラーム音の URI を取得し、 に SetSound渡します。

builder.SetSound (RingtoneManager.GetDefaultUri(RingtoneType.Alarm));

または、通知にシステムの既定の着信音音を使用することもできます。

builder.SetSound (RingtoneManager.GetDefaultUri(RingtoneType.Ringtone));

通知オブジェクトを作成した後は、(メソッドを使用して事前に構成するのではなく) 通知オブジェクトに通知プロパティを NotificationCompat.Builder 設定できます。 たとえば、 メソッドを SetDefaults 呼び出して通知の振動を有効にする代わりに、通知の Defaults プロパティのビット フラグを直接変更できます。

// Build the notification:
Notification notification = builder.Build();

// Turn on vibrate:
notification.Defaults |= NotificationDefaults.Vibrate;

この例では、通知が発行されたときにデバイスが振動します。

通知の更新

通知の発行後に通知の内容を更新する場合は、既存 NotificationCompat.Builder のオブジェクトを再利用して新しい通知オブジェクトを作成し、最後の通知の識別子を使用してこの通知を発行できます。 次に例を示します。

// Update the existing notification builder content:
builder.SetContentTitle ("Updated Notification");
builder.SetContentText ("Changed to this message.");

// Build a notification object with updated content:
notification = builder.Build();

// Publish the new notification with the existing ID:
notificationManager.Notify (notificationId, notification);

この例では、既存 NotificationCompat.Builder の オブジェクトを使用して、別のタイトルとメッセージを含む新しい通知オブジェクトを作成します。 新しい通知オブジェクトは、前の通知の識別子を使用して発行され、以前に発行された通知の内容が更新されます。

更新された通知

前の通知の本文が再利用されます。通知が通知ドロワーに表示されている間は、タイトルと通知のテキストのみが変更されます。 タイトル テキストが "サンプル通知" から "更新された通知" に変わり、メッセージ テキストが "Hello World! これは私の最初の通知です。" を "このメッセージに変更しました" にしました。

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

  • ユーザーは通知を閉じます (または [ すべてクリア] をタップします)。

  • アプリケーションは の呼び出しを NotificationManager.Cancel行い、通知が発行されたときに割り当てられた一意の通知 ID を渡します。

  • アプリケーションは を呼び出します NotificationManager.CancelAll

Android 通知の更新の詳細については、「通知の 変更」を参照してください。

通知からのアクティビティの開始

Android では、通知が アクション (ユーザーが通知をタップしたときに起動されるアクティビティ) に関連付けられるのが一般的です。 このアクティビティは、別のアプリケーションまたは別のタスクにも存在できます。 通知にアクションを追加するには、 PendingIntent オブジェクトを作成し、 を PendingIntent 通知に関連付けます。 PendingIntentは、受信者アプリケーションが送信アプリケーションのアクセス許可を持つ定義済みのコードを実行できるようにする特別な種類の意図です。 ユーザーが通知をタップすると、 で指定されたアクティビティが Android によって PendingIntent開始されます。

次のコード スニペットは、MainActivity元のアプリのアクティビティを起動する を使用PendingIntentして通知を作成する方法を示しています。

// Set up an intent so that tapping the notifications returns to this app:
Intent intent = new Intent (this, typeof(MainActivity));

// Create a PendingIntent; we're only using one PendingIntent (ID = 0):
const int pendingIntentId = 0;
PendingIntent pendingIntent =
    PendingIntent.GetActivity (this, pendingIntentId, intent, PendingIntentFlags.OneShot);

// Instantiate the builder and set notification elements, including pending intent:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
    .SetContentIntent (pendingIntent)
    .SetContentTitle ("Sample Notification")
    .SetContentText ("Hello World! This is my first action notification!")
    .SetSmallIcon (Resource.Drawable.ic_notification);

// Build the notification:
Notification notification = builder.Build();

// Get the notification manager:
NotificationManager notificationManager =
    GetSystemService (Context.NotificationService) as NotificationManager;

// Publish the notification:
const int notificationId = 0;
notificationManager.Notify (notificationId, notification);

このコードは、前のセクションの通知コードによく似ていますが、 が通知オブジェクトに追加されている点 PendingIntent が除きます。 この例では、 は、 PendingIntent 通知ビルダーの SetContentIntent メソッドに渡される前に、元のアプリのアクティビティに関連付けられています。 フラグはPendingIntentFlags.OneShot、 が 1 回だけ使用されるように、 メソッドにPendingIntent渡されますPendingIntent.GetActivity。 このコードを実行すると、次の通知が表示されます。

最初のアクション通知

この通知をタップすると、ユーザーは元のアクティビティに戻ります。

運用アプリでは、ユーザーが通知アクティビティ内の [戻る] ボタンを押したときに、アプリでバック スタックを処理する必要があります (Android タスクとバック スタックに慣れていない場合は、「タスクとバック スタック」を参照してください)。 ほとんどの場合、通知アクティビティから後方に移動すると、ユーザーがアプリから戻り、ホーム画面に戻る必要があります。 バック スタックを管理するために、アプリは TaskStackBuilder クラスを使用して、バック スタックを使用して を PendingIntent 作成します。

もう 1 つの実際の考慮事項は、元のアクティビティが通知アクティビティにデータを送信する必要がある場合があるということです。 たとえば、通知はテキスト メッセージが到着したことを示し、通知アクティビティ (メッセージ表示画面) では、メッセージの ID をユーザーに表示する必要があります。 を PendingIntent 作成するアクティビティでは 、Intent.PutExtra メソッドを使用して、このデータが通知アクティビティに渡されるように、データ (文字列など) を意図に追加できます。

次のコード サンプルは、 を使用 TaskStackBuilder してバック スタックを管理する方法を示しており、 という名前 SecondActivityの通知アクティビティに単一のメッセージ文字列を送信する方法の例が含まれています。

// Setup an intent for SecondActivity:
Intent secondIntent = new Intent (this, typeof(SecondActivity));

// Pass some information to SecondActivity:
secondIntent.PutExtra ("message", "Greetings from MainActivity!");

// Create a task stack builder to manage the back stack:
TaskStackBuilder stackBuilder = TaskStackBuilder.Create(this);

// Add all parents of SecondActivity to the stack:
stackBuilder.AddParentStack (Java.Lang.Class.FromType (typeof (SecondActivity)));

// Push the intent that starts SecondActivity onto the stack:
stackBuilder.AddNextIntent (secondIntent);

// Obtain the PendingIntent for launching the task constructed by
// stackbuilder. The pending intent can be used only once (one shot):
const int pendingIntentId = 0;
PendingIntent pendingIntent =
    stackBuilder.GetPendingIntent (pendingIntentId, PendingIntentFlags.OneShot);

// Instantiate the builder and set notification elements, including
// the pending intent:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
    .SetContentIntent (pendingIntent)
    .SetContentTitle ("Sample Notification")
    .SetContentText ("Hello World! This is my second action notification!")
    .SetSmallIcon (Resource.Drawable.ic_notification);

// Build the notification:
Notification notification = builder.Build();

// Get the notification manager:
NotificationManager notificationManager =
    GetSystemService (Context.NotificationService) as NotificationManager;

// Publish the notification:
const int notificationId = 0;
notificationManager.Notify (notificationId, notification);

このコード例では、アプリは 2 つのアクティビティ MainActivity (上記の通知コードを含む) と SecondActivity、ユーザーが通知をタップした後に表示される画面で構成されています。 このコードを実行すると、単純な通知 (前の例と同様) が表示されます。 通知をタップすると、ユーザーが画面に移動 SecondActivity します。

2 番目のアクティビティのスクリーンショット

文字列メッセージ (意図の メソッドに渡されます) は、次の PutExtra コード行を介して で SecondActivity 取得されます。

// Get the message from the intent:
string message = Intent.Extras.GetString ("message", "");

この取得したメッセージ "Greetings from MainActivity!" は、上のスクリーンショットに SecondActivity 示すように画面に表示されます。 でユーザーが [戻る ] ボタンを SecondActivity押すと、ナビゲーションはアプリの外に移動し、アプリの起動前の画面に戻ります。

保留中の意図の作成の詳細については、「 PendingIntent」を参照してください。

基本的な通知を超える

通知は Android では既定で単純な基本レイアウト形式になりますが、追加 NotificationCompat.Builder のメソッド呼び出しを行うことで、この基本的な形式を拡張できます。 このセクションでは、大きな写真アイコンを通知に追加する方法と、展開されたレイアウト通知を作成する方法の例を示します。

大きなアイコンの形式

Android 通知では、通常、発信元アプリのアイコンが (通知の左側に) 表示されます。 ただし、通知では、標準の小さいアイコンではなく、画像または写真 ( 大きなアイコン) を表示できます。 たとえば、メッセージング アプリでは、アプリ アイコンではなく送信者の写真を表示できます。

基本的な Android 5.0 通知の例を次に示します。小さなアプリ アイコンのみが表示されます。

通常の通知の例

大きなアイコンを表示するように変更した後の通知のスクリーンショットを次に示します。Xamarin コード モンキーの画像から作成されたアイコンを使用します。

大きなアイコン通知の例

通知が大きなアイコン形式で表示されると、大きなアイコンの右下隅に小さなアプリ アイコンがバッジとして表示されます。

通知で画像を大きなアイコンとして使用するには、通知ビルダーの SetLargeIcon メソッドを呼び出し、イメージのビットマップを渡します。 とは異なり SetSmallIconSetLargeIcon はビットマップのみを受け入れます。 イメージ ファイルをビットマップに変換するには、 BitmapFactory クラスを使用します。 次に例を示します。

builder.SetLargeIcon (BitmapFactory.DecodeResource (Resources, Resource.Drawable.monkey_icon));

次のコード例では、Resources /drawable/monkey_icon.pngでイメージ ファイルを開き、それをビットマップに変換し、結果のビットマップを に NotificationCompat.Builder渡します。 通常、ソースイメージの解像度は小さなアイコンよりも大きくなりますが、それほど大きくはありません。 画像が大きすぎると、不要なサイズ変更操作が発生し、通知の投稿が遅れる可能性があります。

ビッグ テキスト スタイル

[ビッグ テキスト] スタイルは、長いメッセージを通知に表示するために使用する拡張レイアウト テンプレートです。 すべての展開されたレイアウト通知と同様に、ビッグ テキスト通知は最初はコンパクトなプレゼンテーション形式で表示されます。

ビッグ テキスト通知の例

この形式では、メッセージの抜粋のみが表示され、2 つのピリオドで終了します。 ユーザーが通知を下にドラッグすると、 が展開され、通知メッセージ全体が表示されます。

拡張されたビッグ テキスト通知

この展開されたレイアウト形式には、通知の下部にある概要テキストも含まれます。 ビッグ テキスト通知の最大高さは 256 dp です。

ビッグ テキスト通知を作成するには、前と同様にオブジェクトをNotificationCompat.Builderインスタンス化し、BigTextStyle オブジェクトをインスタンス化してオブジェクトにNotificationCompat.Builder追加します。 たとえば次のようになります。

// Instantiate the Big Text style:
Notification.BigTextStyle textStyle = new Notification.BigTextStyle();

// Fill it with text:
string longTextMessage = "I went up one pair of stairs.";
longTextMessage += " / Just like me. ";
//...
textStyle.BigText (longTextMessage);

// Set the summary text:
textStyle.SetSummaryText ("The summary text goes here.");

// Plug this style into the builder:
builder.SetStyle (textStyle);

// Create the notification and publish it ...

この例では、メッセージ テキストと概要テキストは、 に渡される前に オブジェクト (textStyle) に格納されますBigTextStyleNotificationCompat.Builder.

画像のスタイル

画像スタイル (ビッグ ピクチャ スタイルとも呼ばれます) は、通知の本文に画像を表示するために使用できる拡張通知形式です。 たとえば、スクリーンショット アプリや写真アプリでは、 画像 通知スタイルを使用して、キャプチャされた最後の画像の通知をユーザーに提供できます。 画像通知の最大高さは 256 dp であることに注意してください– Android は、使用可能なメモリの制限内で、この最大高さの制限に収まるように画像のサイズを変更します。

すべての展開されたレイアウト通知と同様に、 画像 通知は最初にコンパクトな形式で表示され、付随するメッセージ テキストの抜粋が表示されます。

画像が表示されないコンパクトな画像通知

ユーザーが 画像 通知を下にドラッグすると、画像が表示されます。 たとえば、前の通知の展開されたバージョンを次に示します。

拡大された画像通知で画像が表示される

通知がコンパクトな形式で表示されると、通知テキスト (前に示したように、通知ビルダーの SetContentText メソッドに渡されるテキスト) が表示されます。 ただし、通知を展開して画像を表示すると、画像の上に概要テキストが表示されます。

イメージ通知を作成するには、前と同様にオブジェクトをNotificationCompat.Builderインスタンス化し、BigPictureStyle オブジェクトを作成してオブジェクトにNotificationCompat.Builder挿入します。 次に例を示します。

// Instantiate the Image (Big Picture) style:
Notification.BigPictureStyle picStyle = new Notification.BigPictureStyle();

// Convert the image to a bitmap before passing it into the style:
picStyle.BigPicture (BitmapFactory.DecodeResource (Resources, Resource.Drawable.x_bldg));

// Set the summary text that will appear with the image:
picStyle.SetSummaryText ("The summary text goes here.");

// Plug this style into the builder:
builder.SetStyle (picStyle);

// Create the notification and publish it ...

SetLargeIconNotificationCompat.Builderメソッドと同様に、 の BigPicture メソッド BigPictureStyle には、通知の本文に表示するイメージのビットマップが必要です。 この例では、 の DecodeResource メソッド BitmapFactory、Resources/drawable/x_bldg.png にあるイメージ ファイルを読み取り、ビットマップに変換します。

また、リソースとしてパッケージ化されていないイメージを表示することもできます。 たとえば、次のサンプル コードでは、ローカル SD カードからイメージを読み込み、イメージ通知に表示します。

// Using the Image (Big Picture) style:
Notification.BigPictureStyle picStyle = new Notification.BigPictureStyle();

// Read an image from the SD card, subsample to half size:
BitmapFactory.Options options = new BitmapFactory.Options();
options.InSampleSize = 2;
string imagePath = "/sdcard/Pictures/my-tshirt.jpg";
picStyle.BigPicture (BitmapFactory.DecodeFile (imagePath, options));

// Set the summary text that will appear with the image:
picStyle.SetSummaryText ("Check out my new T-Shirt!");

// Plug this style into the builder:
builder.SetStyle (picStyle);

// Create notification and publish it ...

この例では、 /sdcard/Pictures/my-tshirt.jpg にあるイメージ ファイルが読み込まれ、元のサイズの半分にサイズ変更され、通知で使用するためにビットマップに変換されます。

通知の T シャツ画像の例

画像ファイルのサイズがわからない場合は、 BitmapFactory.DecodeFile の呼び出しを例外ハンドラー OutOfMemoryError でラップすることをお勧めします。画像が Android でサイズ変更できない場合は例外がスローされる可能性があります。

大きなビットマップ イメージの読み込みとデコードの詳細については、「 大きなビットマップを効率的に読み込む」を参照してください。

受信トレイのスタイル

受信トレイ形式は、通知の本文に個別のテキスト行 (メール受信トレイの概要など) を表示することを目的とした拡張レイアウト テンプレートです。 受信トレイ形式の通知は、最初にコンパクトな形式で表示されます。

コンパクトな受信トレイ通知の例

ユーザーが通知を下にドラッグすると、次のスクリーンショットに示すように、展開されてメールの概要が表示されます。

展開された受信トレイ通知の例

受信トレイ通知を作成するには、前と同様にオブジェクトをNotificationCompat.Builderインスタンス化し、InboxStyle オブジェクトを に追加しますNotificationCompat.Builder。 たとえば次のようになります。

// Instantiate the Inbox style:
Notification.InboxStyle inboxStyle = new Notification.InboxStyle();

// Set the title and text of the notification:
builder.SetContentTitle ("5 new messages");
builder.SetContentText ("chimchim@xamarin.com");

// Generate a message summary for the body of the notification:
inboxStyle.AddLine ("Cheeta: Bananas on sale");
inboxStyle.AddLine ("George: Curious about your blog post");
inboxStyle.AddLine ("Nikko: Need a ride to Evolve?");
inboxStyle.SetSummaryText ("+2 more");

// Plug this style into the builder:
builder.SetStyle (inboxStyle);

通知本文に新しいテキスト行を追加するには、オブジェクトの Addline メソッドを InboxStyle 呼び出します ( 受信トレイ 通知の最大高さは 256 dp です)。 [ビッグ テキスト] スタイルとは異なり、受信トレイ スタイルでは、通知本文で個々のテキスト行がサポートされることに注意してください。

また、個々のテキスト行を展開形式で表示する必要がある通知には 、受信トレイ スタイルを使用することもできます。 たとえば、 受信トレイ の通知スタイルを使用すると、複数の保留中の通知をサマリー通知に結合できます。1 つの 受信トレイ スタイルの通知を、新しい、ほとんど類似した通知の連続ストリームを生成するのではなく、新しい通知コンテンツの行を更新できます (上記の 「通知の更新 」を参照)。

メタデータの構成

NotificationCompat.Builder には、優先度、可視性、カテゴリなど、通知に関するメタデータを設定するために呼び出すことができるメソッドが含まれています。 Android では、この情報とユーザー設定を使用して、通知を表示する方法とタイミングを決定します。

優先度の設定

Android 7.1 以前で実行されているアプリでは、通知自体に直接優先順位を設定する必要があります。 通知の優先度設定によって、通知が発行されたときの 2 つの結果が決まります。

  • 他の通知に関連して通知が表示される場所。 たとえば、優先度の高い通知は、各通知が発行された日時に関係なく、通知ドロワー内の優先度の低い通知より上に表示されます。

  • 通知がヘッドアップ通知形式 (Android 5.0 以降) で表示されるかどうか。 優先度と最大優先度の通知のみがヘッドアップ通知として表示されます。

Xamarin.Android では、通知の優先順位を設定するために次の列挙を定義します。

  • NotificationPriority.Max – 緊急または重大な状態 (着信通話、ターンバイターンの方向、緊急アラートなど) にユーザーに警告します。 Android 5.0 以降のデバイスでは、最大優先度の通知がヘッドアップ形式で表示されます。

  • NotificationPriority.High – 重要なイベント (重要なメールやリアルタイム チャット メッセージの到着など) をユーザーに通知します。 Android 5.0 以降のデバイスでは、優先度の高い通知がヘッドアップ形式で表示されます。

  • NotificationPriority.Default – 重要度が中程度の条件をユーザーに通知します。

  • NotificationPriority.Low – ユーザーに通知する必要がある緊急でない情報 (ソフトウェア更新プログラムのリマインダーやソーシャル ネットワークの更新など)。

  • NotificationPriority.Min – ユーザーが通知を表示するときにのみ通知する背景情報 (場所や気象情報など) の場合。

通知の優先度を設定するには、オブジェクトの SetPriority メソッド NotificationCompat.Builder を呼び出し、優先度レベルを渡します。 次に例を示します。

builder.SetPriority (NotificationPriority.High);

次の例では、優先度の高い通知 "重要なメッセージ!" が通知ドロワーの上部に表示されます。

優先度の高い通知の例

これは優先度の高い通知であるため、Android 5.0 のユーザーの現在のアクティビティ画面の上にヘッドアップ通知としても表示されます。

ヘッドアップ通知の例

次の例では、優先度の低い "当日の思考" 通知が、優先度の高いバッテリ レベルの通知の下に表示されます。

優先度の低い通知の例

"当日の思考" 通知は優先度の低い通知であるため、Android ではヘッドアップ形式では表示されません。

注意

Android 8.0 以降では、通知チャネルとユーザー設定の優先度によって通知の優先度が決まります。

可視性の設定

Android 5.0 以降では、 可視性 設定を使用して、セキュリティで保護されたロック画面に表示される通知コンテンツの量を制御できます。 Xamarin.Android では、通知の可視性を設定するために、次の列挙を定義します。

  • NotificationVisibility.Public – 通知の完全な内容は、セキュリティで保護されたロック画面に表示されます。

  • NotificationVisibility.Private – 重要な情報のみがセキュリティで保護されたロック画面 (通知アイコンと、それを投稿したアプリの名前など) に表示されますが、通知の詳細の残りの部分は非表示になります。 すべての通知の既定値 NotificationVisibility.Privateは です。

  • NotificationVisibility.Secret – セキュリティで保護されたロック画面には何も表示されず、通知アイコンも表示されません。 通知コンテンツは、ユーザーがデバイスのロックを解除した後にのみ使用できます。

通知の可視性を設定するために、アプリは オブジェクトの メソッドをSetVisibilityNotificationCompat.Builder呼び出し、可視性設定を渡します。 たとえば、 を呼び出すと SetVisibility 、 が通知 Privateされます。

builder.SetVisibility (NotificationVisibility.Private);

通知が Private 投稿されると、セキュリティで保護されたロック画面にアプリの名前とアイコンのみが表示されます。 通知メッセージの代わりに、ユーザーに "デバイスのロックを解除してこの通知を表示する" と表示されます。

デバイス通知メッセージのロックを解除する

この例では、 NotificationsLab は元のアプリの名前です。 この修正されたバージョンの通知は、ロック画面がセキュリティで保護されている場合 (つまり、PIN、パターン、またはパスワードで保護されている場合) にのみ表示されます。ロック画面がセキュリティで保護されていない場合、通知の完全な内容はロック画面で使用できます。

カテゴリの設定

Android 5.0 以降では、定義済みのカテゴリをランク付けおよびフィルター処理の通知に使用できます。 Xamarin.Android では、これらのカテゴリに対して次の列挙が提供されます。

  • Notification.CategoryCall – 着信電話。

  • Notification.CategoryMessage – 受信テキスト メッセージ。

  • Notification.CategoryAlarm アラーム状態またはタイマーの有効期限。

  • Notification.CategoryEmail – 受信メール メッセージ。

  • Notification.CategoryEvent – 予定表イベント。

  • Notification.CategoryPromo – プロモーションメッセージまたは広告。

  • Notification.CategoryProgress – バックグラウンド操作の進行状況。

  • Notification.CategorySocial – ソーシャル ネットワーキングの更新.

  • Notification.CategoryError – バックグラウンド操作または認証プロセスの失敗。

  • Notification.CategoryTransport メディア再生の更新。

  • Notification.CategorySystem – システム使用 (システムまたはデバイスの状態) 用に予約されています。

  • Notification.CategoryService – バックグラウンド サービスが実行されていることを示します。

  • Notification.CategoryRecommendation – 現在実行中のアプリに関連するレコメンデーション メッセージ。

  • Notification.CategoryStatus – デバイスに関する情報。

通知が並べ替えられると、通知の優先度がカテゴリ設定よりも優先されます。 たとえば、優先度の高い通知は、カテゴリに属 Promo していてもヘッドアップとして表示されます。 通知のカテゴリを設定するには、オブジェクトの メソッドNotificationCompat.BuilderSetCategory呼び出し、カテゴリ設定を渡します。 次に例を示します。

builder.SetCategory (Notification.CategoryCall);

応答 不可 機能 (Android 5.0 の新機能) は、カテゴリに基づいて通知をフィルター処理します。 たとえば、[設定][応答不可] 画面では、ユーザーは電話やメッセージの通知を除外できます。

画面の切り替えを妨げない

ユーザーが電話を除くすべての割り込みをブロックするように [応答不可] を構成すると (上のスクリーンショットに示すように)、Android では、デバイスが応答不可モードのときに、 のNotification.CategoryCallカテゴリ設定を持つ通知を表示できます。 通知は Notification.CategoryAlarm 応答不可モードではブロック されないこと に注意してください。

LocalNotifications サンプルは、 を使用NotificationCompat.Builderして通知から 2 番目のアクティビティを起動する方法を示しています。 このサンプル コードについては、 Xamarin.Android でのローカル通知の使用に関するチュートリアルを参照 してください。

通知スタイル

でビッグ テキスト画像、または受信トレイのスタイル通知を作成するには、アプリでNotificationCompat.Builderこれらのスタイルの互換性バージョンを使用する必要があります。 たとえば、 ビッグ テキスト スタイルを使用するには、 をインスタンス化 NotificationCompat.BigTextstyleします。

NotificationCompat.BigTextStyle textStyle = new NotificationCompat.BigTextStyle();

// Plug this style into the builder:
builder.SetStyle (textStyle);

同様に、アプリでは、受信トレイスタイルとNotificationCompat.BigPictureStyle画像スタイルに それぞれ と を使用NotificationCompat.InboxStyleできます。

通知の優先度とカテゴリ

NotificationCompat.Builder は、 メソッドを SetPriority サポートしています (Android 4.1 以降で使用できます)。 ただし、SetCategoryカテゴリは Android 5.0 で導入されたNotificationCompat.Builder新しい通知メタデータ システムの一部であるため、 メソッドは でサポートされていません

使用できない古いバージョンの Android SetCategory をサポートするために、コードは実行時に API レベルをチェックして、API レベルが Android 5.0 (API レベル 21) 以上の場合に条件付きで呼び出SetCategoryすことができます。

if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Lollipop) {
    builder.SetCategory (Notification.CategoryEmail);
}

この例では、アプリの Target Framework が Android 5.0 に設定され 、Android の最小バージョンAndroid 4.1 (API レベル 16) に設定されています。 は API レベル 21 以降で使用できるため SetCategory 、このコード例では、使用可能な場合にのみ が呼び出 SetCategory されます。API レベルが 21 未満の場合は呼び出 SetCategory されません。

ロック画面の可視性

Android では、Android 5.0 (API レベル 21) NotificationCompat.Builder より前のロック画面通知はサポートされていないため、 SetVisibility メソッドはサポートされていません。 で前述SetCategoryしたように、コードは実行時に API レベルをチェックし、使用可能な場合にのみ を呼び出SetVisiblityすことができます。

if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Lollipop) {
    builder.SetVisibility (Notification.Public);
}

まとめ

この記事では、Android でローカル通知を作成する方法について説明しました。 通知の構造、通知の作成方法、大きなアイコン、ビッグ テキスト画像受信トレイの形式で通知のスタイルを設定する方法、優先度、可視性、カテゴリなどの通知メタデータ設定を設定する方法、通知からアクティビティを起動する方法について説明しましたNotificationCompat.Builder。 この記事では、これらの通知設定が、Android 5.0 で導入された新しいヘッドアップ、ロック画面、および 応答不可 機能でどのように機能するかについても説明しました。 最後に、 を使用 NotificationCompat.Builder して、以前のバージョンの Android との通知の互換性を維持する方法について学習しました。

Android の通知の設計に関するガイドラインについては、「 通知」を参照してください。