Android

안드로이드 인텐트를 알아보자!

세밍_ 2020. 3. 16. 18:28
728x90
반응형

 

여러분 안녕하세용 >.0

제가 앞선 메니페스트 포스팅에서 인텐트에 대해서 다룰 거라고 말씀드렸죠?

오늘이 그날입니다!!

(이거 소프트스퀘어드 과제의 일환으로 금요일까지 3개의 과제가 있는데요,

이제 1-3번이네요 하핫 그래도 힘내봅시다!)


인텐트(Intent)는 다른 앱 구성요소(Activity, Service, Broadcast Receiver, Contents Provider)로부터 작업을 요청하는 메시징 객체입니다.

인텐트를 사용하는 사례는 대표적으로 3가지가 있습니다.

<Intent를 사용하는 3가지 사례>

▶액티비티 시작

Activity는 앱 안의 단일 화면을 나타냅니다.

Activity의 새 인스턴스를 시작하려면 인텐트를 ​startActivity()로 전달하면 됩니다. 인텐트는 시작할 액티비티를 설명하고 모든 필수 데이터를 담습니다.

액티비티가 완료되었을 때 결과를 수신하려면, startActivityForResult()를 호출합니다. 액티비티는 해당 결과를 이 액티비티의 onActivityResult() 콜백에서 별도의 Intent 객체로 수신합니다.

▶서비스 시작

서비스는 사용자 인터페이스 없이 백그라운드에서 작업을 수행하는 구성요소 입니다.

서비스를 시작하여 일회성 작업(예: 파일 다운로드)을 수행하도록 하려면 인텐트를 startService()에 전달하면 됩니다. 인텐트는 시작할 서비스를 설명하고 모든 필수 데이터를 담고 있습니다.

서비스가 클라이언트-서버 인터페이스로 디자인된 경우, 다른 구성요소로부터 서비스에 바인딩하려면 인텐트를 bindService()에 전달하면 됩니다.

▶브로드캐스트 전달

브로드캐스트는 모든 앱이 수신할 수 있는 메세지입니다.

인텐트를 sendBroadcast() 또는 sendOrderedBroadcast()에 전달하면 다른 앱에 브로드캐스트를 전달할 수 있습니다.


<인텐트의 2가지 유형>

▶명시적 인텐트

인텐트를 충족하는 애플리케이션이 무엇인지 지정합니다.

이를 위해 대상 앱의 패키지 이름 또는 완전히 자격을 갖춘 구성요소 클래스 이름을 제공합니다.

명시적 인텐트는 일반적으로 앱 안에서 구성요소를 시작할 때 씁니다.

▶암시적 인텐트

특정 구성 요소의 이름을 대지 않지만, 그 대신 수행할 일반적인 작업을 선언해서 다른 앱의 구성요소가 이를 처리할 수 있도록 하는 것입니다.

예를 들어 사용자에게 지도에 있는 한 위치를 표시하고자 하면, 암시적 인텐트를 사용해서 해당 기능을 갖춘 다른 앱이 지정된 위치를 지도에 표시하도록 요청할 수 있습니다.


<인텐트 빌드>

intent 객체에는 Andorid 시스템이 어느 구성 요소를 시작할지 판별하는데 사용하는 정보가 담겨 있습니다.또한, 수신자 구성 요소가 작업을 적절히 수행하기 위해 사용할 정보도 담겨 있습니다.

intent 안에 어떤 것들이 담겨 있는지 대표적인 것들을 봐보도록 하겠습니다.

▶구성 요소 이름

선택항목으로 명시적 인텐트에 필요합니다.

앱에서 특정한 구성요소를 시작해야 하는 경우에는 구성 요소 이름을 지정해야 합니다.

Service를 시작할 때는 항상 구성요소 이름을 지정해야 합니다.

그렇지 않으면면 인텐트가 어느 서비스가 응답할지 확신할 수 없고, 사용자도 어느 서비스가 시작되는지 볼 수 없게 됩니다.

구성요소 이름을 설정하려면 setComponent(), setClass, setClassName()을 사용하거나 Intent 생성자를 사용합니다.

▶작업

수행할 일반적인 작업을 나타내는 문자열입니다.

브로드캐스트 인텐트의 경우, 이미 실행되어 보고 되고있는 작업을 가르킵니다. 이 작업은 대체로 나머지 인텐트의 구조를 결정합니다. (특히 데이터와 엑스트라에 포함되는 정보)

보통 Intent 클래스나 다른 프레임워크 클래스가 정의한 작업상수를 지정해야 합니다. 다음은 액티비티를 시작하는데 쓰이는 보편적인 작업입니다.

ACTION_VIEW

이 작업은 액티비티가 사용자에게 표시할 수 있는 어떤 정보를 가지고 있을 때 startActivity()가 있는 인텐트에서 사용합니다.

예) 갤러리 앱에서 볼 사진이나 지도 앱에서 볼 주소 등

