Infinito Nirone 7

白羽の矢を刺すスタイル

Android O で WindowManager の振る舞いが変わる

先日の DroidKaigi 2017 で発表した「Building my own debugging tool on overlay」のなかで、WindowManager で取り扱うレイヤについて触れた部分がありますが、Android の次バージョンである O から使用できなくなるレイヤ、代替レイヤについてのアップデートがありますので、こちらにも書き残しておこうと思います。

developer.android.com

developer.android.com

使用できなくなるレイヤ

以下のレイヤは使用できなくなります。

  • TYPE_PHONE
  • TYPE_PRIORITY_PHONE
  • TYPE_SYSTEM_ALERT
  • TYPE_SYSTEM_OVERLAY
  • TYPE_SYSTEM_ERROR

このうち DroidKaigi の発表で取り扱った部分は TYPE_SYSTEM_OVERLAY と TYPE_SYSTEM_ALERT です。ドキュメントを読む限り、引き続き TYPE_SYSTEM_DIALOG は使用できるようです。

代替レイヤ

これらの使用できなくなるレイヤに View を描画しているアプリは、代わりに O から導入される TYPE_APPLICATION_OVERLAY を使わなければなりません。ドキュメント上でも must use とあり、エミュレータで動作を確認したところ、使えなくなったレイヤに描画はできてもタッチイベントは取れなくなっているようです(すべての使えなくなったレイヤで同じかは未検証)。

TYPE_APPLICATION_OVERLAY をつかっているプロセスは優先度が上がるようです。おそらく Service で WindowManager に View を描いている時、startForeground() しなくても visible process として扱ってくれるものと思います。

この TYPE_APPLICATION_OVERLAY については、ステータスバー等のシステムが受け持っている UI の下に位置するようです。システムは TYPE_APPLICATION_OVERLAY にある View を適宜動かしたりリサイズしたりできるようです。また、通知シェード(ドロワーのこと?)から直接 TYPE_APPLICATION_OVERLAY に View を書いているアプリをブロックすることができるとも記載されています。

まとめ

DroidKaigi のセッションでは、Keyguard の上のレイヤに View を置くときはタッチイベント等の入力を受け付けてはいけない話にも触れましたが、この変更では実質 Keyguard 上に View を置くことができなくなるように見えます(TYPE_PRIORITY_PHONE, TYPE_SYSTEM_OVERLAY, TYPE_SYSTEM_ERROR がダメになるので)。オーバーレイ表示そのものがかなり気を遣って実装する必要のあることを考えると、今回のレイヤの整理と挙動の変更はなるほどという感じですが、システムの介入が増える分考慮すべき部分も増えているはずです。