티스토리 뷰

/* 본 게시물은 '핵심만 골라 배우는 안드로이드 스튜디오 & 프로그래밍(Android Studio 2 Development Essentials) | 닐 스미스 지음' 의 내용을 토대로 작성되었습니다. */


# 안드로이드 액티비티


자바, C++, C# 과 같은 객체지향 프로그래밍 언어에 익숙한 사람들은 애플리케이션의 기능을 캡슐화하여 클래스를 만들고, 이것을 객체로 생성하여 애플리케이션을 구성하는 개념을 잘 알고 있을 것이다. 안드로이드 애플리케이션은 자바로 작성되므로 객체지향 프로그래밍을 해야 한다. 그러나 안드로이드는 재사용 가능한 컴포넌트의 개념을 더 높은 수준으로 끌어올렸는데, 그것이 바로 '액티비티(Activity)'다.


 안드로이드 애플리케이션은 액티비티라는 컴포넌트가 항나 이상 결합되어 생성된다. 액티비티는 애플리케이션의 기능을 갖는 단일의 독립 실행형 모듈이다(리눅스의 프로세스로 실행된다). 그리고 하나의 사용자 인터페이스 화면 및 기능과 밀접하게 연관된다. 예를 들어, 일정 애플리케이션에는 당일로 설정된 일정들을 보여주는 액티비티 화면을 가질 수 있다. 또한 새로운 일정을 입력할 수 있는 화면으로 된 두 번째 액티비티를 사용할 수도 있다.


 액티비티는 재사용과 교체 가능한 구성 요소로 만들어져서 서로 다른 애플리케이션에서 공유할 수 있다. 예를 들어, 이메일(email) 메시지를 구성하고 전송하는 액티비티를 갖는 이메일 애플리케이션이 있을 수 있다. 그리고 개발자가 새로 작성하는 애플리케이션에서 그런 이메일 애플리케이션의 기능이 필요한 경우가 있을 것이다. 이때는 또 다시 새로운 이메일 액티비티를 작성하지 않고 기존 이메일 애플리케이션의 액티비티를 사용하면 된다.


 액티비티는 안드로이드 Activity 클래스의 서브 클래스로 생성되어야 하며, 애플리케이션의 다른 액티비티와 완전히 독립적으로 구현되어야 한다. 다시 말하면 액티비티는 다른 액티비티의 메서드를 직접 호출할 수 없으며, 데이터도 직접 액세스할 수 없다. 대신에 인텐트(Intent)와 콘텐트 제공자(Content Provider)를 사용해서 액티비티를 공유할 수 있다.



# 안드로이드 인텐트


인텐트는 하나의 액티비티가 다른 액티비티를 론칭(시작)시킬 수 있는 매커니즘이다. 이때 액티비티가 안드로이드 런타임에 인텐트를 요청하면 그 인텐트에 부합되는 액티비티를 안드로이드 런타임이 찾아서 시작시킨다. 한 액티비티가 다른 액티비티를 직접 시작시키는 것이 아니다. 인텐트에서는 수행될 오퍼레이션을 나타내고, 필요하다면 전달할 데이터도 포함시킬 수 있다.


 인텐트에는 명시적(explicit) 인텐트와 암시적(implicit) 인텐트가 있다. 명시적 인텐트에서는 클래스 이름으로 액티비티를 참조하여 특정 액티비티의 론칭을 안드로이드 런타임에 요청한다. 따라서 론칭할 액티비티를 우리가 정확하게 알고 있어야 한다.


 반면에 암시적 인텐트에서는 우리가 하길 원하는 작업(액션 타입)을 안드로이드 런타임에 알려준다. 그러면 그런 작업을 할 수 있다고 자신을 등록한 액티비티를 안드로이드 런타임이 찾아서 시작시킨다. 만일 그런 능력의 액티비티를 하나 이상 찾을 경우는 사용자가 선택할 수 있게 해준다.



