[안드로이드/Android] PART3 명시적, 암시적 인텐트의 예제
명시적 인텐트는 특정 컴포넌트를 시작하기 위해 사용할 수 있다.
(특정 액티비티 또는 특정 서비스)
명시적 인텐트를 생성하기 위해서는 Intent 객체에 컴포넌트 이름을 정의해야만 하고,
다른 데이터는 넣어도 되고 안 넣어도 된다.
예를 들어, 웹으로 부터 파일을 다운받도록 설계된 DownloadService라는 이름을 갖는 서비스를
생성했을 때, 다음의 코드를 통해서 해당 서비스를 시작할 수 있다.
// 액티비티로부터 시작되기 때문에, 'this'는 Context를 나타낸다.
// fileUrl은 문자열 형태의 URL이다, such as "http://www.example.com/image.png"
Intent downloadIntent = new Intent(this, DownloadService.class);
downloadIntent.setData(Uri.parse(fileUrl));
startService(downloadIntent);
암시적 인텐트를 사용할 경우에는 액션 정보를 기입함으로써 액션 정보를 처리할 수 있는 다른 어플리케이션을 찾아야 한다. 암시적 인텐트 같은 경우 현재 사용하는 어플리케이션에서 그와 관련된 ACTION을 직접 할 수 없는 경우에 유용하다, ACTION을 처리할 수 있는 어플리케이션이 여러개 있는 경우 그 중에 하나를 선택할 수 있다.
예를 들어, 유저가 다른 사람과 공유하고 싶어하는 데이터가 있을 때, ACTION_SEND 액션 정보를 이용해서 인텐트를 생성한 뒤, 공유할 데이터를 extras 형태로 추가한다. 그 인텐트를 가지고 startActivity를 호출했을 때, 유저는 데이터를 공유하고자 하는 어플리케이션을 선택할 수 있다.
[주의] : startActivity()를 통해서 암시적인 인텐트를 보낼 때, 시스템 자체에서 그 인텐트를 처리 할 수 있는 어플리케이션이 없을 수 있다. 그런 일이 발생한다면, 함수 호출은 실패되며, 어플리케이션 자체에 문제가 발생한다.
이런 일을 방지하기 위해 전달할 인텐트 객체를 대상으로 resolveActivity()를 호출해서,
해당 인텐트를 받을 수 있는 컴포넌트의 존재 유무를 확인해야 한다. 함수 호출 결과가
널일 경우, 해당 인텐트를 사용할 수 없다.
// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
sendIntent.setType(HTTP.PLAIN_TEXT_TYPE); // "text/plain" MIME type
// Verify that the intent will resolve to an activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
startActivity(sendIntent);
}
startActivity()가 호출될 때, 시스템은 인텐트(ACTION_SEND 액션 정보를 갖고 있으며 동시에 "text/plain" 데이터를 처리할 수 있는 인텐트)를 처리할 수 있는 컴포넌트를 조사한다. 인텐트를 처리할 수 있는 컴포넌트를 찾았을 때, 시스템은 바로 해당 컴포넌트를 실행하고 인텐트를 전달하게 된다.
'안드로이드 이론' 카테고리의 다른 글
[안드로이드/Android] PART5 PendingIntent(펜딩 인텐트) (1) | 2015.06.23 |
---|---|
[안드로이드/Android] PART4 암시적 인텐트(Implicit Intent) 매니페스트(manifest) (0) | 2015.06.22 |
[안드로이드/Android] PART2 명시적 인텐트 암시적 인텐트에 대해서 (0) | 2015.06.22 |
[안드로이드/Android] PART1 인텐트와 인텐트 필터 (0) | 2015.06.22 |
[안드로이드/Android] 외부 저장소(External Storage) Part2 (0) | 2015.06.22 |