안드로이드 프레임워크에 대한 설명

안드로이드를 좀 해보기전에는 아래 내용을 그렇게 쉽게 이해할수없다..
삽질을 해가면서 직접 느낀부분이 정말  잘정리된 문서같다. 번역본 제공해주신 분때문에 빠르게 한번 읽어볼수있었습니다.
Android Application Framework FAQ
이번에는 안드로이드 개발자 사이트의 내용 중 Application Framework FAQ 내용을 번역해 보았습니다. 그냥 대충 그러려니 하고 쓰지만, 정확히 알지는 못하던, Process 에 관한 내용이나, Activity 간의 데이타 전달에 관해서 유용한 내용을 담고 있네요. 역시 사람들이 궁금해하는건 비슷한 모양입니다.

Q.하나의 어플리케이션에 포함되어있는 모든 Activity 와 Service 들은 하나의 프로세스에서 작동하게 되나요?

 

기본적으로 그렇습니다. 단, 개발자가 메니페스트 파일에 android:process 속성을 설정하는 경우, 특정 Activity 혹은 Service 를 별개의 프로세스에서 실행 시킬 수 있습니다.

 

Q.모든 Activity 들은 동일한 메인 스레드에서 실행 되나요?

Q.동일한 어플리케이션을 구성하고있는 Activity 와 Service 들 사이에 데이터를 주고 받을 수 있나요?

 

공유하고자 하는 데이타의 종류에 따라 여러가지 방법이 있습니다.

 

Primitive Data Types (기본 자료형)
 Primitive 데이타 타입을 공유하기 위해서는 intent.putExtras() API 를 이용할 수 있습니다. 만일 해당 데이터를 영구적으로 저장 보관할 필요가 있을 경우, Preference 클래스를 사용하시면 좋습니다.

 

Complex Data Types (복잡한 사용자 정의 자료형)

 

– Non-Persistent Objects (비 영구적인 오브젝트)

 

 영구적으로 저장될 필요가 없는 Complex 데이타 타입을 공유하기 위해서는 다음의 방법들을 사용할 수 있습니다.

 

 안드로이드의 Application 클래스
 안드로이드 Application 클래스는 전역적으로 사용되는 어플리케이션 상태 정보를 유지하고자 할 때, 가장 기본적으로 사용할 수 있는 클래스 입니다. 특정 어플리케이션에 속한 모든 Activity, Service 들은 getApplication() 를 호출해서, Application 클래스에 접근 할 수 있습니다. Application  클래스는 생명주기와 관련되어 몇 가지 API 들을 갖고 있으며 메니페스트 파일에 정의되어있다면 안드로이드 시스템에 의하여 자동적으로 생성됩니다.
 Public 한 Static 필드 혹은 메서드의 사용
 Activity 와 Service 들이 데이터를 서로 공유하기 위해 사용할 수 있는 또다른 방법은, 특정 Activity 내에 Public 한 Static 멤버 변수 혹은 메서드를 사용하는 것입니다. 개발자가 공유하고자 하는 데이타를 가르키는 Static 변수를 생성하며, 다른 Activity 와 Service 들은 해당 Static 변수를 통해 공유하고자 하는 데이타에 접근할 수 있습니다.

 


 

 

공유하고자 하는 Object 의 WeakReference 로 구성된 HashMap

 

 개발자는 WeakReference 로 구성된 HashMap 을 사용할 수도 있습니다. 특정 Activity 가 또다른 Activity 에게 Object 를 전달하고자 할 때, Object 를 WeakReference 에 넣고, Intent 를 통해 해당 Object 에 접근하기 위한 Key 값을 Intent Extra 값을 통해 전달 할 수 있습니다. Intent 를 전달받은 Activity 는 해당 Key 를 이용하여, Object 에 접근할 수 있습니다.
Singleton 클래스
 Singleton 클래스를 사용하는 경우 몇 가지 이점이 있습니다. 어플리케이션의 구성요소들이 복잡한 Cast 과정을 거치지 않고  공유하고자 하는 정보에 손쉽게 접근 할 수 있으며, 공유하고자 하는 값을 참조하기 위해 어플리케이션의 하위 클래스들이 일일이 공용 Interface 를 구현할 필요도 없습니다.
 하지만 Singleton 클래스의 라이프 사이클을 개발자의 의도에 맞추어 관리하는데는 어려움이 있습니다. 라이프 사이클 모델을 잘 준수하기 위해서 Singleton 클래스는 어플리케이션의 onCreate() 시점에 할당되고, onTerminate() 시점에 해지 되어야 합니다.
