SlideShare a Scribd company logo
1 of 14
Download to read offline
Androidの表示レイヤーと画面常駐型アプリの話
今回の話


表示レイヤーとは?



任意のレイヤーにViewを表示させる



Viewの挙動を設定する



実装時の注意点
表示レイヤーとは?






Androidの画面は複数の表示レイヤーによって構成されている。
通常のアプリを表示するレイヤーの他にトースト表示用のレイヤーや着
信画面用のレイヤーなどがある。
レイヤーによって表示順やフォーカスが当てられるかなど挙動が決まっ
ている。



通知バーやロック画面より上に表示されるレイヤーもある。



アプリから任意のレイヤーにViewを置く事も出来る。
主なレイヤーの種類
(WindowManager.LayoutParamsの定数参照)


TYPE_APPLICATION(アプリが通常表示されるレイヤー)



TYPE_PHONE(着信画面のレイヤー)



TYPE_TOAST(トーストを表示するレイヤー。タッチイベントを拾えない?)



TYPE_SYSTEM_ALERT(バッテリー不足時の警告などに使用されているレイヤー)



TYPE_SYSTEM_OVERLAY(画面の一番上に表示されるレイヤー。ロック画面にも
干渉するためフォーカスを取得出来ない)

下に書いたものほど上位のレイヤーです。

ただしレイヤーの順序は明確には決まっていないのか機種やバージョンに異なる場合があるようなので注意。
※手持ちのGalaxyS3とエミュレータでも挙動が違った・・・。(バグ?)
任意のレイヤーにViewを表示させる










任意のレイヤーにViewを追加するにはWindowManagerクラスの
addView(View view, LayoutParams params)を呼ぶ。
addViewを呼ぶと画面に新しいViewを追加する事が出来る。
viewと一緒に渡すWindowManager.LayoutParamsのコンストラクタ引
数で表示レイヤーを指定出来る。
ServiceからViewを追加する事で、アプリがバックグラウンドにいる時
でも常に画面にViewを表示させ、Serviceから操作出来るようにする。
Viewを消す時はremoveView(View view)を呼ぶ。
WindowManager.LayoutParams


WindowManager.LayoutParamsの引数は

  (int w, int h, int _type, int _flags, int _format)





_typeで指定した値によってViewの表示レイヤーを指定する事が出来る。
_flagsで指定した値によってViewをタッチ出来るかなどの挙動を指定する
事が出来る。
実装例
mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.window, null);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
PixelFormat.TRANSLUCENT);
mWindowManager.addView(view, params);

※ServiceのonStartとかで
実装例
mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.window, null);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
PixelFormat.TRANSLUCENT);
mWindowManager.addView(view, params);



このへんがポイント

レイヤーはTYPE_TOASTかTYPE_SYSTEM_ALERT辺りを使うのが無難?
動作例
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
-省略- >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="はろーうぃんどう"
android:padding="16dp"
android:textColor="#000000" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="閉じる"
android:textColor="#000000" />
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="EditText" >
</EditText>
</LinearLayout>
Viewの挙動を設定する






ViewにButtonなどを置きリスナーを登録すれば普通のActivityのように
様々な動作を行える。
ただしイベントを拾えるかはレイヤーの種類と_flagで設定した値による。
先の実装例ではTYPE_SYSTEM_ALERTだが、FLAG_NOT_TOUCHABLE
を設定しているため、Viewはイベントを拾わずタッチは後ろのレイヤーに
すり抜ける。

        →画面にマスクをかけるようなアプリを作れる。
主なFLAGの種類
(WindowManager.LayoutParamsの定数参照)






FLAG_NOT_TOUCHABLE(Viewはイベントを拾うことが出来ない)
FLAG_NOT_FOCUSABLE(Viewはキー入力イベントのフォーカスを得る事が出来
ない。タッチは拾える)
FLAG_KEEP_SCREEN_ON(Viewがある限り画面のバックライトを維持する)

他にもいろいろあるけど説明がややこしくてよく分からなかったので割愛しま
した!!
キーイベントのフォーカスについて






TYPE_SYSTEM_ALERTなどでは特にFLAGを指定しなければEditTextなど
でキーイベントのフォーカスを得る(ソフトキーボードを出す)事が出来ま
す。
ただしViewにフォーカスが付いている状態ではタッチイベントを背後のレ
イヤーを触れなくなるため、Viewをウィンドウ表示させてる意味が無く
なってしまいます。
そこで私の作ったアプリでは通常時はFLAG_NOT_FOCUSABLEを設定し
たLayoutParamsを使い、EditTextを触った時のみLayoutParamsを入れ
替えるという処理を行っています。(もっと良い方法あるのかな?)
実装例
@Override
public boolean onTouch(View v, MotionEvent event) {
if (v.getId() == mView.getId()) {
mWindowManager.updateViewLayout(mView, mNotFocusableParams);
} else if (v.getId() == R.id.editText1) {
mWindowManager.updateViewLayout(mView, mFocusableParams);
}
return false;
}
実装時の注意点








