Wear 上の通知のブリッジモード

デフォルトでは、通知は、コンパニオン スマートフォン上のアプリからペア設定されているスマートウォッチにブリッジ(共有)されます。スタンドアロンのスマートウォッチ アプリを作成する場合、コンパニオン スマートフォン アプリが存在すると、これらのアプリによって重複する通知が作成される可能性があります。Wear OS by Google には、こうした通知の重複の問題に対処するための機能が用意されています。

以下の関連リソースもご覧ください。

注: Firebase Cloud Messaging(FCM)を使用すると、通知アラートをデバイスに送信できます。詳しくは、Android、iOS、Chrome にまたがるユーザー エンゲージメントをご覧ください。

デベロッパーは、以下の 1 つ以上の方法を使用して通知の動作を変更することができます。

  • ブリッジの設定をマニフェスト ファイルで指定する
  • ブリッジの設定を実行時に指定する
  • 通知の消去操作がデバイス間で同期されるように消去操作 ID を設定する

ブリッジの設定をマニフェスト ファイルで指定する

アプリの Android マニフェスト ファイルで、対応するスマートフォン アプリからの通知をスマートウォッチにブリッジしないように指定することができます。具体的には、スマートフォン アプリからの通知のブリッジを防止することを目的として、次のようにスマートウォッチ アプリ(スタンドアロンのスマートウォッチ アプリなど)のマニフェスト ファイルで <meta-data> エントリを使用できます。

    com.google.android.wearable.notificationBridgeMode
    

この <meta-data> エントリを <application> 要素の子として追加します。ブリッジを防止するには、このエントリを NO_BRIDGING に設定します。

    <application>
    ...
      <meta-data
        android:name="com.google.android.wearable.notificationBridgeMode"
        android:value="NO_BRIDGING" />
    ...
    </application>
    

<meta-data> エントリを追加しなかった場合、または、値に NO_BRIDGING ではなく BRIDGING を指定した場合は、ブリッジのデフォルトの動作が行われます。

マニフェストで指定されたブリッジの設定は、スマートウォッチ アプリがインストールされるとすぐに有効になります。

ブリッジの設定を実行時に指定する

ブリッジモードの機能を使用すると、実行時にブリッジの設定を指定できます。具体的には、BridgingManager クラスを使用します。

ブリッジモードを設定できるほか、BridgingManager オブジェクトを使用すると、ブリッジモードの対象外の通知に対して必要に応じてタグを設定することができます。具体的には、BridgingConfig オブジェクトを作成して、このセクションの説明どおりに設定します。

実行時にブリッジの設定を指定すると、Android マニフェスト ファイル内のブリッジ関連の設定がオーバーライドされます。

すべての通知のブリッジを無効にする

次のように、すべての通知のブリッジを無効にすることができます。

Kotlin

    BridgingManager.fromContext(context).setConfig(
            BridgingConfig.Builder(context, false).build()
    )
    

Java

    BridgingManager.fromContext(context).setConfig(
      new BridgingConfig.Builder(context, false)
        .build());
    

上記の設定が行われていない場合、ブリッジモードがデフォルトで有効になります。

タグが付けられている通知を除外する

特定のタグが付けられている通知を除くすべての通知のブリッジを無効にすることができます。

たとえば、foobarbaz としてタグ付けされている通知を除くすべての通知のブリッジを無効にすることができます。

Kotlin

    BridgingManager.fromContext(context).setConfig(
            BridgingConfig.Builder(context, false)
                    .addExcludedTags(listOf("foo", "bar", "baz"))
                    .build()
    )
    

Java

    BridgingManager.fromContext(context).setConfig(
      new BridgingConfig.Builder(context, false)
        .addExcludedTags(Arrays.asList("foo", "bar", "baz"))
        .build());
    

また、特定のタグ(foobar など)が付けられている通知を除外することもできます。

Kotlin

    BridgingManager.fromContext(context).setConfig(
            BridgingConfig.Builder(context, false)
                    .addExcludedTag("foo")
                    .addExcludedTag("bar")
                    .build()
    )
    

Java

    BridgingManager.fromContext(context).setConfig(
      new BridgingConfig.Builder(context, false)
        .addExcludedTag("foo")
        .addExcludedTag("bar")
        .build());
    

ブリッジタグを設定する

以下のように setBridgeTag(String) メソッドを使用すると、通知にブリッジタグを設定できます。

Kotlin

    val notification = NotificationCompat.Builder(context, channelId)
            // ... set other fields ...
            .extend(
                    NotificationCompat.WearableExtender()
                            .setBridgeTag("foo")
            )
            .build()
    

Java

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, channelId)
    // ... set other fields ...
      .extend(
        new NotificationCompat.WearableExtender()
          .setBridgeTag("foo"));
      Notification notification = notificationBuilder.build();
    

既存のアプリでブリッジを防止する

