정보공간_1

[3기 신촌 최기환] 안드로이드 런처의 구조 본문

IT 놀이터/Elite Member Tech & Talk

[3기 신촌 최기환] 안드로이드 런처의 구조

알 수 없는 사용자 2013. 3. 14. 23:43

안녕하세요.

신촌 멤버십 21-2기 최기환입니다.

이번시간은 안드로이드 기본 런처의 구조에 대해 분석해보는 시간을 갖도록 하겠습니다.

안드로이드 런처를 제작하거나 기본런처를 수정, 다른 어플리케이션에서 접근 할 일이 있을 때 

도움이 되었으면 좋겠습니다.


먼지 기본 용어에 대한 설명을 하겠습니다.

용어

정의

Launcher

Android 기반 단말기에서 다른 애플리케이션을 실행할 수 있는 UI를 제공하는 애플리케이션이다. 단말기가 구동되는 동안 항상 실행되어 있으며, 부가적으로  Home screen이라는 영역을 제공하여 애플리케이션의 단축 아이콘이나 위젯을 배치할 수 있다.

Workspace

Launcher에서 애플리케이션 단축 아이콘 및 위젯을 배치할 수 있는 영역이다. 홈 스크린(Home screen)이라고도 부른다.

Hotseat

자주 실행하는 애플리케이션/폴더를 배치할 수 있는 Launcher 하단의 영역이다.

위젯

홈스크린에 표시할 수 있는 애플리케이션 단축 아이콘 및 홈스크린 위젯


안드로이드 단말기에 보여지는 홈화면은 런처의 일부분이고 

런처 역시 어플리케이션으로 하나의 액티비티로 구성되어 있습니다.


다음은 런처의 레이아웃에 대한 그림을 살펴보도록 하겠습니다.

런처 어플리케이션은 하나의 액티비티만을 사용하며 이 액티비티는 DragLayer 로 구성되어 있습니다.

이 DragLayer 는 Quick Search Bar, 5개의 CellLayout(하나의 페이지를 의미) 을 갖는 

Workspace 와 WorkspaceDivider, 현재 어떤 페이지가 화면에 표시되는지 알려주는 Scroll Indicator, 

독 아이콘이 있는 Hotseat 으로 구성되어 있습니다.


안드로이드 런처 어플리케이션은 수십개의 클래스로 이루어져 있으며 

그 중 핵심 클래스를 살펴보겠습니다.


이름

역할

Launcher

Workspace Hotseat가 표시되는 액티비티로, 실질적인 Launcher의 기능을 제공한다.

LauncherApplication

Launcher 애플리케이션 전반에서 공유하는 객체를 제공하고, 애플리케이션 및 각종 아이콘, 위젯 변화를 감지하기 위한 브로드캐스트 리시버를 설정한다.

LauncherModel

Launcher가 구동되면서 참조하는 각종 정보(애플리케이션 리스트, 홈스크린 배치 정보)를 관리한다.

LauncherProvider

Launcher의 홈스크린(Workspace) Hotseat에 표시되는 데이터를 데이터베이스로 관리하기 위한 각종 기능을 제공한다.

DragLayer

Workspace Hotseat, Divider 를 포함하는 뷰그룹으로 자식 요소들간의 드래그 기능, 페이드인&페이드아웃 애니메이션, 드롭애니메이션 동작을 담당한다.

Workspace

Wallpaper 와 다수의 페이지를 포함하는 클래스. 3D 페이지전환, 아이콘&위젯 추가와 이동, 줌인 줌아웃 애니메이션, 페이지 내에서의 드래그 동작, 폴더 생성 등 그래픽 처리작업의 핵심적인 역할을 담당한다.

CellLayout

Launcher 의 홈스크린(Workspace) 에서 아이콘과 위젯이 표시되는 영역. 한개의 페이지에 관한 정보와 아이콘&위젯 컨테이너를 갖고있다. 공간이 없는 곳에 아이콘이 추가 될 때 인접한 빈공간을 찾는 기능을 수행한다.

이중 가장 핵심 적인 클래스는 Workspace 로 그래픽 처리작업의 대부분을 담당합니다.

화려한 UI 구성을 위한 각종 애니메이션이 정의되어 있습니다.


Workspace 에서 중요한 멤버와 함수를 살펴 보면


Member variables

·         private Drawable mBackground

o   배경화면

·         Private CellInfo mDragInfo

o   현재 드래그 중인 셀의 정보

·         private int mDefaultPage

o   초기 페이지 번호를 저장하는 변수

·         private CellLayout mDragTargetLayout

o   아이콘이나 위젯등을 드래그 중일 때 타겟이 되는 레이아웃

·         private State mState

o   일반 런처 홈화면인지 All Apps 를 실행 중인지 판단하는 상태 변수

·         Private Boolean mInScrollArea

o   유저가 아이템을 페이지가 넘어가는 스크롤 영역에 이동시켰는지 판단하는 변수

·         private FolderRingAnimator mDragFolderRingAnimator

o   사용자가 단축 아이콘을 서로 겹치게 드래그 했을 때 작동하는 폴더링 애니메이션을 처리한다.

·         private int mDragMode

o   현재 드래그 모드를 판단하는 변수이며 다음 중 하나의 상태를 갖는다.

§  DRAG_MODE_NONE – 드래그 중이지 않을 때

§  DRAG_MODE_CREATE_FOLDER – 폴더를 생성 중 일 때

§  DRAG_MODE_ADD_TO_FOLDER – 이미 생성된 폴더에 아이콘을 추가 중일 때

