인텐트 (Intent)
- Intent는 메시징 객체로 다른 앱이나 액티비티로 작업을 요청하는데 사용할 수 있다.
- 사용 방법은 크게 세 가지로 나눌 수 있다.
- 액티비티 시작
새로운 액티비티를 시작할 때
Intent
에 시작할 액티비티 정보를 담고startActivity(...)
함수로 실행할 수 있다.1 2
val intent = Intent(this, SecondActivity::class.java) startActivity(intent)
액티비티에서 결과를 받기 위해서는
registerForActivityResult
함수를 이용해 결과를 받을 수 있다.기존에는
startActivityForResult
와onActivityResult
함수를 이용해 결과를 받을 수 있었으나 현재는 메모리 관련 문제로 인해Deprecated
되어 사용되지 않는다.
- 서비스 시작
- 사용자 인터페이스 없이 백그라운드에서 작업을 수행하는 구성 요소로서
API 21 이상
부터는JobScheduler
로 서비스를 시작할 수 있지만 그 이하 버전에서는Service
클래스의 메서드를 사용해 시작할 수 있다. - 파일 다운로드와 같은 1회성 작업은
startService
에 작업을 수행할Intent
객체를 전달하면 되고, 지속적으로 접근해 무엇인가를 처리해야 하거나 여러 액티비티에서 접근해야할 때는bindService
에Intent
를 전달해주면 된다.
- 사용자 인터페이스 없이 백그라운드에서 작업을 수행하는 구성 요소로서
- 브로드캐스트 전달
- 시스템과 앱 또는 앱과 앱 간에 이벤트를 주고받을 수 있다.
- 앱이 브로드캐스트를 받기 위해서는
Receiver
를 등록해주어야하며 앱이 브로드캐스트를 보내기 위해서는sendBroadcast
를 이용해 보낼 수 있다.
- 액티비티 시작
인텐트 유형
명시적 인텐트
- 대상 앱의 패키지 이름이나 클래스의 이름을 인자로 제공한다.
- 시작하려고 하는 액티비티나 서비스의 클래스 이름을 알고있기 때문에 일반적으로 앱 안에서 구성 요소를 시작할 때 쓰인다.
아래 예시는 앱 안에
DownloadService
라는 서비스 클래스를 구축했다고 가정한다.1 2 3 4 5 6
// 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)
암시적 인텐트
- 수행할 작업을 다른 앱의 구성 요소가 처리할 수 있도록 한다.
- 안드로이드 시스템에서 다른 앱들의
매니페스트 파일
에 선언된인텐트 필터
와 비교해서 작업을 처리할 수 있는 적절한 구성 요소를 표현해준다. 예를들어, 사진첩에서 사진을 선택해 배경화면으로 설정하도록 하는 것을 의미한다.
암시적 인텐트를 처리할 앱이 없을 수 있으므로
resolveActivity
함수를 이용해 수신할 앱이 없을 경우 null을 반환한다는 것을 이용해 처리한다.1 2 3 4 5 6 7 8 9 10 11
// 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) }
- 위 예시는 보내기 전용 및 전달할 데이터의 타입과 메시지의
Intent
를 선언하고resolveActivity
를 이용해 이 인텐트를 처리할 앱이 있는지 확인한 후 있다면 해당 앱에 인텐트를 전송한다는 뜻이 된다.
인텐트 필터
- 앱의 매니페스트 파일에 들어가 있는 것으로 해당 구성 요소가 수신하고자 하는 인텐트의 유형을 나타낸다.
- 단, 보안문제 때문에 API 21 부터는 개발자가 암시적 인텐트로
bindService
를 호출하면 예외를 발생시킨다. 매니페스트 파일에 있는
<intent-filter>
태그를 이용하며 내부에는<action>
,<data>
,<category>
태그 중 하나 이상을 사용해 인텐트 유형을 지정할 수 있다.1 2 3 4 5 6 7
<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>
- 위 예시는 데이터 유형이 텍스트이고
ACTION_SEND
인텐트를 수신할 인텐트 필터가 있는 액티비티 선언이다.
[출처]
- https://developer.android.com/guide/components/intents-filters?hl=ko
Comments powered by Disqus.