안드로이드 앱은 Activity
, Service
, Broadcast Receiver
, Content Provider
네가지 구성요소(컴포넌트)가 있고 Intent는 이러한 구성요소간 정보전달 역할을 수행하는 메세징 객체이다
💡 암시적 인텐트에서 다른 앱을 찾는 과정
1. 인텐트를 실행
2. Manifest 파일 검사: 시스템은 디바이스에 설치된 다른 앱의 AndroidManifest.xml 파일을 검사, 파일에는 앱이 지원하는 intent-filter가 정의되어 있다.
3. 일치하는 인텐트 필터 찾기
4. 일치하는 액티비티 실행: 시스템이 일치하는 인텐트 필터를 찾으면 해당 액티비티의onCreate
메서드를 호출하고, 인텐트를 이 액티비티에 전달한다. 해당 앱의 액티비티가 실행되며, 앱은 해당 인텐트에 따라 동작을 수행
// 1.Intent 인스턴스 생성
// Intent(Context, 구체적 Component 명시)
// Intent의 인스턴스 생성
private val serviceIntent: Intent = Intent(this, MyService::class.java)
// 2.전달할 데이터 담기
serviceIntent.putExtra("KEY", "DATA");
// 3.service 호출
reactContext.startService(serviceIntent)
class MyService : Service() {
...
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
if (intent != null) {
// 4. intent에서 데이터 추출
val data = intent.getStringExtra("KEY");
}
...
}
...
}
fun dialPhoneNumber(phoneNumber: String) {
// intent에는 ACTION_DIAL이라는 작업을 수행할 요소를 넘긴다.
// ACTION_DIAL을 하기위해서 AndroidManifest에 permiison도 선언되어있어야함
val intent = Intent(Intent.ACTION_DIAL).apply {
data = Uri.parse("tel:$phoneNumber")
}
// resolveActivity()를 활용해 주어진 Intent를 이 디바이스에서 체크한다
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
}
}
PendingIntent는 Intent를 바로 실행하는게 아니라 나중에 실행되도록 Intent를 예약하는 개념이다.
나중에 실행되도록 예약된 Intent는 앱의 활성 상태와 무관하게 특정 시간, 또는 특정 이벤트를 조건으로 실행 될 수 있다.
대표적으로
Push알림, 위젯, AlarmManger에서 주로 사용된다.
PendingIntent는 호출하려는 컴포넌트에 따라 다른 생성마 메서드를 호출한다.
getActivity() : Activity를 시작하는 경우
getService() : Service를 시작하는 경우
getBroadcast() :BroadcastReceiver를 시작하는 경우
val intent = Intent(this, MainActivity::class.java)
// PendingIntent.getActivty()로 인스턴스 생성
val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_MUTABLE)
val notification = NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Title")
.setContentText("Text")
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(pendingIntent) // PendingIntent를 설정 (푸시알림을 누르면 해당 Activity가 켜진다.)
.build()
https://developer.android.com/guide/components/intents-filters?hl=ko
https://www.crocus.co.kr/1521
https://developer.android.com/topic/security/risks/pending-intent?hl=ko
https://www.charlezz.com/?p=861