Androidの着信通知の仕様を調査してみた

明けましておめでとうございます!

今年も OPTiM TECH BLOG を宜しくお願い致します。


3回目の投稿になります。医療チームの山口です。
最近、緊急事態宣言により在宅用に持ち帰る開発用スマホ端末が増えて、ちびっ子による社用端末破壊の危険が爆上がりです。

今回の記事は 前回の記事 にて宣言した通り、Androidの着信通知についての続きになります。
疑問に思ったことを実際に動かして挙動を見てみましょう的な調査がメインです。

調査内容

調査内容は以下の4つです。

  • 着信通知がでている間に通常の通知が来たらどうなるの?
  • 通常の通知と着信通知を同じタイミングで一気に出そうとするとどうなるの?
  • 同じアプリで着信通知を2つ出そうとするとどうなるの?
  • 別のアプリでそれぞれ着信通知を出そうとしたらどうなるの?


ソースコードは前回 GitHub に上げていたプロジェクトと同じものを使用し、各調査ごとのブランチを作成しています。
動作確認に使用した端末の OS バージョンは Android 10 と Android 11 です。
実際の挙動は YouTube にアップロードしています。

着信通知がでている間に通常の通知が来たらどうなるの?

ブランチは master そのまま、「着信通知をポスト」ボタンの後に「通知をポスト」ボタンをタップすればよいです。

結果としては Android 10 と Android 11 でそれぞれ挙動の違いを確認しました。

  • Android 10 の場合
    • 着信通知が最前面に表示される、通常の通知は後面に隠れてしまう
    • 通知音(ピコンッ)に上書きされて着信音が停止し、着信音が再生されることはなかった
  • Android 11 の場合
    • 通常の通知が最前面に表示される
      • 通知同士のテキスト表示領域が一致するためか、着信通知のテキストが上書きされたように見えてしまう
      • ただし、通常の通知は一定時間経過後に仕様通り通知領域内に引っ込むため、一定時間たてばちゃんと着信通知のテキストが見れる
    • 通知音は鳴らずに着信音のまま

今回は Android 10 と Android 11 でしか動作確認をしていませんが、他の Android 9 以下の OS バージョン、もしくは今後リリースされる OS バージョンによって、また挙動が変わってきそうですね。
着信通知が出ている間に通常の通知が来るケースは実運用上レアですが、着信通知がでている間にプッシュがきた場合は記録だけしておいて、着信通知が消えてから通常の通知を出すといった実装にすることが、考慮した実装として正しいのかもしれません。

通常の通知と着信通知を同じタイミングで一気に出そうとするとどうなるの?

この挙動はアプリ側で故意に同時に出すという挙動をしない限りにおいてはほぼありえないのですが、あくまで調査なのでやってみます。
ブランチは test1 で、「通知と着信通知を同時にポスト」ボタンを追加しています。

結果としては先ほどの着信通知がでている間に通常の通知が来た場合の挙動に似ていました。

  • Android 10 の場合
    • 着信通知が最前面に表示される、通常の通知は後面に隠れてしまう
    • 通常の通知と着信通知のポストした順によって、出力される音声が異なる
      • 通常の通知→着信通知の順でポストした場合:通知音が鳴る
      • 着信通知→通常の通知の順でポストした場合:着信音が鳴る
  • Android 11 の場合
    • 通常の通知が最前面に表示される
      • 通知同士のテキスト表示領域が一致するためか、着信通知のテキストが上書きされたように見えてしまう
      • ただし、通常の通知は一定時間経過後に仕様通り通知領域内に引っ込むため、一定時間たてばちゃんと着信通知のテキストが見れる
    • 通常の通知と着信通知のポストした順によって、出力される音声が異なる
      • 通常の通知→着信通知の順でポストした場合:通知音が鳴る
      • 着信通知→通常の通知の順でポストした場合:着信音が鳴る

ちなみにサンプルでは起きないですが、ポストするタイミングによっては着信通知が表示されないこともありました。
着信通知がきている(もしくはきていた)ことを通知として残したい場合は、着信通知と通常の通知を同時に出すのではなく、発信側がキャンセルしたときに着信通知を消すと同時に通常の通知を残すようにしましょう。

同じアプリで着信通知を2つ出そうとするとどうなるの?

ブランチは test2 で、「着信通知2をポスト」ボタンを追加しています。(これ以降はそれぞれの着信通知を「着信通知1」「着信通知2」と表現します。)
着信通知1と着信通知2はそれぞれ区別できようにメッセージを変えており、また Notification ID も違うものを割り当てます。

着信通知1を表示している状態で着信通知2を出そうとするとどうなるかを確認します。
結果としては挙動は以下のようになりました。

  • Android 10
    • 着信通知2は着信通知1の前面に表示される(後発が上)
    • 着信音は一度途切れて、最初から再生される
    • 前面の着信通知2のボタンをタップしても後面の着信通知1は消えない(Notification ID を変えてタップした着信通知のIDのみを消すような実装にしているため消えない)
    • ただし、着信通知2が消えたのと同時に着信音も消えた
  • Android 11
    • 着信通知2は着信通知1の後面に重なる(先発が上)
    • 着信音はそのまま鳴り続ける(着信音が途切れて最初から再生されたり、消えたりすることはなかった)
    • 前面の着信通知1のボタンをタップしても後面の着信通知2は消えない(Notification ID を変えてタップした着信通知のIDのみを消すような実装にしているため消えない)
    • ただし、着信通知1が消えたのと同時に着信音も消えた

別のアプリでそれぞれ着信通知を出そうとしたらどうなるの?

これまでの調査で起こりえたケースはアプリ側で制御できますが、これは異なる2つのアプリなので可能性は低いですが実際に起こりえることです。
ブランチは test3 で、build.gradle にてproductFlavors を定義し、applicationIdSuffix を付与することでパッケージ名を変えることで2つ目の別アプリを実装します。(これ以降は「アプリ1」「アプリ2」と表現します。)

結果としては先ほどの着信通知を2つ出した場合とほぼ同じような挙動になりました。

  • Android 10
    • 着信通知2は着信通知1の前面に表示される(後発が上)
    • 着信音は一度途切れて、最初から再生される
    • 前面の着信通知2のボタンをタップしても後面の着信通知1は消えない(アプリがそもそも違うため、別のアプリの通知を消すことはできない)
    • ただし、着信通知2が消えたのと同時に着信音も消えた
  • Android 11
    • 着信通知2は着信通知1の後面に重なる(先発が上)
    • 着信音はそのまま鳴り続ける(着信音が途切れて最初から再生されたり、消えたりすることはなかった)
    • 前面の着信通知1のボタンをタップしても後面の着信通知2は消えない(アプリがそもそも違うため、別のアプリの通知を消すことはできない)
    • ただし、着信通知1が消えたのと同時に着信音も消えた

調査結果まとめ

調査してわかったことは、「OS のバージョンに挙動が異なるため、一概に『こうなる!』とは言えない」でした。
着信通知が表示されている間は他の通知を出さないように気をつけて実装したほうがバグ回避にもなりそうですね。



オンライン診療ポケットドクターはお手持ちのスマホの AppStore もしくは GooglePlay から無料でダウンロードすることが可能です。

オプティムではエンジニアを募集しています。