§  DRAG_MODE_REORDER – 아이콘 순서를 재배치 중일 때

Methods

·         void addInScreen(View childe, long container, int screen, int x, int y, int spanX, int spanY, Boolean insert)

o   워크 스페이스에 페이지를 추가하는 함수. 스크린의 grid 내에서의 위치(x, y)와 셀의 수(spanX, spanY)를 설정 할 수 있다.

·         public void onDragStart(DragSource source, Object info, int dragAction)

o   드래그가 시작되었을 때 호출되는 콜백함수로 화면의 Orientation 을 잠그고 아이콘을 삭제할 수 있는 공간을 활성화 시킨다.

·         private float getOffsetXForRotation(float degrees, int width, int height)

o   3D 페이지 전환을 위해 y축 중심으로 회전하는 페이지의 offsetX 를 구하는 함수

·         protected void snapToPage(int whichPage)

o   화면전환의 핵심적인 역할을 하는 함수로 Workspace Parent PageView 클래스에 정의되어 있다. 페이지 이동이 시작되는 동작과 스크롤바의 visibility, 스크롤의 시작위치와 끝위치 등을 계산한다. 페이지가 완전히 전환된 경우 loadAssociatedPages() 함수를 이용해 액티비티 내의 모든 뷰를 제거하고 새 페이지의 뷰를 삽입한다.


CellLayout  에서는 단축 아이콘과 위젯을 포함하는 뷰 그룹인 ShortcutAndWidgetContainer 가 있어 

화면내의 모든 오브젝트들을 관리합니다.


마지막으로 런처에 사용된 데이터베이스 모델입니다.


런처의 Workspace 및 Hotseat 에 추가되는 항목들(아이콘, 위젯)의 

배치정보를 저장하는 데이터 베이스이며 그 구조는 다음과 같습니다.


Fields

TITLE

·         홈스크린에 표시되는 아이콘의 이름

·         Field type : TEXT

INTENT

·         해당 항목을 선택(터치)했을 때 실행할 작업. 인텐트 정보(action, category, launchFlags, component)가 포함되어 있다. 폴더나 홈스크린 위젯은 이 정보를 포함하고 있지 않다.

·         Field type : TEXT

CONTAINER

·         항목의 위치를 나타낸다. 항목은 홈스크린(Workspace)와 하단 Dock(Hotseat)에 위치할 수 있다. Workspace일 경우 -100, Hotseat일 경우 -101이 할당된다.

·         Field type : INTEGER

SCREEN

·         항목이 위치한 Workspace의 인덱스를 나타낸다. AOSP Launcher의 경우 0~4의 범위를 가지며, 항목이 Hotseat에 있을 경우 여기에 아무 값이나 들어가도 무방하다.

·         Field type : INTEGER

CELLX

·         항목이 위치한 곳의 x좌표를 나타낸다. 좌표는 좌측 상단을 기준으로 한다.

·         Field type : INTEGER

CELLY

·         항목이 위치한 곳의 y좌표를 나타낸다. Hotseat에 있는 항목의 경우 이 필드를 사용하지 않는다.

·         Field type : INTEGER

SPANX

·         홈스크린에서 차지하는 가로 크기를 나타낸다. 단위는 Cell이다.

·         Field type : INTEGER

SPANY

·         홈스크린에서 차지하는 세로 크기를 나타낸다. 단위는 SPANX와 마찬가지로 Cell이다.

·         Field type : INTEGER

APPWIDGET_ID

·         각각의 홈스크린 위젯(Appwidget)에 할당된 고유 ID를 나타낸다.

·         Field type : INTEGER

IS_SHORTCUT

·         현재 사용하지 않음 (Deprecated)

·         Field type : INTEGER

ITEM_TYPE

·         항목의 종류를 나타낸다.

·         Field type : INTEGER

·         @see BaseLauncherColumns.ITEM_TYPE_APPLICATION

·         @see BaseLauncherColumns.ITEM_TYPE_SHORTCUT

·         @see Favorites.ITEM_TYPE_FOLDER

·         @see Favorites.ITEM_TYPE_APPWIDGET

ICON_TYPE

·         아이콘을 리소스 기반으로 불러올지 데이터베이스에서 불러올지 설정한다.

·         Field type : INTEGER

·         @see BaseLauncherColumns.ICON_TYPE_RESOURCE

·         @see BaseLauncherColumns.ICON_TYPE_BITMAP

ICON_PACKAGE

·         ICON_TYPEICON_RESOURCE로 지정한 경우 아이콘이 있는 패키지 이름을 나타낸다.

·         Field type : TEXT

ICON_RESOURCE

·         ICON_TYPEICON_ RESOURCE로 지정한 경우 아이콘의 리소스 주소를 나타낸다.

·         Field type : TEXT

ICON

·         ICON_TYPEICON_BITMAP으로 지정한 경우, 아이콘의 비트맵 데이터를 나타낸다.

·         Field type : BLOB

URI

·         Live folder 지원을 위한 항목으로, 더 이상 사용되지 않는다.

·         Field type : TEXT

DISPLAY_MODE

·         Live folder 지원을 위한 항목으로, 더 이상 사용되지 않는다.

·         Field type : INTEGER


이상으로 런처의 핵심 클래스들의 역할과 Workspace 클래스, 

런처의 데이터베이스 모델에 대해 간략하게 알아보았습니다.

안드로이드 런처 제작시 이미 어느정도 완성되어 있는 오픈소스들이 상당 수 있습니다.

이를 활용하는 방법도 개발에 도움이 되실겁니다.