レイヤーを利用したアプリにはSYSTEM_ALERT_WINDOWのパーミッ
ションが必要。
ちゃんとViewを消すような処理を書かないと、設定からアプリを強制終了
するまでViewを消せなくなってしまう可能性がある。
下手な実装をすると端末を何も操作出来ないような状態にも出来てしま
う。特に通知バーやロック画面より上にViewを表示させるような場合は細
心の注意が必要。
実装の際はドキュメントをよく読み、多くのバージョンや端末でテストし
問題が起こらないかを確認しましょう。

More Related Content

What's hot

オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)
オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)
オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)
博宣 今村
 
Metasploitでペネトレーションテスト
MetasploitでペネトレーションテストMetasploitでペネトレーションテスト
Metasploitでペネトレーションテスト
super_a1ice
 
オープンソースを用いたドローンの自律制御ソフトウェア技術
オープンソースを用いたドローンの自律制御ソフトウェア技術オープンソースを用いたドローンの自律制御ソフトウェア技術
オープンソースを用いたドローンの自律制御ソフトウェア技術
Masayuki Isobe
 

What's hot (20)

ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
[Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang)
[Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang) [Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang)
[Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang)
 
オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)
オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)
オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)
 
DI(依存性注入)について
DI(依存性注入)についてDI(依存性注入)について
DI(依存性注入)について
 
基礎から学ぶ組み込みAndroid
基礎から学ぶ組み込みAndroid基礎から学ぶ組み込みAndroid
基礎から学ぶ組み込みAndroid
 
AndroidとSELinux
AndroidとSELinuxAndroidとSELinux
AndroidとSELinux
 
シリコンバレー流開発スタイル
シリコンバレー流開発スタイルシリコンバレー流開発スタイル
シリコンバレー流開発スタイル
 
Metasploitでペネトレーションテスト
MetasploitでペネトレーションテストMetasploitでペネトレーションテスト
Metasploitでペネトレーションテスト
 
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかLaravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
 
강좌 04 펌웨어 구조 설계
강좌 04 펌웨어 구조 설계강좌 04 펌웨어 구조 설계
강좌 04 펌웨어 구조 설계
 
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDDドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD
 
Jsug spring bootコードリーディング 接触篇 a contact
Jsug spring bootコードリーディング 接触篇 a contactJsug spring bootコードリーディング 接触篇 a contact
Jsug spring bootコードリーディング 接触篇 a contact
 
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
 
Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...
Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...
Webブラウザで動くOSSオフィスソフト、LibreOffice Onlineの中身に迫る / LibreOffice Online Implementa...
 
웹 크롤링 (Web scraping) 의 이해
웹 크롤링 (Web scraping) 의 이해웹 크롤링 (Web scraping) 의 이해
웹 크롤링 (Web scraping) 의 이해
 
複数DBのバックアップ・切り戻し運用手順が異なって大変?!運用性の大幅改善、その先に。。
複数DBのバックアップ・切り戻し運用手順が異なって大変?!運用性の大幅改善、その先に。。 複数DBのバックアップ・切り戻し運用手順が異なって大変?!運用性の大幅改善、その先に。。
複数DBのバックアップ・切り戻し運用手順が異なって大変?!運用性の大幅改善、その先に。。
 
Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
 
オープンソースを用いたドローンの自律制御ソフトウェア技術
オープンソースを用いたドローンの自律制御ソフトウェア技術オープンソースを用いたドローンの自律制御ソフトウェア技術
オープンソースを用いたドローンの自律制御ソフトウェア技術
 

Viewers also liked

Viewers also liked (20)

指紋認証と「FIDO」について
指紋認証と「FIDO」について指紋認証と「FIDO」について
指紋認証と「FIDO」について
 
Marshmallowで変更になったpermission
Marshmallowで変更になったpermissionMarshmallowで変更になったpermission
Marshmallowで変更になったpermission
 
20150723 最近の興味動向 fido編
20150723 最近の興味動向 fido編20150723 最近の興味動向 fido編
20150723 最近の興味動向 fido編
 
