run_prettify.js

2012年11月1日木曜日

Androidユーザー向け 「何となくわかる表示レイヤー講座 ~オーバーレイ表示の仕組み~」

「システムレベルの警告の表示」のパーミッションについて説明する際に、これを分かってもらえると納得できるかなと思ったので書きました。この権限を使うと、任意のビューをオーバーレイ表示できます。

ここでは、ざっくり簡単にAndroidのレイヤーについて解説します。頑張ってかみ砕いたつもりですが、質問などがありましたらご連絡ください。

レイヤーって?

レイヤー層、階層、層にする、層をなす、などの意味を持つ英単語です。ペイントソフトやフォトレタッチソフトなどで、画像を載せる仮想的なシートのことをレイヤということがありますよね。あれをイメージしてもらえると良いです。何層も絵を重ねて最終的に一枚にするイメージです。

例えば?

アプリを起動中にステータスバーをびろーんってすると、通知領域が広がりますよね。あれは、「通知領域のレイヤー」が「アプリのレイヤー」よりも上位にあるからです。上位にあるレイヤーが上にくるので、アプリは隠れて通知領域が表示されます。

どんなレイヤーがあるの?

本当はもっとたくさんありますが、一部を抜粋して簡単に挙げてみます。OSのバージョンごとに違いがあるので、ここでは最新のJBについて取り上げます。下に行くほど上位のレイヤーです。

  1. 通常のアプリ
  2. 着信画面
  3. トースト表示
  4. システムアラート
  5. 文字入力
  6. キーガード
  7. ステータスバー
  8. システムオーバーレイ

例えば、通常のアプリより着信用のレイヤーの方が上なので、電話がくるとすぐ表示されます。スリープ状態から復帰したときに起動中のアプリではなくキーガードが表示されるのも、キーガードのレイヤーが上位にあるからです。

「システムアラート」と「システムオーバーレイ」

何やら分かりづらい「システムアラート」「システムオーバーレイ」なるものがありますね。

システムアラートは、バッテリー残量が少ないよ!って時の警告などに使われるレイヤーです。システムオーバーレイは名前のまんまで、いつでも上に表示できるよってレイヤーです。

この二つは、オーバーレイ表示を行っているアプリが使っているものだと思ってください。二つの違いは「触れるかどうか」と「キーガードより上位かどうか」です。

システムアラートの方は、必要に応じてタッチイベントを取得できますが、キーガード上では表示できません。キーガードよりも下位のレイヤーだからです。

システムオーバーレイにはフォーカスを与えることができません。もしこのレイヤーが触れる場合、キーガードに干渉してしまうからです。

アプリ名を出した方が分かりやすいですね。SwipePadやWave Launcherのスワイプ起動に使われているのがシステムアラートです(たぶん)。Migiuedやババァで使われているのがシステムオーバーレイです(たぶん)。

パーミッション

レイヤーの操作を行うには、「android.permission.SYSTEM_ALERT_WINDOW」(システムレベルの警告の表示)の権限が必要になります。この権限を要求するアプリは、前述のレイヤーを使って、画面に何かしらを表示させる機能を持っているということになります。

この機能の危険性

apkファイルからアプリをインストールする際、「インストール」ボタンの上にオーバーレイ表示が乗っかっていると、インストールボタンが押せません。これはセキュリティ上の仕様です。だって、「インストール」って表示の上に例えば「このファイルを削除する」って表示されちゃったら危ないじゃないですか。なので、apkファイルからインストールする場合は、オーバーレイ表示をするアプリをいったん無効にする必要があります。

このように、この権限は割と危険な部類に入ります。画面いっぱいに真っ黒なシステムアラート(タッチイベントあり)を表示されたら、もう何も操作できなくなります。そんな愉快犯的な人間はそれほどいないとは思いますが、そういった危険もあるということを覚えておいてください。

0 件のコメント:

コメントを投稿