본문

170424(월) - Android 7.0 <Multi-window>

Android 7.0 <Multi-window>


- Overview

ㆍAPI Level 24 or higher


ㆍ사용자는 두개의 앱을 하나의 화면에 띄울 수 있다.

- Android 7.0에서는 두 개의 앱을 실행 가능하며 사용자는 구분선을 조정하여 앱의 크기를 조정 가능

- Android TV 디바이스에서는 picture-in-picture mode 로 다른 컨텐츠를 탐색할때도 계속 콘텐츠를 표시 가능


ㆍ특히 대형화면 장치에서 multi-window의 장점이 돋보인다.

ㆍ앱에서 drag-and-drop을 사용하여 사용자 편리성과 경험을 향상 가능


ㆍminimum allowable dimensions를 통해 해당 크기 아래로 조정 불가능하게 옵션 가능


ㆍmulti-window 사용 불가 모드 가능


ㆍLarge devices manufactures는 창크기를 자유롭게 선택 가능한 freedom mode를 제공 가능하다.


ㆍuser는 drag-and-drop을 통해서 서로다른 분할된 스크린끼리 데이터를 공유 가능하다.



- Multi-Window Lifecycle

ㆍMulti-window mode는 Activity lifecycle을 변경하지 않는다.

ㆍ사용자가 가장 최근에 상호작용한 activity만 주어진 시간에 활성화 되고 이 activity는 최상위가 된다.

ㆍ다른 activity는 일지정지 상태

ㆍsystem은 not visible activity보다 일시중지 된 activity에 더 높은 순위를 부여한다.

ㆍuser가 일시정지된 activity와 상호작용하면 resumed 하고, 이전 최상위 activity는 pause 된다.


- Note

ㆍpause 된 상태라도 사용자에게 계속 보여진다.

ㆍpause 된 상태여도 앱이 계속 activity는 계속 동작되어야 하는 상황도 존재한다.

- video playing app

- video app은 onPause()에서 비디오를 일시정지 하지 않는것이 좋다.

- onStop에서 일시중지, onStart()에서 다시시작.


ㆍmulti-window 모드에 들어가면 시스템은 activity의 configuration을 변경한다. (app resizing, full-screen mode에도 동일동작)

ㆍ  Handling Configuration Changes 에 의해서 app은 변경되거나 destroy되었다가 다시 create 될 수 있다.

ㆍnewly exposed area에서 lag이 발생될 경우 시스템은 windowBackground 나 windowBackgroundFallback 의 지정된 색상으로 일시적으로 해당 area를 채운다.



- Configuring your app for Muiti-Window Mode

ㆍAPI Level 24+ 이면 multi-window 사용 가능

ㆍmanifest에 size 및 layout 속성을 setting 가능하다.

ㆍtask stack의 root에 속성이 적용되면 나머니 activity들도 전부 적용된다.

- android:resizeableActivity 등


ㆍAPI level 23 이하의 multi-orientation app에서 멀티 윈도우를 실행하면 제대로 동작하지 않을 수 있다는 경고문구 제공.

ㆍ시스템은 fixed-orientation app에 대해서 크기를 조정하지 않으며 전체화면으로 열리게 된다.


- android:resizeableActivty

ㆍ디폴트는 true

ㆍ<activity> or <application>


android:resizeableActivity=["true" | "false"]


- android:supportsPictureInPicture

ㆍ<activity>

ㆍ설정되면 android:resizeableActivity의 false는 자동으로 무시된다.


android:supportsPictureInPicture=["true" | "false"]


- Layout attributes

ㆍ<layout> 속성

- android:defaultWidth

freeform 모드에서 default width


- android:defaultHeight

freeform 모드에서 default height


- android:gravity

freeform 모드에서 시작될때 초기 배치


- android:minHeight, android:minWidth

minimum height와 width를 정한다.


<activity android:name=".MyActivity">
   
<layout android:defaultHeight="500dp"
         
android:defaultWidth="600dp"
         
android:gravity="top|end"
         
android:minHeight="450dp"
         
android:minWidth="300dp" />
</activity>



- Running your app in Multi-Window Mode

ㆍDisabled features in multi-window mode

multi-window 모드일때 disable되는 기능들이 있다.


- System UI customization 옵션이 disable 된다.

ex) 전체화면이 아니면 status bar 숨김이 불가능


- android:screenOrientation 속성이 무시된다.


ㆍMulti-window change notification and querying

isInMultiWindowMode()

multi-window 모드 여부 확인


isInPictureInPictureMode()

picture-in-picture 모드 여부 확인


picture-in-picture 모드는 multi-window 모드의 특별한 경우이므로, isInPictureInPictureMode()가 true이면 isInMultiWindowMode()도 true이다.


onMultiWindowModeChanged()

multi-window 모드에 들어가거나(true) 나올때(false) 호출됨


onPictureInPictureModeChanged()

picture-in-picture 모드에 들어가거나(true) 나올때(false) 호출됨


Fragment 클래스는 이런 메소드의 여러 version을 보여준다.


ㆍEntering picture-in-picture mode

Activity.enterPictureInPictureMode()

picture-in-picture 모드로 진입시킴


ㆍLaunch new Activities in Multi-window mode

FLAG_ACTIVITY_LAUNCH_ADJACENT

디바이스가 분할 화면 모드일 때, system은 현재 activity 옆에 새로운 activity를 만들려고 시도하고 두 개의 activity는 화면을 공유한다.


ActivityOptions.setLaunchBounds()

디바이스가 freeform 모드이면 위의 메소드를 호출하여 dimensions와 screen location을 조정 가능하다.


- task stack 안에서 새로운 액티비티를 실행시키면, 기존 activity를 대체하여 표시되며 multi-window의 속성을 모두 상속 받는다.

- 따라서 multi-window 모드에서 새로운 activity를 띄우기를 원하면 새로운 task stack 에서 실행시켜야 한다.


ㆍSupporting drag and drop

DragAndDropPermissions

drop 받는 app의 권한을 가지고 있는 Token object


View.startDragAndDrop()

View.startDrag()

DRAG_FLAG_GLOBAL 플래그 사용

 DRAG_FLAG_GLOBAL_URI_READ or DRAG_FLAG_GLOBAL_URI_WRITE

- URI permission 획득을 위해서 사용


View.cancelDragAndDrop()

drag 중인 작업 취소


View.updateDragShadow()

drag 중인 shadow (?) 교체.


Activity.requestDragAndDropPermissions()

DragEvent에 포함되어 있는 ClipData의 content URIs의 permission을 요구


ㆍIf your app targets API level 23 or lower

app이 fixed orientation을 선언하지 않는 한 system이 강제로 app의 크기를 조정한다.


- fixed orientation 

app을 multi-window 모드로 설정해줘야 한다.


- not fixed orientation

Android 7.0 이상의 기기에서 앱을 실행해야 한다.

공유

댓글