이번 글에서는 인텐트의 유형에 따라 사용하는 방법들을 다루어 보겠습니다.
- 명시적 인텐트를 사용하여 특정 Activity로 이동하는 방법
- 암시적 인텐트를 사용하여 다른 앱의 콘텐츠로 이동하는 방법
Intent 소개
Intent는 메시징 객체로, 앱 간 통신이나 컴포넌트 간 상호 작용을 위해 사용되는 객체입니다.
주로 Activity, Service, Broadcast Receiver, Content Provider의 컴포넌트 간에 데이터를 전달하거나 작업을 실행하는데 사용됩니다.
두 가지 유형으로 나뉩니다.
- Explicit(명시적) Intent : 매우 구체적이며 실행할 Activity를 정확하게 알 수 있고 자체 앱의 화면인 경우
- Implicit(암시적) Intent : 좀 더 추상적이며 다른 앱이 관련된 작업을 실행하는 데 사용하고 시스템이 최종 결과를 결정하는 경우
Explicit(명시적) Intent 사용하여 특정 Activity로 이동하는 방법
첫 번째 화면(FirstActivity)에서 두 번째 화면(SecondActivity)으로 이동하는 예시를 들어보겠습니다.
앱이 실행해야 할 Activity를 정확히 알고 있으므로 명시적 인텐트를 사용합니다.
1. Intent
를 만들어 컨텍스트와 대상 활동의 클래스 이름을 전달합니다.
val intent = Intent(this, SecondActivity::class.java)
표시하려는 Activity의 이름은 SecondActivity::class.java
로 지정됩니다. 실제 SecondActivity
객체는 백그라운드에서 만들어집니다.
2. putExtra
메서드를 호출하여 '문자'를 첫 번째 인수로 전달하고 텍스트를 두 번째 인수로 전달합니다.
intent.putExtra("message", "From First Activity")
extra는 나중에 검색할 수 있도록 이름이 지정된 숫자나 문자열과 같은 데이터로 함수를 호출할 때 인수를 전달하는 것과 비슷합니다.
3. startActivity()
메서드를 호출하여 intent
를 전달합니다.
startActivity(intent)
4. 그 다음 SecondActivity
의 onCreate
메서드에서 intent
에서 전달된 message
를 가져옵니다.
val message = intent?.extras?.getString("message").toString()
여기에서 intent
는SecondActivity
의 속성이라기보다는 모든 Activity의 속성입니다.
Activity를 실행하는 데 사용된 인텐트 참조를 유지합니다.
extras 속성은 Bundle
유형이고 인텐트에 전달된 모든 extras에 액세스하는 방법을 제공합니다.
Implicit(암시적) Intent 사용하여 다른 앱의 콘텐츠로 이동하는 방법
이번 예시는 Google 검색에서 제공하는 사전 기능을 사용하여 기기의 브라우저를 실행 후 검색 페이지를 표시합니다.
사용자가 어떤 종류의 브라우저 앱을 설치했는지 확실히 알 수는 없고 사용자가 단어를 어떤 방식으로 찾으려고 하는지도 추측할 수 없습니다.
이때 암시적 인텐트를 사용하면 가장 좋습니다. 앱이 작업 유형에 관한 정보를 시스템에 제공하면 시스템은 이 작업으로 실행할 일을 파악하여 필요에 따라 사용자에게 추가 정보를 요청합니다.
1. 검색어의 URI
를 만듭니다. parse()
를 호출하여 String
에서 URI
를 만들 때 문자열 형식을 사용하여 queryUrl를 생성합니다.
val word = "about"
val queryUrl: Uri = Uri.parse("https://www.google.com/search?q=${word}")
URI는 Uniform Resource Identifier를 나타냅니다. URL 또는 Uniform Resource Locator는 웹페이지를 가리키는 문자열입니다. URI는 형식에 관한 좀 더 일반적인 용어입니다. 모든 URL은 URI이지만 모든 URI가 URL인 것은 아닙니다. 예를 들어 전화번호의 주소 등 다른 URI는 tel:
로 시작하지만 이는 URL이 아닌 URN 또는 Uniform Resource Name으로 간주됩니다. 두 가지를 모두 나타내는 데 사용되는 데이터 유형을 URI
라고 합니다.
2. queryUrl
를 정의한 후 새 intent
객체를 초기화합니다.
val intent = Intent(Intent.ACTION_VIEW, queryUrl)
명시적 인텐트 생성 시 컨텍스트와 Acvity 전달과 다르게 URI
와 함께 Intent.ACTION_VIEW
를 전달합니다.
ACTION_VIEW
는 URI(이 경우 웹 주소)를 사용하는 일반적인 인텐트입니다. 그러면 시스템은 사용자의 웹브라우저에서 URI를 열어 이 인텐트를 처리할 수 있습니다. 다른 인텐트 유형은 다음과 같습니다.
CATEGORY_APP_MAPS
- 지도 앱을 실행합니다.CATEGORY_APP_EMAIL
- 이메일 앱을 실행합니다.CATEGORY_APP_GALLERY
- 갤러리(사진) 앱을 실행합니다.ACTION_SET_ALARM
- 백그라운드에서 알람을 설정합니다.ACTION_DIAL
- 전화를 겁니다.
3. 마지막으로 startActivity()
를 호출하고 intent
를 전달하여 시스템에 다른 앱을 실행하라고 지시합니다.
startActivity(intent)
참조
https://developer.android.com/guide/components/intents-filters
https://developer.android.com/codelabs/basic-android-kotlin-training-activities-intents#0
'Android' 카테고리의 다른 글
[Android] 다른 앱 사용기록 조회 (0) | 2022.05.08 |
---|---|
[Android] LiveData (0) | 2022.03.09 |
[Android] Logger 라이브러리 확장하여 로그 파일로 저장하기 (0) | 2022.02.27 |
[Android] 깔끔한 Log를 사용하여 생산성 향상하기 (0) | 2022.02.26 |
[Android] RecyclerView를 사용해야 하는 이유 (feat. ListView) (0) | 2022.02.20 |