-
ReStudy 1. 애플리케이션 컴포넌트backup/android 2013. 11. 15. 21:53
- 2013. 11. 15 ---------------- 작성 시작, 1~4 작성
- 2013. 12. 07 ---------------- 1~4 첨가, 5 작성
- 2012. 12. 10 ---------------- 6~8 작성
1. 액티비티
쉽게말해 눈에 보이는 부분을 담당, 각 액티비티에 그릴 수 있는 하나의 디폴트 윈도우가 부여된다. 윈도우의 사즈는 화면 전체를 채울수도 더 작을 수도 있다. 윈도우 내에는 뷰들이 위치한다.(사각형영역으로 계층을 이룸)
이 뷰들의 계층이 setContentView()에 의해 윈도우에 배치된다. 최상위에 있는 뷰의 오브젝트를 사용한다.
2. 서비스
사용자 인터페이스가 없다. 백그라운드에서 실행된다. 서비스가 제공하는 인터페이스를 통해 서비스와 커뮤니케이션 할 수 있다. 모든 서비스는 Service 베이스 클래스를 확장한다. 다른 컴포넌트처럼 메인 쓰레드에서 실행된다. 그래서 종종 다른 쓰레드를 만들어 작동시킨다.
3. 브로드캐스트 리시버
브로드캐스트를 수신하고 응답한다.(시간대 변경, 배터리 부족, 사진 등등) 모든 리시버는 BroadcastReceiver 베이스 클래스를 확장한다. 사용자 인터페이스를 보여주지 않는대신 수신한 정보에 응답하는 액티비티를 시작하거나 노티피케이션 매니저를 사용할 수 있다.
4. 컨텐트 프로바이더
다른 어플리케이션에 유용한 데이터 집합을 만든다. 자신이 제어하는 타입의 데이터를 다른 애플리케이션이 사용할 수 있도록 하는 표준 메쏘드 집합을 구현하기 위해, ContentProvider 베이스 클래스를 확장한다. 이런 메쏘드들은 직접이아니라 컨텐트 리졸버 오브젝트를 사용하여 호출한다.
특정 컴포넌트에 의해 처리되어야 하는 요청이 있을 때마다, 안드로이드는 그 컴포넌트의 애플리케이션 프로세스가 실행되도록 하며, 필요하다면 그것을 시작하기도 한다.
5. 인텐트(컴포넌트 활성화하기)
컨텐츠 프로바이더는 컨텐트 리졸버 요청의 대상이 될 때 활성화. 액티비티, 서비스, 그리고 브로드캐스트 리시버는 인텐트라 불리는 비동기적 메시지에 의해 활성화된다.
액티비티, 서비스에 대해 요청되는 액션을 가리키고 그 액션이 처리해야 하는 데이터의 URI를 나머지 다른 것들과 함께 명시한다. 브로드캐스트 리시버에 대해서는 공지되는 액션을 가리킨다.(카메라 버튼이 눌렸다)
- 액티비티는 Context.startActivity() 또는 Activity.startActivityForResult()로 런치되고 getIntent()를 호출함으로써, 그것을 런치하도록 한 초기 인텐트를 볼 수 있다. 안드로이드는 그 액티비티에게 이후 이어지는 인텐트를 전달하기 위해 onNewIntent()를 호출한다. 자신이 시작시킨 액티비티로부터 결과를 리턴받고자 한다면 startActivityForResule()를 호출하고, 그 결과는 onActivityResult()가 호출되는 곳에 전달되는 인텐트 오브젝트 내에서 리턴된다.
- 서비스는 Context.startService()에 인텐트 오브젝트를 파라미터로 전달함으로써 시작된다. 서비스의 onStart()를 호출하고 그곳에 인텐트 오브젝트가 전달된다.
인텐트는 호출하는 컴포넌트와 타겟 서비스 간의 지속적인 연결을 확립하기 위해 Context.bindService()에 파라미터로 전달 될 수도 있다. 해당 서비스는 onBind()가 호출되는 곳에서 인텐트 오브젝트를 전달받는다.- 애플리케이션은 Context.sendBroadcast(), Context.sendOrderedBroadcast(), Context.sendStickyBroadcast() 같이 다양하게 변형된 메쏘드에 인텐트 오브젝트를 전달함으로써 브로드캐스트를 만들어낼 수 있다. 이 브로드캐스트에 관심을 갖는 모든 브로드캐스트 리시버에게 그들의 onReceive()를 호출해 줌으로써 인텐트를 전달한다.
6. 컴포넌트 종료하기컨텐트 프로바이더나 브로드캐스트 리시버는 응답하는 동안에만 활성화되어 있다. 그러나 액티비티는 사용자와 오랜시간 동안 대화를 하며 활성화 상태로 남아있다. 심지어 대화가 지속될 수 있는 한, 그 것이 사용되지 않는 상태에도 활성화 상태로 남는다. 유사하게 서비스 또한 오랫동안 실행 상태로 남아 있다.- 액티비티는 finish() 호출을 통해 스스로 종료될 수 있다. finishActivity()를 호출함으로써, 다른 액티비(startActivityForResult()를 통해 시작된 액티비티)를 종료시킬수도 있다.
- 서비스는 stopSelf() 호출이나 Context.stopService()를 호출함으로써 종료될 수 있다.
컴포넌트는 더 이상 사용되지 않거나 활성화된 컴포넌트를 위해 메모리를 회수해야 할 때 시스템에 의해 종료될 수 있다.7. 매니페스트 파일
애플리케이션은 매니페스트에 컴포넌트를 선언한다. 그 외에 링크되어야 할 필요가 있는 특정 라이브러리를 지정하거나, 부여되길 원하는 임의의 퍼미션을 식별하는 것과 같은 몇 가지 것들을 한다.
<?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>
서비스는 <service>, 브로드캐스트 리시버는 <receiver>, 컨텐트 프로바이더는 <provider> 엘리먼트로 선언된다. 매니페스트에 선언되지 않는 액티비티, 서비스, 컨텐트 프로바이더는 시스템에게 보여지지 않으며 결과적으로 결코 실행되지 않는다. 하지만 브로드캐스트 리시버는 매니페스트 내에서 선언되거나, 또는 코드 내에서 동적으로 만들어져 Context.registerReceiver()를 호출함으로써 시스템에 등록될 수 있다.
8. 인텐트 필터
인텐트 오브젝트는 대상이되는 컴포넌트를 명시적으로 지정할 수 있다. 하지만 명시적으로 지정되지 않으면 안드로이드는 인텐트를 처리할 수 있는 최선의 컴포넌트를 찾아내야 한다. 이것은 해당 인텐트 오브젝트와 그 인텐트의 잠재적 대상이 될 수 있는 컴포넌트들의 인텐트 필터를 비교함으로써 이루어진다. 인텐트 필터는 안드로이드에게 해당 컴포넌트가 처리할 수 있는 인텐트의 종류를 알려준다.
<?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:type=”image/jpeg” />
<category android:name=”android.intent.category.DEFAULT” /></intent-filter>
</activity>
...
</application>
</manifest>
첫 번째 필터는 런처에 그 액티비티가 표시되게 한다. 달리 말하면, 그 액티비티가 애플리케이션의 시작점이고, 사용자가 런처에서 애플리케이션을 선택했을 때 그들이 처음보게 될 액티비티라는 것을 의미한다.
두 번째 필터는 특정 타입의 데이터에 대해 액티비티가 수행할 수 있는 액션을 선언한다.
컴포넌트가 어떤 필터도 가지지 않는다면 그것은 인텐트의 대상으로 컴포넌트를 명시적으로 지정하는 인텐트에 의해서만 활성화될 수 있다.
코드 내에서 생성되어 등록된 브로드캐스트 리시버에 있어서 인텐트 필터는 IntentFilter 오브젝트에 의해서 직접적으로 인스턴스화 된다. 나머지 모든 필터들은 매니페스트 내에서 설정된다.