バブルを使用してユーザーが会話に参加できるようにする

バブルを使用すると、会話の内容を簡単に把握したり、会話に参加したりできます。

図 1. チャットのふきだし。

バブルは通知システムに組み込まれています。他のアプリの上にフロートしている ユーザーがどこにいてもフォローできます。バブルを展開すると、 アプリのコンテンツを操作したり 操作したりできます できます。

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

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

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

Bubble API

バブルは通知 API を使用して作成されるため、通知は 正常です通知をバブルとして表示するには、追加データを付加します。

バブルの展開表示は、選択したアクティビティから作成されます。 バブルとして適切に表示されるようにアクティビティを構成します。アクティビティは サイズ変更可能で、 埋め込み。欠けている場合 通知として表示されます。

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

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

アプリが同じタイプのバブルを複数表示する場合(たとえば、異なる連絡先とのチャット スレッドを複数表示する場合)、そのアクティビティは、複数のインスタンスを起動できる必要があります。Android 10 以前を搭載したデバイスでは、 明示的に設定しない限り、通知はバブルとして表示されません。 documentLaunchMode"always"。Android 11 以降では、すべての会話の documentLaunchMode が自動的に "always" に設定されるため、この値を明示的に設定する必要はありません。

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

  1. 通常どおりに通知を作成します。
  2. BubbleMetadata.Builder(PendingIntent, Icon) を呼び出す または BubbleMetadata.Builder(String) BubbleMetadata オブジェクトを作成します。
  3. setBubbleMetadata() を使用して、メタデータを通知に追加します。
  4. Android 11 以降をターゲットとしている場合は、バブルのメタデータまたは通知が共有ショートカットを参照していることを確認してください。
  5. バブルとして表示される通知をキャンセルしないようにアプリを変更します。通知アクティビティがバブルとして起動されたかどうかを確認するには、Activity#isLaunchedFromBubble() を呼び出します。通知をキャンセルすると、画面からバブルが消えます。バブルを開く その通知に関連する通知が自動的に非表示になります。

次の例はそれらの手順を示しています。

Kotlin

// Create a bubble intent.
val target = Intent(context, BubbleActivity::class.java)
val bubbleIntent = PendingIntent.getActivity(context, 0, target, 0 /* flags */)
val category = "com.example.category.IMG_SHARE_TARGET"

val chatPartner = Person.Builder()
    .setName("Chat partner")
    .setImportant(true)
    .build()

// Create a sharing shortcut.
val shortcutId = generateShortcutId()
val shortcut =
   ShortcutInfo.Builder(mContext, shortcutId)
       .setCategories(setOf(category))
       .setIntent(Intent(Intent.ACTION_DEFAULT))
       .setLongLived(true)
       .setShortLabel(chatPartner.name)
       .build()

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

// Create a notification, referencing the sharing shortcut.
val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setBubbleMetadata(bubbleData)
    .setShortcutId(shortcutId)
    .addPerson(chatPartner)

Java

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

private val CATEGORY_TEXT_SHARE_TARGET =
    "com.example.category.IMG_SHARE_TARGET"

Person chatPartner = new Person.Builder()
        .setName("Chat partner")
        .setImportant(true)
        .build();

// Create a sharing shortcut.
private String shortcutId = generateShortcutId();
ShortcutInfo shortcut =
   new ShortcutInfo.Builder(mContext, shortcutId)
       .setCategories(Collections.singleton(CATEGORY_TEXT_SHARE_TARGET))
       .setIntent(Intent(Intent.ACTION_DEFAULT))
       .setLongLived(true)
       .setShortLabel(chatPartner.getName())
       .build();

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

// Create a notification, referencing the sharing shortcut.
Notification.Builder builder =
    new Notification.Builder(mContext, CHANNEL_ID)
        .setContentIntent(contentIntent)
        .setSmallIcon(smallIcon)
        .setBubbleMetadata(bubbleData)
        .setShortcutId(shortcutId)
        .addPerson(chatPartner);

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

展開されたバブルを作成する

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

上記の動作を実現するには、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();

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

バブルが展開されると、コンテンツ アクティビティは通常のプロセスを行います。 ライフサイクルによって フォアグラウンド プロセスになっていない場合は、そのプロセスを開始する必要があります。

バブルを閉じたり閉じたりすると、アクティビティは破棄されます。これにより、 その結果、プロセスがキャッシュに保存された後、その後強制終了されます。 他のフォアグラウンド コンポーネントが実行されている。

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

ユーザーの作業を中断する回数を減らすため、バブルは特定の状況でのみ表示されます。

アプリが Android 11 以降をターゲットにしている場合、会話要件を満たしていない限り、その通知はバブルとして表示されません。アプリが Android 10 以前をターゲットとしている場合、通知がバブルとして表示されるのは、以下の条件のうち、少なくとも 1 つが当てはまる場合に限られます。

これらの条件がいずれも満たされていない場合は、 クリックします。

バブルからアクティビティを起動する

バブルが新しいアクティビティを起動すると、新しいアクティビティは または新規タスク内で、同じタスクおよび同じバブル ウィンドウ内、 起動したバブルが閉じられます。

バブルと同じタスクで新しいアクティビティを起動するには: 1. インテントを起動するときにアクティビティ コンテキスト、activity.startActivity(intent)、1 を使用します。インテントには FLAG_ACTIVITY_NEW_TASK フラグを設定しないでください。

そうしないと、新しいアクティビティが新しいタスクで開始され、バブルが 閉じています。

バブルは特定の会話を表すため、アクティビティは その会話に関連する内容である必要があります。また、バブル内でアクティビティを起動すると、バブルのタスクスタックが増加し、特にナビゲーションに関するユーザー エクスペリエンスが複雑になる可能性があります。

おすすめの方法

  • 重要な通知が来たときなど、重要な通知だけをバブルで送信する ユーザーが明示的にバブルをリクエストした場合に、 説明します。バブルは、実際の画面領域を占有し、他のアプリのコンテンツの上を覆います。
  • バブル通知が通常の通知としても機能することを確認してください。ユーザーがバブルを無効にすると、バブル通知は通常の通知として表示されます。
  • バブル アクティビティで onBackPressed をオーバーライドする場合は、super.onBackPressed を呼び出します。そうしないと、バブルが正しく動作しない可能性があります。

折りたたまれたバブルに更新されたメッセージが届くと、バブルにバッジが表示されます。 未読メッセージを示します。関連するアプリでユーザーがメッセージを開いた場合は、次のようにします。

サンプルアプリ

People サンプルアプリは、バブルを使用する会話型アプリです。デモンストレーションでは、 chatbot を使用しています。実際のアプリでは、バブルは人間によるメッセージに使用します。