# 브로드캐스트 인텐트 (Broadcast Intent)


 브로드캐스트 인텐트는 브로드캐스트 수신자(Broadcast Receiver)로 등록된 모든 애플리케이션에 전송되는 시스템 차원의 인텐트다. 예를 들어, 안드로이드 시스템에서는 장치 상태의 변화를 알려주기 위해 브로드캐스트 인텐트를 전송한다. 장치의 전원을 켜서 시스템이 부팅될 때 또는 충전 커넥터를 연결할 때와 같은 경우다.


 브로드캐스트 인텐트는 일반적인 인텐트와 유사하게 동작하지만, 지정된 컴포넌트만 인텐트를 받는 것이 아니라 시스템의 여러 컴포넌트가 동시에 받을 수 있다는 차이점이 있다.


 브로드캐스트 인텐트에는 정규(normal)과 순차(ordered)의 두 종류가 있다. 정규 브로드캐스트 인텐트는 관련 이벤트에 관심 있는 모든 브로드캐스트 수신자에게 비동기 형태로 동시에 전송된다. 반면 순차 브로드캐스트 인텐트는 한 번에 하나의 브로드캐스트 수신자에게 전송 된다. 그리고 그 다음 차례의 브로드캐스트 수신자에게 계송 전송되거나 또는 중단될 수 있다.



# 브로드캐스트 수신자 (Broadcast Receiver)


 브로드캐스트 수신자는 애플리케이션이 브로드캐스트 인텐트에 응답할 수 있는 매커니즘이다. 브로드캐스트 수신자는 애플리케이션에서 등록해야 하며, 관심 있는 브로드캐스트 타입을 나타내는 인텐트 필터(Intent Filter)를 사용해서 구성한다. 그리고 등록된 브로드캐스트 타입이 인텐트와 일치하면 안드로이드 런타임이 그 수신자를 시작시킨다. // 그 수신자를 등록한 애플리케이션의 현재 실행 여부와 무관함


 그 다음에 그 수신자는 필요한 작업(데이터 변경이나 사용자에게 메시지 통지 등)을 5초 이내에 수행하고 복귀해야 한다. 브로드캐스트 수신자는 백그라운드로 실행되며 사용자 인터페이스를 갖지 않는다.



# 안드로이드 서비스


 안드로이드 서비스(Service)는 백그라운드로 실행되는 프로세스이며, 사용자 인터페이스를 갖지 않는다. 그리고 서비스가 시작된 후에는 액티비티나 브로드캐스트 수신자 및 그 외 다른 서비스로부터 관리된다. 


 애플리케이션에서 어떤 작업을 계속 수행할 필요가 있지만, 사용자에게 보여줄 수 있는 사용자 인터페이스는 필요 없는 경우에 안드로이드 서비스가 이상적이다.


 비록 사용자 인터페이스를 갖고 있진 않지만, 서비스에서는 통지(notification)와 토스트(toast)를 사용해서 여전히 사용자에게 메시지를 알려줄 수 있다. 그리고 인텐트도 요청할 수 있다. // 현재 화면에 보이는 액티비티를 방해하지 않고 화면에 나타낼 수 있는 짤막한 메시지가 토스트다. 토스트 기능은 안드로이드 Toast 클래스에 구현되어 있다.


 서비스는 안드로이드 런타임에 의해 다른 프로세스보다 더 높은 우선순위로 실행된다. 그리고 웬만해서는 종료되지 않지만, 장치의 메모리 부족 등으로 시스템이 리소스를 해제하다가 어쩔 수 없는 경우에 마지막 수단으로 종료된다. 그러나 런타임이 서비스 프로세스를 죽이더라도 리소스가 다시 사용 가능하게 되면 그 즉시 자동으로 다시 시작된다.


 서비스는 자신이 포그라운드(foreground)에서 실행될 필요가 있다고 선언함으로써 중단의 위험을 줄일 수 있다. 그럴 때는 startForeground( )를 호출하면 된다. 그러나 서비스가 중단되면 사용자에게 해를 끼칠 수 있을 경우에만 그렇게 하는 것이 좋다. 예를 들어, 서비스로 스트리밍되는 오디오를 사용자가 듣고 있을 경우 등이 그에 해당한다.


 서비스가 실제적인 솔루션이 될 수 있는 경우의 예를 들면 다음과 같다. 바로 전에 이야기했듯이 계속 수행되어야 하는 오디오의 스트리밍, 주식이 지정된 가격이 될 때 사용자에게 통지할 필요가 있는 주식 애플리케이션 등이다.



