Android

[Android] 안드로이드 정리 (7) - 인텐트(Intent)

728x90

출처 : Do it! 안드로이드 앱 프로그래밍 / 정재곤

 

 

인텐트(Intent)란?

 android.content 패키지 안에 정의되어 있는 인텐트는 앱 구성 요소 간에 작업 수행을 위한 정보를 전달하는 역할을 한다. 다른 앱 구성 요소에 인텐트를 전달할 수 있는 대표적인 메소드는 다음과 같다.

  • startActivity() 또는 startActivityForResult() : 액티비티를 화면에 띄울 때 사용한다.
  • startService() 또는 bindService() : 서비스를 시작할 때 사용한다.
  • broadcastIntent() : 인텐트 객체를 브로드캐스팅 방식으로 전송할 때 사용한다.

 이 메소드들을 호출할 때 인텐트가 파라미터로 전달되며 이렇게 전달된 파라미터는 앱 구성요소인 액티비티, 서비스, 브로드캐스트 수신자로 전달될 수 있다.

 

 

인텐트의 기본 구성 요소

인텐트의 기본 구성 요소는 액션(Action)과 데이터(Data)이다. 액션은 수행할 기능이고 데이터는 액션이 수행될 대상의 데이터다. 대표적인 액션으로는 ACTION_VIEW, ACTION_EDIT 등이 있다. 

 인텐트에 포함되어 있는 데이터는 그 포맷이 어떤 것인가를 시스템이 확인한 후 적절한 액티비티를 자동으로 찾아 띄워주기도 한다. 만약 http처럼 특정 포맷을 사용하면 그 포맷은 등록된 MIME 타입으로 구분한다. 

 

 

인텐트의 생성자

 인텐트 객체는 액션과 데이터를 인수로 하여 만들 수도 있지만 다른 인텐트나 클래스 객체를 인수로 하여 만들기도 한다.

Intent()
Intent(Intent o)
Intent(String action, [,Uri uri])
Intent(Context packageContext, Class<?> cls)
Intent(String action, Uri uri, Context packageContext, Class<?> cls)

 인텐트에 클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상을 확실히 알 수 있는 경우엔 명시적 인텐트(Explicit Intent)라고 하며, 액션과 데이터를 지정하긴 했지만 호출할 대상이 달라질 수 있는 경우엔 암시적 인텐트(Inplicit Intent)라고 부른다.  암시적 인텐트는 MIME 타입에 따라 시스템에서 적절한 다른 앱의 액티비티를 찾은 후 띄우는 방식을 사용한다.

 암시적 인텐트는 액션과 데이터로 구성되지만 그 외에도 여러 가지 속성을 가지고 있다. 

  • 범주(Category) : 액션이 실행되는 데 필요한 추가적인 정보를 제공한다.
  • 타입(Type) : 인텐트에 들어가는 데이터의 MIME 타입을 명시적으로 지정한다.
  • 컴포넌트(Component) : 인텐트에 사용될 컴포넌트 클래스 이름을 명시적으로 지정한다.
  • 부가 데이터(Extra Data) : 인텐트는 추가적인 정보를 넣을 수 있도록 번들 객체를 담고 있는데, 이 객체를 통해 인텐트 안에 더 많은 정보를 넣어 다른 앱 구성 요소에 전달할 수 있다.

 

 

인텐트 예제

 인텐트에 액션과 데이터를 넣어 다른 앱의 액티비티를 띄우는 경우와 컴포넌트 이름을 이용해 새로운 액티비티를 띄우는 경우를 확인해보자.

> 전화걸기 예제

MainActivity

package com.example.project00_java;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        editText = findViewById(R.id.editText);

        Button button = findViewById(R.id.button4);
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){
                String data = editText.getText().toString();

                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(data));
                startActivity(intent);
            }
        });
    }
}

activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="tel:010-1234-5678" />

    <Button
        android:id="@+id/button4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button" />
</LinearLayout>

 

 

> 다른 액티비티로 전환 예제

MenuActivity를 우선 새로 만들어준다.

MainActivity

package com.example.project00_java;

import android.content.ComponentName;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        editText = findViewById(R.id.editText);

        Button button2 = findViewById(R.id.button5);
        button2.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){
                Intent intent = new Intent();
                ComponentName name = new ComponentName("com.example.project00_java", // 패키지명
                        "com.example.project00_java.MenuActivity"); // 새로 띄울 액티비티 경
                intent.setComponent(name); // 인텐트 객체에 컴포넌트 지정
                startActivityForResult(intent, 101);
            }
        });
    }
}

activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="tel:010-1234-5678" />

    <Button
        android:id="@+id/button4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button" />

    <Button
        android:id="@+id/button5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="메뉴화면 띄우기" />
</LinearLayout>
728x90