2022. 5. 24. 00:02ㆍ학부 강의/Android_Studio
Intent 이해
Intent
일전에 Intent에 대하여 짧게 알아본 글이 있었다.
그때 작성한 글을 살펴보면 …
2022-03-20 Android_Studio_3 중 일부
애플리케이션은 컴포넌트로 이루어진다.
- 액티비티(activity): 사용자의 인터페이스 화면을 가지는 하나의 작업을 표시하는 컴포넌트. 액티비티들이 모여 애플리케이션이 된다.
- 서비스(service): 백그라운드에서 실행되는 컴포넌트. 오랫동안 실행되거나 원격 프로세스를 위한 작업
- 방송 수신자(broadcast reciver): 방송을 받고 반응하는 컴포넌트
- 컨텐트 제공자(content provider): 데이터를 관리하고 다른 애플리케이션에게 제공하는 컴포넌트
안드로이드 스튜디오에서는 다른 앱의 컴포넌트를 사용할 수 있다.
An `Intent` is a messaging object you can use to request an action from another app component.
Intent는 다른 앱의 액션을 요청하기 위해서 사용할 수 있는 메세징 객체다.
이때 앱의 의도(intent)를 적어서 안드로이드에게 전달하면 안드로이드가 가장 적절한 컴포넌트를 찾아서 활성화한다.
보충
출처 : https://developer.android.com/guide/components/intents-filters?hl=ko
Intent 기능
우리는 Intent
를 통해서 크게 3가지 기능을 사용할 수 있다.
- 액티비티 시작
- 서비스 시작
- 브로드캐스트 전달
내가 지금 당장 알아야 할 것은 Activity
를 시작하는 방법이다.
Activity
의 새 인스턴스를 시작하려면 Intent
를 startActivity()
로 전달하면 됩니다.
Intent
는 시작할 액티비티를 설명하고 모든 필수 데이터를 담습니다.
Intent 유형
인텐트에는 명시적 인텐트와 암시적 인텐트 두 가지 유형이 있습니다.
명시적 인텐트 (Explicit intents)
명시적 인텐트는 인텐트를 충족하는 애플리케이션이 무엇인지 명확하게 지정합니다.
이를 위해 대상 앱의 패키지 이름 또는 컴포넌트의 클래스 이름과 주소가 필요합니다.
명시적 인텐트는 일반적으로 앱 안에서 구성 요소를 시작할 때 자주 쓴다.
시작하고자 하는 액티비티 또는 서비스의 클래스 이름을 알고 있기 때문.
암시적 인텐트 (Implicit intents)
암시적 인텐트는 특정 구성 요소의 이름을 대지 않는다.
그 대신 수행할 일반적인 작업을 선언하여 다른 앱의 구성 요소가 이를 처리할 수 있도록 해줍니다.
일전에 22년 3월 20일에 작성한 아래의 코드가 여기에 속하겠다.
public void onClicked(View v){
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("tel:010-1234-5678"));
startActivity(intent);
}
Intent 동작 과정
- 명시적 인텐트의 경우 시스템이 해당 컴포넌트를 즉시 실행한다.
- 암시적 인텐트의 경우는 몇 가지 절차를 거쳐서 타깃 컴포넌트를 실행한다. 아래의 그림을 보자.
암시적 인텐트가 시스템을 통해 전달되어 다른 액티비티를 실행하는 과정이다.
액티비티 A
가 요청할 작업에 대한 설명을 가진Intent
를 생성,startActivity()
에 전달한다.- Android 시스템이 모든 앱에서 해당 인텐트와 일치하는 인텐트 필터를 검색합니다.
- 일치하는 항목을 찾으면, 시스템이 해당 액티비티의
onCreate()
메서드를 호출하여 이를Intent
에 전달하고, 일치하는액티비티(*액티비티 B*)
를 시작합니다.
인텐트 필터
앱의 매니페스트 파일에 위치한다.
어떤 컴포넌트가 수신할 수 있는 인텐트의 유형을 지정한다.
인텐트 필터가 지정되어있다면 외부에 다른 앱에서 해당 컴포넌트를 실행할 수 있다.
반대로 지정되어있지 않다면 오직 명시적인 인텐트로만 실행할 수 있다.
매니페스트 파일에 인텐트 필터를 작성하는 방법은 다음에 알아보도록 하자.
인텐트 빌드
Intent
객체가 필요로 하는 정보는 아래와 같다.
- (명시적 인텐트의 경우) 정확한 컴포넌트 위치와 이름 (Component name)
- 선택사항
- 이것이 없으면 해당 인텐트는 암시적 인텐트로 간주한다.
- 누가 해당 인텐트를 수신할지는 인텐트 포함된 다른 정보를 바탕으로 시스템이 결정.
- 수신 컴포넌트를 설정하려면
setComponent()
,setClass()
,setClassName()
을 사용하거나 또는Intent
생성자를 사용한다.
- 수행할 작업 (Action)
- 수행할 일반적인 작업을 나타내는 문자열.
- 나머지 인텐트 구조를 결정한다. (데이터, 엑스트라에 포함될 정보)
- 인텐트에 대한 작업을 지정하려면
setAction()
또는Intent
생성자를 사용 - 많이 사용하는 일반적인 작업을 정의한 상수를 사용하거나 직접 지정할 수 있다.(나름의 작업을 직접 정의하는 경우, 앱의 패키지 이름을 접두어로 포함시켜야 함)
static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
- 데이터 (Data)
- 작업에 사용할 데이터 또는 해당 데이터의 MIME 유형을 참조하는 URI(
Uri
객체)입니다. - 인텐트의 작업(Action)이 데이터의 유형을 결정한다.
- 데이터 URI만 설정하려면
[setData()](https://developer.android.com/reference/android/content/Intent?hl=ko#setData(android.net.Uri))
를 호출 - MIME 유형만 설정하려면
[setType()](https://developer.android.com/reference/android/content/Intent?hl=ko#setType(java.lang.String))
을 호출 - 두 가지를 모두 명시적으로 설정할 경우,
[setDataAndType()](https://developer.android.com/reference/android/content/Intent?hl=ko#setDataAndType(android.net.Uri,%20java.lang.String))
을 사용 Intent
생성자를 사용하는 경우도 있던데??Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("tel:010-1234-5678"));
- 작업에 사용할 데이터 또는 해당 데이터의 MIME 유형을 참조하는 URI(
- 카테고리
- 인텐트를 수신해서 작업을 수행할 컴포넌트의 종류와 관련 있는 추가 정보를 담은 문자열.
- 대부분은 카테고리가 필요 없다. (Action과 Data만으로 대부분 추론할 수 있는 듯)
- 카테고리는
addCategory()
로 지정할 수 있습니다.
이제부터 아래에 소개될 것들은 인텐트가 타깃 컴포넌트를 찾는 과정에 영향을 끼치지 않는 기타 정보들이다.
- 엑스트라
- 요청된 작업을 수행하는 데 필요한 추가 정보가 담긴 키-값 쌍입니다.
- 다양한
putExtra()
메서드로 엑스트라 데이터를 추가할 수 있다. - 각 메서드는 키 이름과 값, 이렇게 두 개의 매개변수를 취한다.
- 또는 모든 엑스트라 데이터를 포함한
Bundle
객체를 만든 다음Bundle
을Intent
에putExtras()
로 삽입할 수도 있다. - 나름의 엑스트라 키를 선언해야 하는 경우(본인의 앱이 수신할 인텐트에 대하여), 앱의 패키지 이름을 접두어로 포함해야 합니다.
static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";
- 플래그
- 인텐트에 대한 메타데이터와 같은 기능을 합니다.
- 이런 플래그는 Android 시스템에 액티비티를 시작할 방법에 대한 지침을 줄 수도 있고(예를 들어 액티비티가 어느 작업에 소속되어야 하는지 등)
- 액티비티를 시작한 다음에 어떻게 처리해야 하는지도 알려줄 수 있습니다(예를 들어 해당 액티비티가 최근 액티비티 목록에 소속되는지 여부).
이거 약산 패킷이랑 비슷한데?
'학부 강의 > Android_Studio' 카테고리의 다른 글
2022-06-23 팀프로젝트_1 (보호) (0) | 2022.06.23 |
---|---|
2022-06-16 자바_기초 (0) | 2022.06.16 |
2022-05-17 project_github_upload (0) | 2022.05.17 |
2022-05-16 Android_Studio_7 (0) | 2022.05.16 |
2022-05-15 자바_입출력_스트림 (0) | 2022.05.15 |