[Android/Kotlin] 액티비티 컴포넌트 - 인텐트

SoyoungLee·2022년 7월 25일
0

안드로이드/코틀린

목록 보기
37/68
post-thumbnail

💌 [안드로이드/코틀린] 액티비티 컴포넌트 - 인텐트

📌 인텐트란?

  • 안드로이드 앱은 4개의 컴포넌트로 개발하는데 이때 핵심 클래스가 Intent 이다.
  • " 컴포넌트를 실행하려고 시스템에 전달하는 메시지 "
  • 액티비티 클래스 하나당 AndroidManifest 에 등록해야 함.
    액티비티 뿐만 아니라 서비스, 브로드캐스트 리시버, 콘텐츠 프로바이더도 등록해야 함.
    -> Why ? 시스템에 컴포넌트를 알려야 하기 때문
<activity
            android:name=".menu.login.LoginActivity"
            android:exported="false" />
<activity
            android:name=".menu.map.NaverMapActivity"
            android:exported="false" />
            

📌 인텐트 엑스트라 데이터

  • 인텐트에 컴포넌트 실행을 요청할 때 데이터를 함께 전달하려면 Extra data를 이용한다.

🤍 엑스트라 데이터 추가

val intent = Intent(this, MainActivity::class.java)
intent.putExtra("data1", "hello")
intent.putExtra("data2", "10")
startActivity(intent)
                
// 타입별 함수 여러개 제공
putStringExtra(), getIntExtra(), getDoubleExtra() 사용

🤍 엑스트라 데이터 가져오기

val intent = intent
val data1 = intent.getStringExtra("data1")
val data2 = intent.getIntExtra("data2")

📌 액티비티 화면 되돌리기

  • startActivity() : 액티비티 화면을 되돌릴 필요가 없을 때.
  • startActivityForResult() : 결과를 포함해 화면을 되돌릴 때.
    -> 지금은 deprecated 되어 registerForActivityResult() 로 대체 되었다.

📌 인텐트 필터

  • 인텐트를 시스템에 전달할 때 컴포넌트 정보 설정 두가지가 있다.
    1) 명시적 인텐트 : 클래스 타입의 래퍼런스 정보 활용
    2) 암시적 인텐트 : 인텐트 필터 정보를 활용
// 명시적 인텐트
val intent = Intent(this, MainActivity::class.java)

AndroidManifest.xml
// 자동으로 만들어지는 메인 액티비티 (스플래시 화면)
<activity
	android:name=".menu.login.SplashActivity"
	android:exported="true"
	android:theme="@style/Theme.AppCompat.Light.NoActionBar.FullScreen">
		<intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity>
  • 액티비티 등록 시 name 속성만 지정하면 명시적 인텐트로만 실행 가능. (앱 내부에서만 사용할거면)
  • 외부에서도 인텐트로 실행하려면 < intent-filter > 를 설정해줘야 함.

💜 인텐트 하위필터

  • < action > : 컴포넌트의 기능
    ex ) android.intent.action.VIEW - 데이터를 보여주는 기능
    android.intent.action.MAIN - 앱의 진입 점
    android.intent.action.EDIT - 데이터 편집
  • < category > : 컴포넌트가 포함되는 범주
    ex ) android.intent.category.LAUNCHER - 런처가 실행하는 컴포넌트
    android.intent.category.BROWSABLE - 브라우저가 실행하는 컴포넌트
  • < data > : 컴포넌트에 필요한 데이터 정보
    android:scheme, android:host, android:port, android:mimeType 등 속성 이용
    ex ) android:scheme="http" - URL 프로토콜에 맞춰 액티비티 시작
// 외부앱과 연동하는 인텐트 필터 설정 (메인 액티비티 외)
<activity
	android:name=".EditActivity">
		<intent-filter>
                <action android:name="ACTION_EDIT" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="http"/>
        </intent-filter>
</activity>

// 인텐트 프로퍼티 이용 - (1)
val intent = intent()
intent.action = "ACTION_EDIT"
intent.data = Uri.parse("http://www.naver.com")
startActivity(intent)

// 인텐트 프로퍼티 이용 - (2)
val intent = intent("ACTION_EDIT", Uri.parse("http://www.naver.com"))
startActivity(intent)

// mimeType 설정
<activity
	android:name=".EditActivity">
		<intent-filter>
                <action android:name="ACTION_EDIT" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="image/*"/>
        </intent-filter>
</activity>

// 실행하는 인텐트에도 타입 정보 설정
val intent = intent("ACTION_EDIT")
intent.type = "image/*"
startActivity(intent)

📌 액티비티 인텐트 동작 방식

  • 암시적 인텐트는 실행할 액티비티가 없거나 여러 개일 수 있다.

💜 실행할 액티비티가 없을 때

val intent = intent()
intent.action = "ACTION_HELLO"
try {
	startActivity(intent)
} catch (e: Exception) {
	Toast.makeText(this,"No!", Toast.LENGTH_SHORT).show()
}

💜 여러 개일 때

// 사용자에게 어느 앱 실행할건지 띄움
val intent = intent(Intent.ACTION_VIEW, Uri.parse("geo:37.567271, 126.8252269"))
startActivity(intent)

// 앱 지정하기 
val intent = intent(Intent.ACTION_VIEW, Uri.parse("geo:37.567271, 126.8252269"))
intent.setPackage("com.google.android.apps.maps")
startActivity(intent)

참고 : https://developer.android.com/guide/components/intents-filters?hl=ko

profile
Android Developer..+ iOS 슬쩍 🌱 ✏️끄적끄적,,개인 기록용 👩🏻‍💻

0개의 댓글