既存のアプリでは、アラートの受信時にスマートフォンが接続されていない場合に備えて、ブリッジがすでに無効化されていることがあります。このような場合、スマートウォッチ アプリで通知が消去されたときに、他のデバイスでも通知を消去することをおすすめします。

ブリッジを防止するための既存の方法としては、Notification.Builder クラスを使用して、setLocalOnly メソッドで true を指定する方法があります。

ただし、ブリッジを防止するうえで、この方法はおすすめできません。たとえば、ユーザーがスマートフォン アプリのみをインストールし、対応するスマートウォッチ アプリをインストールしていない場合、setLocalOnly メソッドが有益な通知のブリッジを妨げる可能性があります。また、ペア設定されているスマートウォッチを複数所有しているユーザーが、その一部にしかスマートウォッチ アプリをインストールしていないこともあります。

消去操作 ID を使用して通知の消去操作を同期する

ブリッジモード機能を使用してブリッジを防止している場合、ユーザーのデバイス間で通知の消去操作(キャンセル)が同期されません。NotificationCompat.WearableExtender クラスの以下のメソッドであれば、消去操作 ID を使用できます。

Kotlin

    fun setDismissalId(dismissalId: String): WearableExtender
    fun getDismissalId(): String
    

Java

    public WearableExtender setDismissalId(String dismissalId)
    public String getDismissalId()
    

消去操作の同期を有効にするには、setDismissalId() メソッドを使用します。setDismissalId() メソッドを呼び出すときに、通知ごとにグローバルに一意の ID を文字列として渡します。通知の消去操作が実行されると、同じ消去操作 ID を持つ他のすべての通知がスマートウォッチやコンパニオン スマートフォンから消去されます。消去操作 ID を取得するには、getDismissalId() を使用します。

新しい通知ごとにグローバルに一意の ID を指定することで消去操作の同期を可能にする例を以下に示します。

Kotlin

    val notification = NotificationCompat.Builder(context, channelId)
            // ... set other fields ...
            .extend(
                    NotificationCompat.WearableExtender()
                            .setDismissalId("abc123")
            )
            .build()
    

Java

    NotificationCompat.WearableExtender wearableExtender =
      new NotificationCompat.WearableExtender().setDismissalId("abc123");
    Notification notification = new NotificationCompat.Builder(context)
    // ... set other fields ...
      .extend(wearableExtender)
      .build();
    

消去操作 ID は、スマートウォッチが Android スマートフォンとペア設定されている場合は機能しますが、iPhone とペア設定されている場合は機能しません。

ブリッジ通知に関するおすすめの方法

ブリッジ通知のプッシュや、ウェアラブル デバイスからのブリッジ通知の削除には時間がかかります。通知を設計する際には、こうした遅延によって予期しない動作が起きないようにする必要があります。以下のガイドラインに沿って設計することで、ブリッジ通知と非同期通知を連携させることができます。

  • スマートフォンで通知をキャンセルした場合、スマートウォッチで対応する通知をキャンセルするのにいくらか時間がかかることがあります。その間に、ユーザーがその通知に対するペンディング インテントのいずれかを送信する可能性があります。そのためアプリにおいて、キャンセルされた通知からペンディング インテントを受け取る準備をしておく必要があります。要するに、通知をキャンセルする場合、通知のペンディング インテントのレシーバを有効なままにしておく必要があります。
  • 通知のスタック全体のキャンセルと再トリガーを同時に行わないでください。実際に変更された通知のみを変更または削除します。これにより、ウェアラブル デバイスのアップデート時の遅延を回避し、アプリが電池寿命に及ぼす影響を最小限に抑えることができます。

設計上の考慮事項

Wear OS の通知には独自の設計ガイドラインがあります。詳しくは、マテリアル デザインのページをご覧ください。

  • ペア設定されているスマートフォンから Wear デバイスにブリッジされるすべての通知で展開可能な通知を使用します。
  • Wear OS でサポートされている各種の通知テンプレートをいつ使用するかについては、通知パターンの設計ガイドをご覧ください。
  • Wear 通知のスタイルの設定方法については、通知スタイル設計ガイドをご覧ください。
  • チャットアプリを作成している場合、通知に NotificationCompat.MessagingStyle を使用する必要があります。Wear は、MessagingStyle 通知(addMessage() を参照)に含まれているチャット メッセージを利用することで、展開可能型通知による高度なチャットアプリ機能を実現します。
  • ユーザーが通知に対してすばやく実行できるメイン アクションを追加するには、通知ストリーム内にインライン アクション(setHintDisplayActionInline(true))を追加します。通知ストリーム内にインライン アクションを追加するのに適したユースケースの例としては、テキスト メッセージへの返信、フィットネス アクティビティの停止、メールのアーカイブ化などがあります。
  • MessagingStyle 通知用のスマート リプライ機能(setAllowGeneratedReplies(true))を有効にします。