[안드로이드/Android] PART3 명시적, 암시적 인텐트의 예제

Posted by 앱해피
2015. 6. 22. 19:21 안드로이드 이론

 

명시적 인텐트

 

명시적 인텐트는 특정 컴포넌트를 시작하기 위해 사용할 수 있다.

(특정 액티비티 또는 특정 서비스)

명시적 인텐트를 생성하기 위해서는 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" 데이터를 처리할 수 있는 인텐트)를 처리할 수 있는 컴포넌트를 조사한다. 인텐트를 처리할 수 있는 컴포넌트를 찾았을 때, 시스템은 바로 해당 컴포넌트를 실행하고 인텐트를 전달하게 된다.