컴포넌트 종료
컨텐츠 프로바이더는 ContentResolver 의 요청에 응답하고 있을때만 활성화됩니다.
브로드 캐스트 리시버는 브로드 캐스트 메세지에 응답하고 있을때만 활성화됩니다.
즉 이들 컴포넌트를 명시적으로 종료시킬 필요는 없습니다.
한편 엑티비티는 사용자 인터페이스를 제공합니다.
긴 시간에 걸쳐 사용자와 대화를 하기 위해 대기상태에서도 대화가 끊어지지 않는 이상 활성화된 채로 있을 가능성이 있습니다. 동일하게 서비스도 긴 시간 실행된 채로 있는 가능성이 있습니다.
Android에는 엑티비티 서비스를 아래와 같이 규칙적인 방법으로 종료시키기 위해 메소드를 준비하고 있습니다.
엑티비티를 종료 시키기 위해서는
메소드를 호출합니다.finish()
어떤 엑티비티로부터 startActivityForResult()
에서 개시한 다른 엑티비티는 finishActivity()
을 호출해서 종료 시킬수가 있습니다.
- 서비스는
메소드를 호출하던지stopSelf()
을 호출해서 정지 시킬수 있습니다.Context.stopService()
컴포넌트가 이미 사용 되어 있지 않을 경우와 Android가 보다 엑티브한 다른 컴포넌트에 메모리를 할당할 필요가 있는 경우는 시스템이 컴포넌트를 종료시키는 일도 있습니다. 이와 같은 상태 및 그 영향에 관해서는 컴포넌트 라이프 사이클에서 자세히 설명합니다.
MANIFEST FILE
어플리케이션 컴포넌트를 개시를 위해 Android는 그 컴포넌트의 존재를 인식해 있을 필요가 있습니다.
어플리케이션 컴포넌트는 manifest 파일에서 선언합니다.그 파일은 어플리케이션 코드,파일,리소스등과 같이 Android 패키지 (.apk파일)에 핸들됩니다.
manifest는 구조화된XML파일로 모든 어플리케이션에 이미 AndroidManifest.xml 라는 이름으로 되어있습니다. 어플리케이션 컴포넌트 선언 이외에도 어플리케이션을 링크 시키는 필요가 있는 라이브러리 (디폴트 Android 라이브러리는 뺀다)의 설정과 어플리케이션에 부여해야하는 권한 설정등에도 사용합니다.
하지만
manifest 의 가장 중요한 역할은 어플리케이션 컴포넌트에 관한 정보를 Android에 제공하는 것입니다.
예를 들어 엑티비티를 다음과 같이 선언 할 수 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest . . . >
<application . . . >
<activity android:name="com.example.project.FreneticActivity"
android:icon="@drawable/small_pic.png"
android:label="@string/freneticLabel"
. . . >
</activity>
. . .
</application>
</manifest>
<activity>
요소의 name
속성은 그 액티비티를 실장하는 Activity
서브 클래스를 지명합니다.icon
및 label
속성에는 사용자에 대해서 표시하는 아이콘과 라벨이 보유되어 있는 리소스 파일을 지정합니다.
그 외 다른 컴포넌트도 서비스는 <service>
요소 브로드 캐스트 리시버는 <receiver>
요소 컨텐츠 프로바이더는 <provider>
요소를 사용해서 같은 방법으로 선언합니다.
manifest 로 선언되어 있지않는 엑티비티,서비스 및 컨텐츠 프로바이더는 시스템으로 부터 인식되지 않기 때문에 실행되는 일은 없습니다. 다만 브로드 캐스트 리시버의 경우는 manifest로 선언 하는 방법과 코드네에 BroadcastReceiver
오브젝트로써 동적으로 작성하고
를 호출해서 시스템에 등록하는 방법도 있습니다.Context.registerReceiver()
Intent filter
Intent 오브젝트에서는 대상으로 하는 컴포넌트를 명시적으로 지명할 수있습니다.명시적으로 지명 되어 있는 경우Android는manifest 파일내 선언을 기초로해서 컴포넌트를 특정하고 엑티비티합니다. 한편 명시적으로 지명되어 있지않은 경우는 그 Intent로 응답하는 상에서 최적인 컴포넌트가 선별됩니다. 방법으로서는 Intent 오브젝트를 그 대상으로 되어 얻은 컴포넌트 Intent filter로 조회합니다. 컴포넌트 Intent filter 는 그 컴포넌트에서 처리할 수있는 Intent 종류를 나타냅니다. 이것도 컴포넌트에관한 중요한 정보의 하나이기때문에 manifest파일로 선언합니다. 다음은 위에 표시한 예를 확장해서 두가지의 Intent filter 를 추가한 액티비티를 나타냅니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest . . . >
<application . . . >
<activity android:name="com.example.project.FreneticActivity"
android:icon="@drawable/small_pic.png"
android:label="@string/freneticLabel"
. . . >
<intent-filter . . . >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter . . . >
<action android:name="com.example.project.BOUNCE" />
<data android:mimeType="image/jpeg" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
. . .
</application>
</manifest>
이 열의 첫번째 ilter는 액션「android.intent.action.MAIN
」로 카테고리「android.intent.category.LAUNCHER
」를 조합시킨 일반적인 filter입니다. 이 filter는 어플리케이션
런쳐(사용자가 디바이스상에서 기동 할 수있는 어플리케이션을 일람으로 표시한 화면)로 그 액티비티를 표시할 필요가 있음을 나타내고 있습니다. 즉 이 엑티비티는 어플리케이션에 엔트리 포인트로서 기능하고 사용자가 런쳐에서 그 어플리케이션을 선별했을때에 최초로 표시된다는 것을 의미합니다.
두번째 filter는 엑티비티가 특정 타입 데이터에 대해 실행 하는 액션을 선언하고 있습니다.
컴포넌트에는 Intent filter를 몇개라도 설정하고, 각각의 filter에서 개별 기능을 선언할 수 있습니다.
filter 가 하나도 지정되어 있지않은 컴포넌트는 그 컴포넌트를 대상으로 명시적으로 지명되어있는 Intent에서 만 활성화할 수있습니다.
코드 안에서 작성하고 등록한 브로드 캐스트 리시버의 경우 Intent filter는 IntentFilter
오브젝트로써
직접 인스턴스화 됩니다. 그외 모든 filter는 manifest에서 설정합니다.
'나는 엔지니어 > 안드로이드' 카테고리의 다른 글
Application Fundamentals(1) (0) | 2012.05.30 |
---|---|
Android란? (0) | 2012.05.29 |
안드로이드 정리를 시작하며. (0) | 2012.05.29 |