ディップ Advent Calendarの6日目です。
本当はAndroid NからJava 8のラムダ式記法が使えるようになったので、勉強したことを投稿しようとしたが、minSdkVersionを24(つまりAndroid N)にしないと使えないことがわかり(冷静に考えれば気づく話だが)、しばらく未来の技術だなぁと意気消沈してしまったので、以前から気になっていたAndroid Nから導入されたマルチウィンドウ機能について、調べたことを投稿しようと思います。
マルチウィンドウとは
Android Nから複数のアプリを同時に表示するためのマルチウィンドウサポートが追加されています。
Overview キーを長押しすることでマルチウィンドウモードに切り替えたりすることが可能です。
ただ、Android Nから搭載された機能なので、対応していないアプリではマルチウィンドウに対応していないアプリでは動かなかったり、マルチウィンドウが動いても【アプリは分割画面では動作しないことがあります。】というtoastが出てしまう場合があります。
前からどういう条件下でそうなるのかが興味があったので、調査してみました。
マルチウィンドウモードが無効になる条件
色々調べた結果、targetSdkVersionが23以下で、以下のパラメータのいずれかの指定があるとマルチウィンドウモードは無効になります。
- android:screenOrientationをportrait、landscape、lockedにしている場合
- android:immersive="true"にしている場合
だいたい、screenOrientation=portraitにして縦固定画面にしている場合が多いと思いますが、その場合【アプリは分割画面をサポートしていません。】というtoastが出てマルチウィンドウが動作しません。
なんでだろうと思いますが、マルチウィンドウを起動するとフォーカスをチェンジするたびにonResume、onParseが走るので、縦画面に固定して最適化しているようなアプリではマルチウィンドウではうまく動かないという判断が出されたのだと思います。
マルチウィンドウ実行時に【アプリは分割画面では動作しないことがあります。】警告メッセージが出る条件
targetSdkVersionが23以下でscreenOrientationやimmersiveの指定がない場合は基本的にマルチウィンドウモードは有効になるようです。
ただ、targetSdkVersionは23以下なので、【アプリは分割画面では動作しないことがあります。】の警告文を出して、「動くと思うけど、動作は保証しないよ」という意思表示をしているようです。
マルチウィンドウが有効になる条件
当たり前といえば当たり前ですが、基本的にtargetSdkVersionが24以降ならば、マルチウィンドウは有効になります。
screenOrientationやimmersiveが設定されていても問題なく動作します。
targetSdkVersionが24ならば、マルチウィンドウ対応は当たり前だよね。と言われている気がしますね。。
マルチウィンドウを有効にしたくない場合は
targetSdkVersionが24にするならばマルチウィンドウ対応をすべきだと思いますが、やりたくない場合もあると思います。
その場合、AndroidManifest.xmlの<activity> ノードまたは <application> ノードにandroid:resizeableActivity="false"
を設定すればマルチウィンドウモードは無効化されます。
ただ、このandroid:resizeableActivity、targetSdkVersionが24で追加された属性なので、targetSdkVersionが23以下では使えません。
かといってマルチウィンドウモードを無効化するためにscreenOrientationやimmersiveをわざわざ付けるのも色々まずい場合もあると思います。
結論ですが、screenOrientationもimmersiveも利用していない場合は、マルチウィンドウモードに対応するか、targetSdkVersionを24に上げてandroid:resizeableActivityでマルチウィンドウモードを無効化するのが早いと思います。