WindowManager 100% 활용하기 안드로이드만의독특한서비스만들기 CTO 곽근봉 (kwak.keunbong@nbt.com)
1 인개발자 오늘의이야기 100 명조직
그래서! 오늘의주제는 기술과제품 이야기 feat. WindowManager
제품개발방법 Top-Down Approach 시장정의문제정의솔루션정의요구사항도출제품기획제품개발제품출시 vs 새로운기술의발견기술의습득만들어보고싶은거만들기그제품으로풀수있는문제를정의문제를더잘풀기위한개선패키징제품출시 Bottom-Up Approach
제품개발방법 Top Down Approach Bottom Up Approach 효율적이고효과적이지만 뻔한제품이나오기쉽다. vs 독특한서비스를개발할수있지만, 시장의선택을받지못할수있다.
좋은제품을만들기위해서는 두가지의방법이모두적용되어야한다 비지니스하는사람들이 기술의트렌드를기회로인식할수있어야하고, 개발하는사람들이 현재시장의문제를파악하고있어야한다.
Top-Down 식제품개발이주도적인상황에서 어떻게하면 Bottom-Up 식제품개발과조화를이룰수있을지 개발자의관점에서 좋은제품을만들기위한방법을알아보자
WindowManager
Window 안드로이드에서 사용자눈에보이는모든것들은 Window 를가진다 즉, 눈에보이는것을담는가장기본적인공간 Window 에 레이아웃과뷰들을올려서사용하는것
Window 예시 ) 액티비티를만들면 자동으로윈도우를생성해서붙여준다. /core/java/android/app/activity.java final void attach(context context, ActivityThread athread, ){... mwindow = PolicyManager.makeNewWindow(this); mwindow.setcallback(this); mwindow.setwindowmanager(null, mtoken, mcomponent.flattentostring(), (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED)!= 0); } mwindowmanager = mwindow.getwindowmanager();...
WindowManager Window는그자체로사용하지않고, WindowManag er를통해서사용. WindowManager는 ViewManager를상속받았기때문에, 바로 view를추가 / 수정 / 삭제할수있음. View.LayoutParams 를상속받은 WindowManager.LayoutParams 를 통해독특한윈도우를만들수있다.
WindowManager 활용법 홈버튼 반응속도 Floating Block 향상 홈버튼 Application Delay 회피 Activity 의제약조건 ( 라이프사이클, 반응속도, Home 버튼 Delay) 를 벗어나는방법으로서 WindowManager 가유용하다.
활용법 1 Floating Application Floating Application
활용법 1 Floating Application Floating Application 피그인
활용법 1 Floating Application Floating Application 페이스북 메신저
활용법 1 Floating Application Floating Application 네이버
활용법 1 Floating Application Floating Activity Context 와 Window 를분리 Application WindowManager 는 Activity Context, Service Context, Application Context 모두에서사용가능 windowmanager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); windowmanager.addview(view, layoutparam);
활용법 2 Home BTN Block 홈버튼 Block TouchLock
활용법 2 Home BTN Block 홈버튼 Type : 윈도우의노출, 터치, 포커스우선순위를결정 Block Type 마다특정 Context 의의존성 WindowManager.LayoutParams layoutparams = new WindowManager.LayoutParams(); layoutparams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; layoutparams.format = PixelFormat.TRANSPARENT;
활용법 3 반응속도향상 반응속도비교
활용법 3 반응속도향상 Activity 와 Window 분리 왜빠른가? Activity Life Cycle 을따르지않음 * Fluctutation 이없음. View 재사용가능 어떻게? Service Context 로 WindowManager 를가져와서구현
활용법 4 홈 BTN delay 회피 홈버튼후런처를제외한 다른방식으로앱을실행하려는 경우 5 초 Delay 를갖는현상
WindowManager 주요 Type 소개 TYPE_APPLICATION 가장기본이되는 type. Activity를생성하면이타입으로윈도우가생성된다. Activity Context로만생성이가능하다. Activity Context로생성된 window는 Service Conxtext로생성된 window보다우선순위가낮다. ( 잠금시는예외 TYPE_PHONE Service Context 로만들수있는윈도우 Type 중가장우선순위가낮다. 홈버튼을막지않고통과시킨다. TYPE_SYSTEM_ERROR 가장우선순위가높은 Type 중하나. 거의모든 View를덮을수있다. Status Bar, 네비게이션바등을모두막을수있기때문에주의해서써야한다. 홈버튼을막는다.
WindowManager 주요 Flag 소개 FLAG_DISMISS_KEYGUARD window 가 attach 되면잠금해제를하는 flag. Activity Context 를가진윈도우매니저에서만동작 FLAG_LAYOUT_NO_LIMITS window 가화면을벗어나서도배치될수있다. 숨기거나일부만보이는윈도우를만들때사용 FLAG_LAYOUT_IN_SCREEN window 가보여지는화면의전체영역을가진다. status bar 혹은 navigation bar 영역까지도배치될수있다. FLAG_NOT_FOCUSABLE 해당윈도우가 focus 를받지않게된다. 즉 home button 이나 back button 처럼 focus 를받아야동작하는것들을다음우선순위 window 에넘긴다. FLAG_NOT_TOUCH_MODAL 해당윈도우가터치를받지않게된다. 터치가오면다음우선순위 window 에넘긴다.
WindowManager 사용시주의사항 * 안드로이드 6.0 이상에서는명시적으로동의를받아야하는퍼미션이다. (TYPE_PHONE 이상의경우 * 외부 APK 를설치할경우 Floating App 이있으면설치가제한된다. * 6.0 이상에서다른앱들의명시적동의를받아야하는경우에는 Floating App 이이슈가된다. * Context 별사용법을정확히알아야한다. * 잠금해제는 Activity Context 만가능 * 유튜브 SDK 사용은 Activity Context 만가능등 * 디바이스별파편화가일부있다. * 메모리관리를잘해야한다.
요약 WindowManager 를사용하면, Activity 의제약사항들 ( 라이프사이클, 반응속도, 홈버튼처리 ) 을뛰어넘어서개발할수
진짜요약 Omni Swipe, TouchLock 과같은제품들이 시장의정의, 문제의정의로부터시작했을까? 오히려 WindowManager 라는기술의발견 Floating App, Home Block 이라는기술의습득에서부터시작하지않았을까? 마지막예시하나더
어떤팀이좋은팀인가? - InfoQ 1. 신뢰수준 2. 업무자유도 3. 협업 4. 솔직한태도 5. 고객피드백 6. 수고에대한인정 7. 작업환경... 20. 업무공간
어떤팀이좋은팀인가? - Tech Planet 2016 1. 신뢰수준 2. 팀원간의피드백 3. 수고에대한인정 4. 협업... 14. 끈끈한유대감 14. 성공에대한축하 14. 고객피드백 14. 정기적인회고..
엔지니어 제품을만들어주는사람이아닌 제품을만들어내는사람 단순히기술의발견에만머무르지말고보다적극적으로기술을습득하고문제를정의하고그것을창의적으로해결해야한다.
감사합니다. CTO 곽근봉 (kwak.keunbong@nbt.com)