– Persistent Objects (영구적인 오브젝트)

 비록 어플리케이션이 작동 중인 상황이라고 하더라고, 시스템이 해당 프로세스를 종료 시킨 후, 잠시 후에 다시 시작하는 경우도 있을 수 있습니다. 따라서, 어플리케이션의 생명 주기와 관계 없이, 영구적으로 유지해야 하는 데이타가 있다면, 개발자는 특정 Activity 가 종류 될 수 있다고 알게 되는 순가, 해당 데이타를 저장 해야 합니다.

사용자가 정의한 복잡한 오브젝트 정보를 저장하기 위해서는 다음과 같은 방법을 사용할 수 있습니다.

 

  • Application Preferences

     

  • Files

     

  • ContentProviders

     

  • SQLite DB

     

 각각의 요소들을 어떻게 사용할 수 있는지에 대한 보다 상세한 설명은 Data Storage 항목을 참고하시기 바랍니다.

Q.특정 Activity 를 시작하기 전에 해당 Activity 가 이미 작동중인지 어떻게 확인 할 수 있나요?

 만일 특정 Activity가 현재 작동중인 경우에는 해당 Activity 를 화면 앞으로 내보이고, 그렇지 않은 경우에만 새로운 Activity 를 시작하고자 하는 경우라면, 일반적으로 startActivity() API 를 호출 할 때, NEW_TASK_LAUNCH 플레그를 사용하시면 됩니다.

 Q. 만일 Acitivty 가 원격 Service 를 시작하는 경우, 해당 Service 가 Activity 로 어떠한 메시지를 전달해 줄 수 있나요?

 원격 Service의 경우 Callback 인터페이스를 정의하고, 해당 Service 에 연결된 클라이언트들이 정의된 형식의 Callback 함수를 등록하면,
Service 가 원하는 시점에 해당 Callback 함수들을 호출 하도록 할 수가 있습니다. RemoteCallbackList 클래스가 그런한 기능을 지원해 줍니다.
 또한, API 데모 중에는 원격 Service 의 Callback 기능을 사용하는 샘플 코드가 제공되고 있습니다.

Q. 어플리케이션이 응답하지 않습니다. (ANR) 다이얼로그를 어떻게 피할 수 있나요?

‘응답성을 위한 설계’ 문서를 살펴 보세요.

 

어플리케이션이 특정 패키지가 추가 되거나 삭제되었는지 알수 있나요?

 

패키지가 추가되는 경우에는 PACKAGE_ADDED, 패키지가 삭제되는 경우  PACKAGE_REMOVED 값을 같는 Broacast Intent 가 발생합니다. 만일 개발자가 해당 Broadcast Intent 를 수신받고자 한다면, 아래와 같은 코드가 필요합니다.

 

<receiver android:name ="com.android.samples.app.PackageReceiver">
     <intent-filter>
         <action android:name="android.intent.action.PACKAGE_ADDED"/>
         <action android:name="android.intent.action.PACKAGE_REMOVED"/>          <data android:scheme="package" />
     </intent-filter>
</receiver>

 위 코드에서

 

 PackageReceiver 는 BroadcastReceiver 클래스입니다. 매번  패키지가 추가 되거나 삭제되는 경우 이 클래스 내의 onReceive() 콜백 API 가 호출됩니다.

 

 

기본적으로 모든 어플리케이션 코드는 동일하게 어플리케이션 메인 스레드에서 작동하며, 

 

또한

 

이 스레드는 어플리케이션에서 발생하는 모든 UI 이벤트를 처리합니다. 단, 다른 프로스세스로 부터 호출된 IPC 콜을 처리하는 경우, 해당 코드는 별개의 스레드에서 작동하게 됩니다. 안드로이드 시스템은 다른 이러한 IPC 콜을 처리하기 위하여, 개별 프로세스 마다, 추가적으로 Transaction 스레드를 생성하고 유지합니다. 개발자가 시간이 오래걸리는 작업을 수행하고자 한다면, 어플리케이션 메인 UI 스레드가 블락되는 것을 막기 위하여, 별도의 스레드를 생성해 주어야 합니다.

[출처] [번역] 안드로이드 Application Framework FAQ|작성자 휴우 <- 감사합니다. : )

 

 

 

Leave a Reply

Your email address will not be published.