プロ生ちゃん常駐化の提案とアプリ開発の裏
プロ生ちゃん常駐化の提案とアプリ開発の裏プロ生ちゃん常駐化の提案とアプリ開発の裏
プロ生ちゃん常駐化の提案とアプリ開発の裏
 
OMA GotAPI 標準化作業状況アップデート
OMA GotAPI 標準化作業状況アップデートOMA GotAPI 標準化作業状況アップデート
OMA GotAPI 標準化作業状況アップデート
 
MozOpenHardプロジェクトと そのコア技術について
MozOpenHardプロジェクトと そのコア技術についてMozOpenHardプロジェクトと そのコア技術について
MozOpenHardプロジェクトと そのコア技術について
 
Intro to OMA GotAPI Open-Source Implementation Supporting Web - Healthcare Us...
Intro to OMA GotAPI Open-Source Implementation Supporting Web - Healthcare Us...Intro to OMA GotAPI Open-Source Implementation Supporting Web - Healthcare Us...
Intro to OMA GotAPI Open-Source Implementation Supporting Web - Healthcare Us...
 
LinkingとデバイスWebAPI
LinkingとデバイスWebAPILinkingとデバイスWebAPI
LinkingとデバイスWebAPI
 
Intro to OMA GotAPI Open-Source Implementation Supporting Web - Healthcare Us...
Intro to OMA GotAPI Open-Source Implementation Supporting Web - Healthcare Us...Intro to OMA GotAPI Open-Source Implementation Supporting Web - Healthcare Us...
Intro to OMA GotAPI Open-Source Implementation Supporting Web - Healthcare Us...
 
DeviceConnect向けCordovaプラグインを作ってみた
DeviceConnect向けCordovaプラグインを作ってみたDeviceConnect向けCordovaプラグインを作ってみた
DeviceConnect向けCordovaプラグインを作ってみた
 
201606 DeviceWebAPI 第4回技術WG会合
201606 DeviceWebAPI 第4回技術WG会合201606 DeviceWebAPI 第4回技術WG会合
201606 DeviceWebAPI 第4回技術WG会合
 
DWAPI-3DP of OMA and Related Technology
DWAPI-3DP of OMA and Related TechnologyDWAPI-3DP of OMA and Related Technology
DWAPI-3DP of OMA and Related Technology
 
デバイスWeb apiコンソーシアム 第四回資料(RemoteRelay with Thermal camera)
デバイスWeb apiコンソーシアム 第四回資料(RemoteRelay with Thermal camera)デバイスWeb apiコンソーシアム 第四回資料(RemoteRelay with Thermal camera)
デバイスWeb apiコンソーシアム 第四回資料(RemoteRelay with Thermal camera)
 
デバイスWeb apiコンソーシアム lt-bril
デバイスWeb apiコンソーシアム lt-brilデバイスWeb apiコンソーシアム lt-bril
デバイスWeb apiコンソーシアム lt-bril
 
サーマルカメラ OWLIFT GotAPI 連携
サーマルカメラ OWLIFT GotAPI 連携サーマルカメラ OWLIFT GotAPI 連携
サーマルカメラ OWLIFT GotAPI 連携
 
WebRTCプラグインで広がるWi-Fiカメラのアプリケーション
WebRTCプラグインで広がるWi-FiカメラのアプリケーションWebRTCプラグインで広がるWi-Fiカメラのアプリケーション
WebRTCプラグインで広がるWi-Fiカメラのアプリケーション
 
デバイスWebAPIによるIoTの普及拡大と応用事例
デバイスWebAPIによるIoTの普及拡大と応用事例デバイスWebAPIによるIoTの普及拡大と応用事例
デバイスWebAPIによるIoTの普及拡大と応用事例
 
GitHubドキュメント整備状況報告とハンズオン
GitHubドキュメント整備状況報告とハンズオンGitHubドキュメント整備状況報告とハンズオン
GitHubドキュメント整備状況報告とハンズオン
 
イベント出展報告
イベント出展報告イベント出展報告
イベント出展報告
 
メディア統合プラットフォーム - メディア・デバイスによらない"テレビ"視聴と放送関連機能のIoT対応
メディア統合プラットフォーム - メディア・デバイスによらない"テレビ"視聴と放送関連機能のIoT対応メディア統合プラットフォーム - メディア・デバイスによらない"テレビ"視聴と放送関連機能のIoT対応
メディア統合プラットフォーム - メディア・デバイスによらない"テレビ"視聴と放送関連機能のIoT対応
 

Recently uploaded

Recently uploaded (7)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

Androidの表示レイヤーと画面常駐型アプリの話