ACTION_SEND

공유 인텐트라고도 하며,

사용자가 다른 앱을 통해 공유할 수 있는 데이터를 가지고 있을 때

startActivity()가 있는 인텐트에서 사용합니다.

예) 이메일, 소셜공유 앱

인텐트에 대한 작업을 지정하려면 setAction() 또는 Intent 생성자을 이용합니다.

▶데이터

작업을 수행할 데이터나 해당 데이터의 MIME 유형을 참조하는 URI입니다.

(MIME 유형: 파일변환 타입)

제공된 데이터의 유형을 나타내는 것을 빌반적으로 인텐트의 작업입니다.

데이터의 MIME 유형을 지정하면 Android 시스템이 인텐트를 수신하기 가장 좋은 구성 요소를 찾는데 도움이 됩니다. 때로는 MIME 유형을 URI를 통해 추론할 수 있습니다.

데이터 URI만 설정하려면 setData()를 호출하면 됩니다.

MIME 유형만 설정하려면 setType()을 호출합니다.

두가지 모두 설정하려면 setDataAndType()을 호출해야 합니다.

▶카테고리

인텐트를 처리해야 하는 구성 요소의 종류에 관한 추가 정보를 담은 문자열 입니다. 하지만 대부분의 인텐트에는 카테고리가 없어도 됩니다.

다음은 몇가지 보편적인 카테고리 입니다.

CATEGORY_BROWSABLE

대상 액티비티가 웹브라우저를 통해 시작되도록 허용하고 이미지, 이메일 메세지 등의 링크로 참조된 데이터를 표시하게 합니다.

CATEGORY_LAUNCHER

이 액티비티가 작업의 최초 액티비티이며, 시스템의 애플리케이션 시작 관리자에 목록의 게재됩니다.

그 외에 요청된 작업을 수행하는 데 필요한 추가 정보가 담긴 키-값 쌍을 담는 엑스트라, 인텐트에 대해 메타데이터와 같은 역할을 하는 플래그 등이 있습니다.

명시적 인텐트 예시

명시적 인텐트를 생성하려면 Intent 객체에 대한 구성요소 이름을 정의합니다.

예를 들어 앱 안에 DownloadService 라는 서비스를 구축했다고 가정하고 이 서비스는 웹상에서 파일을 다운로드 하도록 설계되었습니다.

이 서비스를 시작하려면 다음과 같은 코드를 사용합니다.

// Executed in an Activity, so 'this' is the Context // The fileUrl is a string URL, such as "http://www.example.com/image.png" val downloadIntent = Intent(this, DownloadService::class.java).apply { data = Uri.parse(fileUrl) } startService(downloadIntent)

Intent(Context,Class) 생성자가 앱에 Context를 제공하고 구성요소에 Class 객체를 제공하면서 인텐트가 앱 내의 DownloadService 클래스를 명시적으로 시작하게 합니다.

암시적 인텐트 예시

예를 들어 사용자가 다른 사람들과 공유했으면 하는 콘텐츠를 가지고 있는 경우, ACTION_SEND 작업이 있는 인텐트를 생성한 다음 공유할 컨텐츠를 지정하는 엑스트라를 추가합니다. 해당 인텐트로 startActivity()를 호출하면 사용자가 어느 앱을 통해 콘텐츠를 공유할지 선택할 수 있습니다.

// Create the text message with a string val sendIntent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TEXT, textMessage) type = "text/plain" } // Verify that the intent will resolve to an activity if (sendIntent.resolveActivity(packageManager) != null) { startActivity(sendIntent) }

startActivity()를 호출하면 시스템이 설치된 앱을 모두 살펴보고 이런 종류의 인텐트를 처리할 수 있는 앱이 어느 것인지 알아보고

이것을 처리할 수 있는 앱이 하나 뿐이면 해당 앱이 바로 열리고, 해당앱이 여러개이면 대화상자를 표시하여 사용자에게 앱을 선택하게 합니다.


intent에 대해서 다 잘 알았을까요?

추가적인 내용으로 앱 선택기 강제 적용, 암시적 인텐트 수신, 인텐트 필터에 대한 내용을 나중에 기회가 되면 또 공부해서 포스팅 해볼게요!

이 글을 쓰면서 유튜버 과나의 돼고비 듣고 있는데 너무 배고파지네요ㅋㅋㅋ

다들 요즘 코로나 때문에 집에서 대강 때우고 그러지 마시고 제대로 챙겨 먹으시면서 공부 합시다 화이팅!

<출처: Android developers: intent https://developer.android.com/guide/components/intents-filters?hl=ko#kotlin>

인텐트 및 인텐트 필터  |  Android 개발자  |  Android Developers

An Intent is a messaging object you can use to request an action from another app component . Although intents facilitate communication between components in several ways, there are three fundamental use cases: An Activity represents a single screen in…

developer.android.com

728x90
반응형