2022-05-23 Intent_이해

2022. 5. 24. 00:02학부 강의/Android_Studio

Intent 이해

 

Intent

일전에 Intent에 대하여 짧게 알아본 글이 있었다.

 

2022-03-20 Android_Studio_3

 

2022-03-20 Android_Studio_3

Button, TextView, EditView, Margin & Padding, Toast 위에 나열한 요소들을 이해하자. 예제를 가지고서 접근해본다. 예제 1. 전화 버튼 사용자 인터페이스 작성(XML) : UI design by using XML Design Drag &..

ramen4598.tistory.com

 

그때 작성한 글을 살펴보면 …

 


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

 

인텐트 및 인텐트 필터  |  Android 개발자  |  Android Developers

An Intent is a messaging object you can use to request an action from another app component . Although intents facilitate communication between components in several ways, there are three fundamental use cases: An Activity represents a single screen in…

developer.android.com

 

Intent 기능

 

우리는 Intent를 통해서 크게 3가지 기능을 사용할 수 있다.

  • 액티비티 시작
  • 서비스 시작
  • 브로드캐스트 전달

내가 지금 당장 알아야 할 것은 Activity를 시작하는 방법이다.

 

Activity의 새 인스턴스를 시작하려면 IntentstartActivity()로 전달하면 됩니다.

 

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 동작 과정

 

  1. 명시적 인텐트의 경우 시스템이 해당 컴포넌트를 즉시 실행한다.
  2. 암시적 인텐트의 경우는 몇 가지 절차를 거쳐서 타깃 컴포넌트를 실행한다. 아래의 그림을 보자.



https://developer.android.com/images/components/intent-filters_2x.png?hl=ko

암시적 인텐트가 시스템을 통해 전달되어 다른 액티비티를 실행하는 과정이다.

 

  1. 액티비티 A가 요청할 작업에 대한 설명을 가진 Intent를 생성, startActivity()에 전달한다.
  2. Android 시스템이 모든 앱에서 해당 인텐트와 일치하는 인텐트 필터를 검색합니다.
  3. 일치하는 항목을 찾으면, 시스템이 해당 액티비티의 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"));

 

  •  카테고리
    • 인텐트를 수신해서 작업을 수행할 컴포넌트의 종류와 관련 있는 추가 정보를 담은 문자열.
    • 대부분은 카테고리가 필요 없다. (Action과 Data만으로 대부분 추론할 수 있는 듯)
    • 카테고리는 addCategory()로 지정할 수 있습니다.

 

이제부터 아래에 소개될 것들은 인텐트가 타깃 컴포넌트를 찾는 과정에 영향을 끼치지 않는 기타 정보들이다.

 

  •  엑스트라
    • 요청된 작업을 수행하는 데 필요한 추가 정보가 담긴 키-값 쌍입니다.
    • 다양한 putExtra() 메서드로 엑스트라 데이터를 추가할 수 있다.
    • 각 메서드는 키 이름과 값, 이렇게 두 개의 매개변수를 취한다.
    • 또는 모든 엑스트라 데이터를 포함한 Bundle 객체를 만든 다음 BundleIntentputExtras()로 삽입할 수도 있다.
    • 나름의 엑스트라 키를 선언해야 하는 경우(본인의 앱이 수신할 인텐트에 대하여), 앱의 패키지 이름을 접두어로 포함해야 합니다.
    • 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