# 콘텐트 제공자


 콘텐트 제공자(Content Provider)는 애플리케이션 간에 데이터를 공유하는 매커니즘을 구현한다. 어떤 애플리케이션도 자신의 내부 데이터에 대한 액세스를 다른 애플리케이션에게 제공할 수 있다. 이때 퍼미션(permission)이 허용된 그 데이터를 추가, 삭제, 조회하는 능력을 갖는 콘텐트 제공자를 구현한다.


 그리고 데이터의 액세스는 콘텐트 제공자가 정의한 URI(Universal Resource Identifier)를 통해 제공된다. 데이터는 파일 또는 SQLite 데이터베이스 전체의 형태로 공유될 수 있다.


 연락처와 같은 네이티브 안드로이드 애플리케이션들은 다른 애플리케이션에서 데이터를 액세스 할 수 있는 표준 콘텐트 제공자를 많이 포함하고 있다. 안드로이드 시스템에서 현재 사용 가능한 콘텐트 제공자는 콘텐트 리졸버(Content Resolver)를 사용해서 찾을 수 있다.



# 애플리케이션 매니페스트


앱을 구성하는 다양한 요소를 합치는 접착제의 역할을 하는 것이 안드로이드 매니페스트(Manifest) 파일이다. 이것은 XML 파일이며, 애플리케이션에 관련된 액티비티, 서비스, 브로드 캐스트 수신자, 데이터 제공자, 퍼미션(permission) 등이 정의되어 있다. 이 정보들은 안드로이드 런타임에서 참조하고 사용한다.



# 애플리케이션 리소스


안드로이드 애플리케이션은 애플리케이션 패키지(APK)로 빌드되어 장치에 설치 및 실행된다. 이때 APK에는 자바 실행 코드(dex 파일), 매니페스트 파일의 메타 데이터, 각종 리소스 파일들이 포함된다. 그리고 리소스 파일에는 여러 종류의 리소스가 포함된다.


 예를 들어, XML로 정의된 사용자 인터페이스 레이아웃과 함께 사용자 인터페이스에 나타나는 문자열, 이미지, 폰트와 색상 등이다. 안드로이드 스튜디오에서는 리소스 파일들이 프로젝트 디렉토리 아래의 app/src/main/res 서브 디렉토리에 저장된다.



# 애플리케이션 컨텍스트


 애플리케이션이 컴파일되면 애플리케이션의 모든 리소스에 대한 참조를 포함하는 R이라는 이름의 클래스가 자동 생성된다. 그리고 애플리케이션의 매니페스트 파일과 그런 리소스들이 결합되어 애플리케이션 컨텍스트(Application Context)가 생성된다.


 컨텍스트는 안드로이드 Context 클래스로 나타내며, 런타임 시에 애플리케이션의 리소스를 액세스하기 위해 애플리케이션 코드에서 사용될 수 있다. 또한, 런타임 시의 정보를 수집하고 애플리케이션의 환경을 변경하기 위해 애플리케이션의 컨텍스트에서 여러 가지 메서드들이 호출될 수 있다.



# 요약


 액티비티와 인텐트의 형태로 독립적으로 실행 가능한 모듈을 생성함으로써 재사용성과 상호운용성이 극대화된다. 또한, 콘텐트 제공자를 구현하면 애플리케이션 간의 데이터 공유가 가능하다.


 액티비티에서는 사용자가 애플리케이션과 상호작용하는 데 초점을 두는 반면, 백그라운드 프로세싱은 서비스와 브로드캐스트 수신자에 의해 처리된다. // 기본적으로 액티비티는 하나의 사용자 인터페이스 화면과 연관된다.


 애플리케이션을 구성하는 컴포넌트들은 매니페스트 파일에 정의되어 안드로이드 런타임 시스템에 의해 참조된다. 그리고 애플리케이션 매니페스트 파일과 애플리케이션 리소스들이 결합되어 애플리케이션의 컨텍스트를 나타낸다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday