인텐트(Intent)
Intent란 메시징 객체로, 앱 구성요소로부터 작업을 요청하는 데 사용할 수 있다.
크게 3가지의 사용 사례로 나눌 수 있다.
- 액티비티 시작 - Activity는 앱 안의 단일 화면을 나타낸다. Activity의 새 인스턴스를 시작하려면 Intent를 startActivity()로 전달하면 된다. Intent는 시작할 액티비티를 설명하고 모든 필수 데이터를 담는다.
- 서비스 시작 - Service를 시작하여 작업을 수행하려면 Intent를 startService에 전달하고, 바인딩하려면 Intent를 bindService()에 전달하면 된다.
- 브로드캐스트 전달 - 브로드캐스트는 모든 앱이 수신할 수 있는 메시지이다. Intent를 sendBroadcast() 또는 sendOrderBroadcast()에 전달하면 다른 앱에 브로드캐스트를 전달할 수 있다.
인텐트 유형
1. 명시적 인텐트 : 인텐트를 충족하는 애플리케이션이 무엇인지 지정한다. 일반적으로 앱 안에서 구성 요소를 시작할 때 쓴다. (새로운 액티비티를 생성하거나 서비스를 시작하는 경우가 해당됨)
2. 암시적 인텐트 : 특정 구성 요소의 이름을 대지 않지만, 그 대신 수행할 일반적인 작업을 선언하여 다른 앱의 구성 요소가 이를 처리할 수 있도록 해준다. 암시적 인텐트를 사용하면 Android 시스템에서 시작할 적절한 구성 요소를 찾습니다. 이때 인텐트의 내용을 기기에 있는 다른 여러 앱의 매니페스트 파일에서 선언된 인텐트 필터와 비교하고 일치하는 인텐트 필터가 있으면 해당 구성 요소를 시작하고 Intent 객체를 전달한다. 호환되는 인텐트 필터가 여러 개일 경우 대화 상자를 표시하여 선택할 수 있게 한다.
인텐트 빌드
Intent객체에는 Android 시스템이 어느 구성 요소를 시작할지 판별하는 데 사용하는 정보가 담겨 있다. Intent에 포함된 기본 사항들은 다음과 같다.
- 구성 요소 이름 : 시작할 구성 요소의 이름으로 선택 항목이지만, 인텐트를 명시적인 것으로 만들어주는 중요한 정보이다. 구성 요소 이름이 없으면 해당 인텐트는 암시적이다. Service를 시작하는 경우에는 항상 구성 요소 이름을 지정해야 한다.
- 작업 : 수행할 일반적인 작업을 나타내는 문자열이다.
- 데이터 : 작업을 수행할 데이터 및 해당 데이터의 유형을 참조하는 URI 객체이다.
- 카테고리 : 인텐트를 처리해야 하는 구성 요소의 종류에 관한 추가 정보를 담은 문자열이다.
- 엑스트라 : 요청된 작업을 수행하는 데 필요한 추가 정보가 담긴 key-value 형태이다.
명시적 인텐트 예시
명시적 인텐트는 주로 액티비티를 생성할 때 사용한다. 아래 코드는 액티비티를 생성하고 엑스트라를 사용해서 간단한 문자열 값을 보내고 받는 코드입니다. SubActivity에서는 값을 확인할 수 있습니다.
btnMove.setOnClickListener {
val intent = Intent(this, SubActivity::class.java)
intent.putExtra("data","인텐트 전달")
startActivity(intent)
}
val str = intent.getStringExtra("data")
Log.d("test!!", str.toString())
암시적 인텐트 예시
암시적 인텐트는 작업을 지정하여 기기에서 해당 작업을 수행할 수 있는 모든 앱을 호출합니다. 아래 사진은 무언가를 공유하고 싶을 때 ACTION_SEND 작업이 있는 인텐트를 생성하고 해당 인텐트로 startActivity()를 호출하여 어느 앱을 통해 콘텐츠를 공유할지 선택하는 코드와 앱 화면입니다.
주의 : 사용자에게 startActivity()로 전송한 암시적 인텐트를 처리할 앱이 없는 경우도 있을 것이다. 이런 경우 호출은 실패하고 앱은 다운된다. 어느 액티비티든 인텐트를 수신하도록 하려면 resolveActivity()를 호출한다. 결과가 null이 아닌 경우에는 최소 하나의 앱은 존재한다는 말이니까 startActivity()를 호출해도 안전하다. 하지만 null인 경우 해당 인텐트는 사용해서는 안 되고 해당 인텐트를 발생시키는 기능은 비활성화해야 한다.
btnMove.setOnClickListener {
val sendIntent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, "message")
type = "text/plain"
}
if (sendIntent.resolveActivity(packageManager) != null) {
startActivity(sendIntent)
}
}
PendingIntent (펜딩 인텐트)
Notification 푸시 알림 기능을 작성하면서 pendingIntent라는 것을 보았고, Intent와 차이점이 무엇인지에 대해서 궁금증이 생겨 찾아보았다. 우선 pendingIntent란 기본적으로 Intent를 가지고 있는 클래스이고, Intent를 특정 시점에 수행하도록 하는 특징을 가지고 있다. 여기서 특정 시점은 주로 앱이 실행되고 있지 않을 때를 뜻한다. 내 경우에는 onMessageReceived()로 message를 받고 notification을 생성하게 되는데 앱이 켜져 있지 않은 상태에서도 notification 푸시가 되어야 하니까 pendingIntent를 써야 된다라고 이해했다.
'안드로이드' 카테고리의 다른 글
WebView Bridge (0) | 2024.03.27 |
---|---|
AAC ViewModel (0) | 2022.05.27 |
Android Studio 단축키 (0) | 2021.12.23 |
[안드로이드] Looper, Handler (0) | 2021.01.20 |
[안드로이드] ANR(Application Not Responding) (0) | 2021.01.19 |