순서 없이 배우는 안드로이드 개발 #0 앱 기본, 구성 요소

최근 해커톤에 참여할 기회가 있었다. 안드로이드 개발 외길을 갈 생각도 아니고, front-end 개발자보단 현재로선 full-stack 개발자를 꿈꾸고 있지만.. 서버를 담당하던 팀원이 안드로이드를 쉽게 배우는 것을 보고.. 좀더 전문성을 갖춰야겠다는 생각을 했다. 조금씩이나마 develop 가이드를 제대로 읽고, 제대로 배우고자 한다.
현재는 ionic2에 더 빠져 있지만... 분명 hybrid app 개발에서도 native적인 요소를 만져줘야 하고, 안드로이드는 우선 java 기반이기 때문에 배울 것이 많을 것이라 생각한다.
그럼 오늘 배운 내용을 정리하도록 한다.
개인적인 공부이지만, 나처럼 develop guide를 제대로 읽지 않고 학교나 개인적으로 프로젝트를 시작한 사람들에게 기초부터 닦을 수 있는 정리된 글을 보여주면 어떨까 싶다.. (물론 UI는 기대하면 안된다.)

앱 기본 항목

* 안드로이드 운영 체제 - 멀티유저 linux 시스템. 각 앱은 각기 다른 사용자와 같음
* 기본적으로 시스템이 각 앱에 고유한 linux ID를 할당함. (이 ID는 시스템만 사용 가능하고, 앱에선 인식 못함) 시스템은 앱 안의 모든 파일에 대해 권한을 설정하고, 해당 앱에 할당도니 사용자 ID만 엑세스 가능
* 각 프로세스에 자체적 가상머신(VM)이 있고, 한 앱의 코드가 다른 앱과 격리된 상태로 실행 됨.
* 기본적으로 모든 앱이 앱 자체의 linux 프로세스에서 실행 됨. 앱의 어떤 요소라도 실행해야 하는 경우 프로세스 실행하고, 필요 없어지면 종료

따라서 각 앱은 자신의 작업을 수행 하기 위해 필요한 요소에만 엑세스 권한을 가지고 그 이상은 허용되지 않음 -> 안전성

앱이 다른 여러 앱과 데이터 공유하는 것과 앱이 시스템 서비스에 엑세스하는 데 여러 방법이 존재
->앱들이 같은 linux 사용자 id를 공유하도록 설정할 수 있다. 이 경우 두 앱은 서로의 파일에 엑세스 가능하다.
시스템 리소스 절약을 위해 같은 사용자 id를 가진 앱이 같은 linux 프로세스에서 실행되돋록 설정하고 vm을 공유하도록 할 수 있다(이들 앱은 같은 인증서로 서명해야 함)
기기 데이터(연락처 카메라 등)에 접근하기 위해 권한을 명시적 부여해야 한다.

앱의 구성 요소

1. 액티비티 - 사용자 인터페이스가 있는 단일 화면. Activity의 서브클래스로 구현
2. 서비스 - 백그라운드에서 실행되는 구성 요소. 오랫동안 실행 되거나, 원격 프로세스를 위한 작업 수행에 사용.
사용자 인터페이스를 제공하지 않음. Service의 서브클래스로 구현
3. 콘텐츠 제공자 - 앱 데이터 집합을 관리. 파일 시스템이나 sqlite, 웹이나 기타 영구 저장소 위치 중 앱이 엑세스 가능한 어디에든 저장 가능. ContentProvider의 서브클래스로 구현. 다른 앱이 트랜잭션을 수행할 수 있도록 활성화 하는 표준 API 집합을 구현해야 함.
4. 브로드캐스트 수신기 - 시스템 범위의 브로드캐스트 알림에 응답하는 구성요소.(화면 꺼짐, 배터리 부족, 사진 캡처를 알리는 등의 브로드캐스트, 앱도 브로드캐스트를 시작함) BroadcastReceiver의 서브클래스로 구현, Intent 객체로 전달됨.

*android에서는 어떤 앱이든 다른 앱의 구성 요소를 시작할 수 있다. 예를 들어 사진 캡처와 같은 기능은 다른 앱이 존재하므로, 직접 개발 대신 그 앱을 사용하도록 설정.(코드 연결조차 필요없음. 액티비티 시작만 하면 됨.)
->시스템이 구성 요소를 시작하는 경우, 그 앱에 대한 프로세스를 시작하고(실행 중이지 않은 경우), 해당 구성 요소에 필요한 클래스를 인스턴스 화함. ex) 앱 내에 사진 캡처 액티비티를 시작하면, 앱 내에서가 아닌 카메라 앱에 속한 프로레스가 실행 됨. 따라서 android 앱에는 단일 진입 지점이 없음(main() 함수 x)
-> 다른앱의 구성요소를 활성화 하려면 시스템에 메시지를 전달해 특정 구성 요소를 시작할 인텐트를 지정해야 함. 그러면 시스템이 해당 구성 요소를 활성화 해준다.

액티비티, 서비스, 브로드캐스트 수신기는 Intent라고 하는 비동기식 메시지가 활성화 한다. 인텐트는 각각의 구성 요소를 런타임에 서로 바인드함.(구성 요소가 앱에 속하는지는 무관)
액티비티와 서비스의 경우 인텐트는 수행할 작업을 정의하고, 수행할 데이터의 URI를 나타냄. 인텐트로 결과를 반환하기도 함
브로드캐스트 수신기의 경우 인텐트는 브로드캐스트될 알람을 정의함. ex) 배터리부족을 나타내는 작업 문자열만 포함
콘텐츠 제공자는 ContentResolver로부터 요청으로 지정되면 활성화 됨. 콘텐츠 확인자는 콘텐츠 제공자와의 모든 직접적인 트랜잭션을 처리하여 제공자와의 트랜잭션을 수행하는 구성 요소가 그런일을 하지 않아도 되게 하며, 대신 ContentResolver 객체에서 메서드를 호출.(보안 목적)

각 요소의 활성화 메서트
액티비티 - intent를 startActivity() , startActivityForResult()에 전달 (후자는 결과 반환을 원하는 경우)
서비스 - intent를 startService(), bindService()에 전달.
브로드캐스트 : intent를 sendBroadcast(), sendOrderedBroadcast(), sendStickyBroadcast()에 전달
콘텐츠 제공자 - ContentResolver에서 query()를 호출

AndroidManifest.xml 파일은 앱의 모든 구성 요소를 선언함. 앱 구성 요소를 시작하려면 이 파일을 읽음.
추가적으로 앱이 요구하는 사용자 권한 식별, 최소 API 레벨 선언, 필요로하는 HW/SW 기능 선언, 링크되어야 하는 API 라이브러리 와 같은 역할을 함.

manifest에 관해 추가적으로 구성요소, 기능, 요구사항, 리소스에 관해 설명하는데, 당장 사용할 기능에 대해선 android:icon="@drawalbe/~"이 아이콘에 대한 리소스 명시라는 점 정도일 것 같다.


Previous
Next Post »