Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

バブル

バブル通知を使用すると、ユーザーはデバイス上のどこからでもマルチタスクを実行できます。バブルは、SYSTEM_ALERT_WINDOW の代わりとなる機能です。

バブルは通知システムに組み込まれています。別のアプリ コンテンツの上にフローティング表示され、ユーザーが画面表示を切り替えても一緒に移動します。バブルを展開すると、そのアプリの機能や情報を表示できます。バブルが不要になったら、折りたたむことが可能です。

デバイスがロックされているときや、アンビエント表示(常時表示ディスプレイ)がアクティブになっているとき、バブルは通常の通知と同じように表示されます。

バブルは、オプトアウト式の機能です。アプリが初めてバブルを表示する際、ユーザーに権限ダイアログが表示され、次の 2 つの選択肢が提示されます。

  • このアプリが表示するバブルをすべてブロック - 通知はブロックされませんが、バブルとして表示されることはありません
  • このアプリが表示するバブルをすべて許可 - BubbleMetaData を使用して送信された通知は、すべてバブルとして表示されます

Bubble API

バブルは Notification API を通じて作成し、通常の通知と同じように送信します。ただし、バブルとして表示するには、追加データを付加する必要があります。

バブルの展開ビューは、デベロッパーが選択したアクティビティから作成されます。適切なバブルとして表示されるようにアクティビティを設定する必要があります。アクティビティの要件として、サイズ変更が可能であること、埋め込み型であること、常にドキュメント UI モードで起動することが求められます。この要件を 1 つでも満たさなかった場合は、バブルではなく、通知として表示されます。

シンプルなバブルを実装する方法を次のコードに示します。

<activity
  android:name=".bubbles.BubbleActivity"
  android:theme="@style/AppTheme.NoActionBar"
  android:label="@string/title_activity_bubble"
  android:allowEmbedded="true"
  android:documentLaunchMode="always"
  android:resizeableActivity="true"
/>

アプリが同一タイプのバブルを複数表示する場合(たとえば、異なる連絡先とのチャット スレッドを複数表示する場合)、そのアクティビティは、複数のインスタンスを起動できる必要があります。documentLaunchMode を「always」に設定してください。

バブルを送信する手順は次のとおりです。

Kotlin

// Create bubble intent
val target = Intent(context, BubbleActivity::class.java)
val bubbleIntent = PendingIntent.getActivity(context, 0, target, 0 /* flags */)

// Create bubble metadata
val bubbleData = Notification.BubbleMetadata.Builder()
    .setDesiredHeight(600)
    .setIcon(Icon.createWithResource(context, R.drawable.icon))
    .setIntent(bubbleIntent)
    .build()

// Create notification
val chatBot = Person.Builder()
    .setBot(true)
    .setName("BubbleBot")
    .setImportant(true)
    .build()

val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setBubbleMetadata(bubbleData)
    .addPerson(chatBot)

Java

// Create bubble intent
Intent target = new Intent(mContext, BubbleActivity.class);
PendingIntent bubbleIntent =
    PendingIntent.getActivity(mContext, 0, target, 0 /* flags */);

// Create bubble metadata
Notification.BubbleMetadata bubbleData =
    new Notification.BubbleMetadata.Builder()
        .setDesiredHeight(600)
        .setIcon(Icon.createWithResource(context, R.drawable.icon))
        .setIntent(bubbleIntent)
        .build();

// Create notification
Person chatBot = new Person.Builder()
        .setBot(true)
        .setName("BubbleBot")
        .setImportant(true)
        .build();

Notification.Builder builder =
    new Notification.Builder(mContext, CHANNEL_ID)
        .setContentIntent(contentIntent)
        .setSmallIcon(smallIcon)
        .setBubbleMetadata(bubbleData)
        .addPerson(chatBot);

バブル送信時に送信元アプリがフォアグラウンドにあった場合、重要度は無視され、バブルは常に表示されます(対象アプリのバブルや通知全般をユーザーがブロックしている場合は除きます)。

展開表示バブルを作成する

バブルは、自動的に展開ビュー状態で表示するように設定できます。ただし、この自動展開機能を使用するのは、たとえば、ユーザーがボタンをタップして新しいチャットを開始するときなど、バブル内に結果が表示されるようなアクションをユーザーが実行した場合に限ることをおすすめします。また、このような場合はさらに、バブル作成時に送信されるバブル開始通知も抑制することをおすすめします。

上記の動作を実現するには、setAutoExpandBubble() メソッドと setSuppressNotification() メソッドでフラグをセットします。

Kotlin

val bubbleMetadata = Notification.BubbleMetadata.Builder()
    .setDesiredHeight(600)
    .setIntent(bubbleIntent)
    .setAutoExpandBubble(true)
    .setSuppressNotification(true)
    .build()

Java

Notification.BubbleMetadata bubbleData =
    new Notification.BubbleMetadata.Builder()
        .setDesiredHeight(600)
        .setIntent(bubbleIntent)
        .setAutoExpandBubble(true)
        .setSuppressNotification(true)
        .build();

バブル コンテンツのライフサイクル

バブルが展開されると、コンテンツ アクティビティは通常のプロセス ライフサイクルを経て、アプリがフォアグラウンド プロセスに移行します(フォアグラウンドになかった場合)。

バブルを折りたたんだ場合や閉じた場合、アクティビティは破棄されます。その結果、対象アプリが別のフォアグラウンド コンポーネントを実行しているかどうかに応じて、バブルのプロセスはキャッシュされ、その後、強制終了されます。

バブルが表示されるタイミング

ユーザーの作業を中断する回数を減らすため、バブルが表示されるのは、以下の条件のうち、少なくとも 1 つが当てはまる場合に限られます。

上記のいずれにも該当しない場合は、通知だけが表示されます。

ベスト プラクティス

  • バブルは、実際の画面領域を占有し、他のアプリのコンテンツの上を覆います。通知をバブルとして送信するのは、進行中の通信など、重要度が高い場合や、ユーザーが明示的にバブル表示をリクエストしているコンテンツの場合だけに限るようにしてください。
  • ユーザーはバブルを無効にできます。その場合、バブル通知は通常の通知として表示されます。そのため、バブル通知を利用する際は、通常の通知としても機能するように設計する必要があります。
  • バブルから起動されるプロセス(アクティビティやダイアログ)は、バブルコンテナ内に表示されます。そのため、バブルはタスクスタックを持つことができます。バブル内に多数の機能やナビゲーションを組み込むと、処理が複雑になります。バブルの機能はできる限り特化して、軽量にすることをおすすめします。