안드로이드 프로그래밍을 하려면 쓰레드 단위의, 프로세스 단위의 일들을 3차원으로 생각할 수 있어야 한다.
안드로이드의 (시스템 측면의) 가장 기본인 App Components를 읽고나면 프로그래밍의 측면이 달라질 것이다.
내부 시스템을 모르고 프레임워크가 편하게 가이드하는 대로만 프로그래밍을 하면 얻는게 없다.
Intro
프로그래머가 어떻게 컴포넌트들을 빌드할 수 있는지 설명하고 있는 부분이다.
예를들어 인텐트를 사용해서 어떻게 연결시키는지와 같은 것들을.
Intents and Intent Filters
Intent(이하 인텐트)는 다른 앱 컴포넌트로부터 액션을 요청하기위해 사용할 수 있는 메세지 객체이다.
비록 인텐트가 몇가지 방법으로 컴포넌트 간에 통신을 용이하게 해준다.
그 세 가지 기본적인 사례이다.
- 액티비티를 시작하기 위해
- 서비스를 시작하기 위해
- 브로드캐스트를 전달하기 위해
Intent Types
다음은 인텐트의 두 종류이다.
- 명시적 인텐트
- 암시적 인텐트
주의사항:
앱이 안전하다는 것을 보장하기위해서 서비스를 실행할 때는 항상 명시적 인텐트를 사용하자. 그리고 서비스에 인텐트 필터를 선언하지 말자.
서비스를 실행하기위해 암시적 인텐트를 사용하는 것은 보안 위험이 있다. 서비스가 인텐트에게 응답할 것이라는 보장이 없기 때문이다.
또 유저가 어떤 서비스가 실행된건지 알 수 없기 때문이다.
API 레벨 21(5.0) 부터는 암시적 인텐트로 bindService( )를 호출하면 예외가 발생하게끔 되어있다.
Building an Intent
인텐트 객체는 안드로이드 시스템이 사용하는 정보를 옮긴다.
인텐트에 포함된 주요 정보는 다음과 같다.
- Component name
:: 서비스를 실행할 때, 항상 컴포넌트 이름을 명시할 것.:: 그렇지 않으면 서비스가 인텐트에 응답할 것이라는 확신을 할 수 없다.:: 또한 유저는 어떤 서비스가 실행되었는지 알 수 없다.
- Action
- Data
:: URI와 타입 모두를 정할 때에는 setData( )와 setType( )을 호출하지 말자.:: 이 메소드들 각각으로 인해 서로의 값이 무효화된다.:: 항상 setDataAnyType( )을 사용하자.
- Category
- Extras
- Flags
플래그는 인텐트를 위한 메타데이터로써 그 기능이 인텐트 클래스에 정의되어 있다.
플래그는 어떻게 액티비티를 실행하는지, 액티비티가 실행된 후에 어떻게 액티비티를 다루는지, 아마 안드로이드 시스템에게 지시한다.
Forcing an app chooser
암시적 인텐트에 응답할 앱이 두 개 이상일 때,
유저는 어떤 앱을 사용할지 고를 수 있고,
특정 액션을 위한 기본 선택값을 만들 수 있다.
그러나 만약 다수의 앱이 인텐트에 응답할 수 있고 유저가 다른 앱을 선택하기를 원한다면, 선택 다이얼로그를 띄워야한다.
선택 다이얼로그는 유저에게 어떤 앱을 사용할 것인지 묻는다.
chooser를 띄우기위해 createChooser( )를 사용하는 인텐트를 생성하고, startActivity( )로 인텐트를 넘긴다.
Intent sendIntent = new Intent(Intent.ACTION_SEND);
...
String title = getResources().getString(R.string.chooser_title);
// Create intent to show the chooser dialog
Intent chooser = Intent.createChooser(sendIntent, title);
// Verify the original intent will resolve to at least one activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
startActivity(chooser);
}
Receiving an Implicit Intent
어떤 암시적 인텐트가 받을 수 있는지 광고하기위해, 각 앱 컴포넌트의 여러 인텐트 필터를 선언한다.
각 인텐트 필터는 인텐트의 액션, 데이터, 카테고리를 기반으로 받아들이는 인텐트의 타입을 지정한다.
인텐트가 인텐트 필터 중 하나를 통과할 수 있는 경우에만, 시스템은 암시적 인텐트를 나의 앱 컴포넌트에 전달할 것이다.
:: 암시적 인텐트는 타겟에 항상 전달되어진다. 컴포넌트가 선언한 어떤 인텐트 필터에 상관없이.
앱 컴포넌트는 분리된 필터를 각 고유의 작업마다 선언해야한다.
사진첩 앱의 한 액티비티는 아마 두 필터를 가졌을 것이다.
한 필터는 이미지를 보여주고, 다른 필터는 이미지를 편집한다.
이 액티비티가 시작할 때, 인텐트를 조사하고 인텐트의 정보를 기반으로 어떻게 동작할지를 결정한다.
<intent-filter> 안에서 인텐트 타입을 지정할 수 있다.
<action>
받아들일 인텐트 액션을 선언한다.
이 값은 반드시 액션의 문자열 값이어야 한다. 클래스 상수가 아니다.
<data>
받아들일 데이터 타입을 선언한다.
data URI와 타입의 다양한 측면을 지정하는 속성들을 이용하여 선언한다.
<category>
받아들일 인텐트 카테고리를 선언한다.
이 값은 반드시 액션의 문자열 값이어야 한다. 클래스 상수가 아니다.
:: 암시적 인텐트를 받기위해서 인텐트 필터에 CATEGORY_DEFAULT 카테고리를 반드시 포함해야 한다.
:: startActivity( )와 startActivityForResult( ) 메소드는 모든 인텐트를 다룬다.
:: 마치 그들이 카테고리를 선언한 것 마냥.
:: 인텐트 필터에 이 카테고리를 선언하지 않으면 암시적 인텐트는 액티비티를 해결할 수 없다.
<activity android:name="ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
'Android > 현업에 투입되기위한 STUDY' 카테고리의 다른 글
0724 4차 App Componenets 발표 (0) | 2015.07.24 |
---|---|
0714 3일차 AlramStudy project 컨설팅 (0) | 2015.07.14 |
App Components > Activities Intro (0) | 2015.07.10 |
0710 2일차 AlramStudy project 컨설팅 (0) | 2015.07.10 |
0707 1일차 HAS-A로 시작해서 DI로 끝난다. (0) | 2015.07.07 |