デフォルトでは、通知はスマートフォン アプリから ペア設定されているすべてのスマートウォッチにブリッジ(共有)されます。スマートウォッチ アプリを作成する場合、ペア設定されているスマートフォンにもそのアプリが存在すると、ユーザーに通知が重複して届くことがあります。一方はスマートフォン アプリが生成しブリッジした通知、もう一方はスマートウォッチ アプリが生成した通知です。Wear OS には、通知をいつどのようにブリッジするかを制御する機能があります。
通知の重複を避ける
Firebase Cloud Messaging などの外部ソースから通知を作成する場合は、スマートフォン アプリとスマートウォッチ アプリのそれぞれが、独自の 通知をスマートウォッチに表示することがあります。重複を避けるには、スマートウォッチ アプリのブリッジをプログラムで無効にします。
ブリッジタグを使用する
スマートフォン アプリで作成された通知の一部を、スマートウォッチ アプリがインストールされたスマートウォッチにブリッジする場合は、ブリッジタグを設定します。
通知にブリッジタグを設定するには、次のコードサンプルに示すように、
setBridgeTag(String)
メソッドを使用します。
val notification = NotificationCompat.Builder(context, channelId) // ... set other fields ... .extend( NotificationCompat.WearableExtender() .setBridgeTag("tagOne") ) .build()
ブリッジを無効にする
一部の通知またはすべての通知のブリッジを無効にすることができます。ブリッジを選択的に無効にすることをおすすめします。
一部の通知のみのブリッジを無効にする
ブリッジを動的に無効にしたうえで、必要に応じタグに基づいて一部の通知を許可することもできます。たとえば、
tagOne、tagTwo、または tagThree のタグが付いた通知を除くすべての通知のブリッジを無効にするには、次の例に示すように
BridgingConfig
オブジェクトを使用します。
// In this example, bridging is only enabled for tagOne, tagTwo and tagThree. BridgingManager.fromContext(context).setConfig( BridgingConfig.Builder(context, isBridgingEnabled = false) .addExcludedTags(listOf("tagOne", "tagTwo", "tagThree")) .build() )
すべての通知のブリッジを無効にする(非推奨)
スマートフォン アプリからのすべての通知をブリッジしないようにするには、次の例に示すように、スマートウォッチ アプリのマニフェスト ファイルで
<meta-data> エントリを使用します。
<!-- Beware, this can have unintended consequences before the user is signed-in --> <meta-data android:name="com.google.android.wearable.notificationBridgeMode" android:value="NO_BRIDGING" />
消去操作 ID を設定して同様の通知を同期させる
ブリッジモード機能を使用してブリッジを防止している場合、ユーザーのデバイス間で通知の消去操作が同期されません。
ただし、スマートフォンとスマートウォッチの両方で同様の通知が作成された場合は、ユーザーがどちらか一方の通知を消去したときに両方の通知が消去されるようにする必要があります。
NotificationCompat.WearableExtender でグローバルな一意の ID を設定すると、ユーザーが通知を消去したときに、ペア設定されたスマートウォッチ上で同じ ID を持つ他方の通知も消去することができます。
NotificationCompat.WearableExtender クラスには、消去操作 ID
を使用するためのメソッドが用意されています。次に例を示します。
ユーザーが通知を消去すると、同じ消去操作 ID を持つ他のすべての通知がスマートウォッチとスマートフォンから消去されます。消去操作 ID を取得するには、getDismissalId() を使用します。
次の例では、新しい通知に対しグローバルに一意の ID が指定されているため、消去操作が同期されます。
val notification = NotificationCompat.Builder(context, channelId) // ... set other fields ... .extend( NotificationCompat.WearableExtender() .setDismissalId("abc123") ) .build()
ローカルのみの通知
通知の重複を防ぐには、setLocalOnly() を使用して通知をスマートフォンのみにすることもできます。
ただし、このメソッドは、通知を生成したデバイスにのみ表示する必要がある場合にのみ使用してください。 これには、Wear OS デバイスだけでなく、他のウェアラブル デバイスやその他の接続デバイスも含まれます。ローカルのみの通知は、アプリがスマートウォッチにインストールされていない場合でもブリッジされません。
Wear OS とスマートフォンの両方のアプリで通知を作成する場合は、通知の重複を避けるためにこの方法を使用しないでください。代わりに、ブリッジ オプションを使用してください。
たとえば、ユーザーがスマートフォンでファイルをダウンロードし、ダウンロードが完了したことを通知する通知には、ローカルのみの通知を使用します。
通知がブリッジされない場合
次のタイプの通知はブリッジされません。
-
Notification.Builder.setLocalOnly(boolean)で設定されたローカルのみの通知。 -
Notification.Builder.setOngoing(boolean)またはNotification.FLAG_ONGOING_EVENTで設定された進行中の通知。 -
Notification.FLAG_NO_CLEARで設定されたクリア不可の通知。 - 対応するウェアラブル アプリで通知ブリッジを無効にしている 通知。
ブリッジ通知の実装に関する考慮事項
ブリッジした通知を、ウェアラブル デバイスからプッシュまたは削除するのには時間がかかります。通知を設計する際は、こうした遅延によって予期しない動作が起きないようにする必要があります。以下のガイドラインに沿って設計することで、ブリッジ通知と非同期通知を連携させることができます。
- スマートフォンで通知をキャンセルしても、対応する通知がスマートウォッチでキャンセルされるまでに時間がかかることがあります。その間に、ユーザーがその通知に対するペンディング インテントのいずれかを送信する可能性があります。そのため、通知をキャンセルする場合は、通知のペンディング インテントのレシーバを有効なままにしておき、キャンセルされた通知からのペンディング インテントをアプリで引き続き受信するようにします。
- 通知のスタック全体のキャンセルと再トリガーを同時に行わないでください。 実際に変更された通知のみを変更または削除します。 これにより、ウェアラブル デバイスのアップデート時の遅延を回避し、アプリがバッテリー駆動時間に及ぼす影響を軽減できます。
設計に関する注意事項
Wear OS の通知には独自の設計ガイドラインがあります。詳しくは、 Wear OS の設計ガイドラインをご覧ください。