인텐트 사용 유형
Intent
는 일종의 메시지 객체입니다. 인텐트을 사용해 다른 앱 구성 요소로부터 작업을 요청할 수 있습니다. 인텐트가 여러 구성 요소 사이의 통신을 용이하게 하는 데, 기본적인 사용 사례는 다음과 같은 세 가지입니다.
- 액티비티 시작하기:
Activity
는 앱 안의 화면 하나를 나타냅니다.Activity
의 새 인스턴스를 시작하려면Intent
를startActivity()
로 전달하면 됩니다.Intent
는 시작할 액티비티를 설명하고 모든 필수 데이터를 담고 있습니다.액티비티가 완료되었을 때 결과를 수신하려면,
startActivityForResult()
를 호출합니다. 액티비티는 해당 결과를 액티비티의onActivityResult()
콜백에서 별도의Intent
객체로 수신합니다. 자세한 정보는 액티비티 가이드를 참조하십시오. - 서비스 시작하기:
Service
는 사용자 인터페이스 없이 배경에서 작업을 수행하는 구성 요소입니다. 서비스를 시작하여 일회성 작업을 수행하도록 하려면(예: 파일 다운로드)Intent
를startService()
에 전달하면 됩니다.Intent
는 시작할 서비스를 설명하고 모든 필수 데이터를 담고 있습니다.서비스가 클라이언트-서버 인터페이스로 설계된 경우, 다른 구성 요소로부터 서비스에 바인딩하려면
Intent
를bindService()
에 전달하면 됩니다. 자세한 정보는 서비스 가이드를 참조하십시오. - 브로드캐스트 전달하기:
브로드캐스트는 모든 앱이 수신할 수 있는 메시지입니다. 시스템은 여러 시스템 이벤트에 대해 다양한 브로드캐스트를 전달합니다. 예를 들어 시스템이 부팅될 때 또는 기기가 변경되기 시작할 때 등이 해당됩니다. 다른 여러 앱에 브로드캐스트를 전달하려면
Intent
를sendBroadcast()
,sendOrderedBroadcast()
또는sendStickyBroadcast()
에 전달하면 됩니다.
인텐트에는 두 가지 유형이 있습니다.
- 명시적 인텐트는 시작할 구성 요소를 이름으로 지정합니다(완전히 정규화된 클래스 이름). 명시적 인텐트는 일반적으로 본인의 앱 안에서 구성 요소를 시작할 때 씁니다. 시작하고자 하는 액티비티 또는 서비스의 클래스 이름을 알고 있기 때문입니다. 예를 들어, 사용자 작업에 응답하여 새 액티비티를 시작하거나 배경에서 파일을 다운로드하기 위해 서비스를 시작하는 것 등이 여기에 해당됩니다.
명시적 인텐트는 특정한 앱 구성 요소를 시작하기 위해 사용하는 것입니다. 예를 들어 앱 내의 특정 액티비티나 서비스를 말합니다. 명시적 인텐트를 생성하려면 Intent
객체에 대한 구성 요소 이름을 정의합니다. 다른 인텐트 속성은 모두 선택 사항입니다.
예를 들어 앱 안에 DownloadService
라는 서비스를 구축했다고 합시다. 이 서비스는 웹 상에서 파일을 다운로드하도록 설계된 것입니다. 이것을 시작하려면 다음과 같은 코드를 사용하면 됩니다.
// Executed in an Activity, so 'this' is theContext
// The fileUrl is a string URL, such as "http://www.example.com/image.png"
Intent downloadIntent = new Intent(this, DownloadService.class);
downloadIntent.setData(Uri.parse
(fileUrl));
startService(downloadIntent);
Intent(Context, Class)
생성자가 앱에 Context
를 제공하고 구성 요소에 Class
객체를 제공합니다. 이처럼, 이 인텐트는 앱 내의 DownloadService
클래스를 명시적으로 시작합니다.
- 암시적 인텐트는 특정 구성 요소의 이름을 대지 않지만, 그 대신 수행할 일반적일 작업을 선언하여 또 다른 앱의 구성 요소가 이를 처리할 수 있도록 해줍니다. 예를 들어, 사용자에게 지도에 있는 한 위치를 표시해주고자 하는 경우, 암시적 인텐트를 사용하여 다른, 해당 기능을 갖춘 앱이 지정된 위치를 지도에 표시하도록 요청할 수 있습니다.
암시적 인텐트는 작업을 지정하여 기기에서 해당 작업을 수행할 수 있는 모든 앱을 호출할 수 있도록 합니다. 암시적 인텐트를 사용하면 본인의 앱은 작업을 수행할 수 없지만 다른 앱은 아마도 할 수 있을 때, 그리고 사용자로 하여금 어느 앱을 사용할지 선택하도록 하고자 할 때 유용합니다.
예를 들어 사용자가 다른 사람들과 공유했으면 하는 콘텐츠를 가지고 있는 경우, ACTION_SEND
작업이 있는 인텐트를 생성한 다음 공유할 콘텐츠를 지정하는 추가 정보를 추가하면 됩니다. 해당 인텐트로 startActivity()
를 호출하면 사용자가 어느 앱을 통해 콘텐츠를 공유할지 선택할 수 있습니다.
주의: 개발자가 startActivity()
로 전송한 암시적 인텐트를 처리할 앱이 사용자에게 전혀 표시되지 않을 수도 있습니다. 이런 일이 발생하면, 호출이 실패하고 앱 작동이 중단됩니다. 어느 액티비티든 이 인텐트를 수신하도록 확실히 하려면, Intent
객체의 resolveActivity()
를 호출합니다. 결과가 null이 아닌 경우, 인텐트를 처리할 수 있는 앱이 최소한 하나는 있다는 뜻이며 startActivity()
를 호출해도 안전합니다. 결과가 null이면, 해당 인텐트를 사용해서는 안 되며 가능한 경우 해당 인텐트를 발생시키는 기능을 비활성화해야 합니다.
// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
sendIntent.setType("text/plain");
// Verify that the intent will resolve to an activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
startActivity(sendIntent);
}
참고: 이 경우에서는 URI를 사용하지 않았지만 인텐트의 데이터 유형이 정의되어 추가 정보가 담고 있는 콘텐츠를 지정하였습니다.
startActivity()
를 호출하면 시스템이 설치된 앱을 모두 살펴보고 이런 종류의 인텐트를 처리할 수 있는 앱이 어느 것인지 알아봅니다( ACTION_SEND
작업이 있는 인텐트이며 "텍스트/일반" 데이터가 담긴 것). 이것을 처리할 수 있는 앱이 하나뿐이면, 해당 앱이 즉시 열리고 이 앱에 인텐트가 주어집니다. 인텐트를 허용하는 액티비티가 여러 개인 경우, 시스템은 대화를 표시하여 사용자가 어느 앱을 사용할지 직접 선택할 수 있게 합니다.
'Programming > Android' 카테고리의 다른 글
Android Studio / no target device found (0) | 2016.12.06 |
---|---|
How to use Android ADB Driver Installer for Windows XP/Vista/7/8 [펌] (0) | 2016.12.06 |
Activity lifecycle (0) | 2016.02.04 |
로그인 폼 (0) | 2016.02.03 |
Toast(알림) (0) | 2016.02.03 |