60
61

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[AndroidN] Multi-Window で対応しなければいけないところ

Last updated at Posted at 2016-04-14

1. 対応していないアプリはAndroidNでどう動きますか?

"このアプリは画面分割に対応していません"というtoastが表示されて、これまで通りシングルウィンドウで動きます。
マルチウィンドウの対応を示すのはAndroidManifestに指定する、android:resizeableActivityで、これはapplication/activityどちらにも指定可能です。
また、resizeableActivityを指定すると、何らかの実装が足りていない場合に、"この画面はマルチウィンドウで動作しないことがあります"という表示が出ることがあるようです。(助かりますが、駆逐したいので、どういうロジックで判定しているのか調査中)

2. FooActivityとBarActivityをマルチウィンドウで見れますか?

Android N adds support for displaying more than one app at the same time.

ドキュメントにもこのようにあるように、アプリごとのマルチウィンドウが主な機能であり、開発している側が意図しない状態で、ユーザの操作によりFooActivityとBarActivityが同時に表示されてしまうようになってしまう、ということはありません。
しかし、新しいtaskで起動ささせると、もちろんマルチウィンドウで両方を表示することが出来ますし、Intent.LAG_ACTIVITY_LAUNCH_ADJACENTというflagを追加することで、隣のウィンドウで新しいActivityを立ち上げることが出来ます。multi-windowではないときの動作にこのflagは影響しないとのことです。
参考: http://developer.android.com/intl/ja/preview/features/multi-window.html#running

また、自分のアプリとブラウザをマルチウィンドウで開いているときに、自分のアプリからブラウザを開く箇所があれば、きちんとfinish()を呼ぶなり画面を綺麗にしておかないと、中途半端な状態の画面が残り続けることになってしまいます。

3. 非アクティブになった時に、どんなライフサイクルが呼ばれますか?

アクティブになったときにonResume、非アクティブになったときにonPauseが呼ばれます。
そのため、onPauseでEventBusをsubscribeしている箇所や、isResumeの時だけ非同期処理の結果に応じてローディングのくるくるを非表示にする、なんていう処理を書いているところは修正が必要そうです。

4. キーボードを開いたときにどうなりますか?

縦向きの時

スクリーンショット 2016-04-08 21.37.01.png

横向きの時

スクリーンショット 2016-04-08 21.53.28.png

縦向きの場合は、わかりにくいですが、上のViewにfocusした状態でキーボードを開くと、下のViewの上にキーボードが開きます。
下のViewにfocusした状態でキーボードを開くと、一時的にViewが伸びてシングルウィンドウのようになり、キーボードを片付けるとまたマルチウィンドウになります。

5. 画面回転したときに何が起きますか

manifestでscreenOrientationをportraitで固定していたとしても、↑で貼った画像のように画面回転した時にウィンドウが縦並びから横並びに回転してしまいます。
そのため、画面回転を考慮していない画面は対応が必要です。

6. 一度マルチウィンドウになったら回転以外で、画面サイズは変わりませんか?

いいえ。マルチウィンドウを分割している境界線を移動させて、画面サイズを変更することができます。
また画面サイズを変更すると、Activityが破棄されてonCreateからの再描画が走るようです。
AndroidManifestのconfigChangesにorientationをつけることで破棄をActivityでハンドリングできるようになるのと同様に、screenSizeでハンドリングできるのかと思いきや、破棄されてしまっています。
configChangesにorientation, screenSizeをつけて、画面回転時の再描画をスキップしている画面はこちらの動作も確認したほうが良さそうです。

7. 画面サイズの取得はどうなりますか

DisplayMetricsを利用している箇所があると、画面分割によってDisplayのサイズとViewのサイズが異なってしまうため、壊れてしまいそうです。(getResources().getDisplayMetrics().widthPixelsなど)
また、横向きにすると単純にwidthがheight / 2になるわけではなく、navigationBarが移動するので再取得しないといけません。
WindowManager.getDefaultDisplay() はアクティブなwindowの画面サイズを取ってきてくれるので問題なさそうです。

8. scrollできない画面

画面中央に画像を表示し、その50dp下にボタンを配置するようなレイアウトなどを、scrollViewを利用せずに作って閉まっていると、デザインによってはマルチウィンドウにしたときに、ボタンが見きれてしまうことがあるかもしれません。
スクリーンショット 2016-04-15 14.11.21.pngスクリーンショット 2016-04-15 14.13.31.png

9. ホームはどのように見えますか?

端末ホームはシングルウィンドウで表示されるようなので、ウィジェット系は影響なさそうに見えます。

その他

基本的にはGoogleさんのドキュメント通り進めることができました。
http://developer.android.com/intl/ja/preview/setup-sdk.html

buildToolsVersionだけ、'24.0.0-rc1'と指定されていますが、既に'24.0.0-rc2'だったので、そちらを利用しました。

60
61
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
60
61

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?