티스토리 뷰

바로 이전 예제에서 Intent를 다른 액티비티를 띄우거나 기능을 동작시키기 위한 수단으로 사용했다. 

즉, 무언가 작업을 수행하기 위해 사용되는 일종의 명령 또는 데이터를 전달하는데 사용했다는 것이다. 

 

android.content 패키지 안에 정의되어 있는 Intent는 우리가 만들든 앱 구성 요소 간에 작업 수행을 위한 정보를 전달하는 역할을 한다. 

 

다른 앱 구성 요소에 Intent를 전달할 수 있는 대표적인 메서드들은 다음과 같으며, 이에 대하여는 후에 진도가 진행되면서 다룬다.

 

  • startActivity() or startActivityForResult()
  • startService() or bindService()
  • broadcastIntent()

 

startActivity() 는 액티비티를 화면에 띄울 때 사용되며, startService()는 서비스를 시작할 때 그리고 broadcastIntent() 는 Intent 객체를 브로드캐스팅 방식으로 전송할 때 사용된다.

 

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

 

Intent의 기본 구성 요소는 Action과 Data이다. Action은 수행할 기능이고, Data는 액션이 수행될 대상의 데이터를 의미한다.

 

Data는 그 형식에 따라 Intent 객체가 띄워주는 액티비티가 변경이 될 수 있는데, 이는 예제 코드를 다룰 때 설명하도록 하겠다.

 

Intent의 생성자는 다음과 같으며, 각 인자에 따라 그 쓰임새가 달라진다.

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

 

이 때, Intent에 클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상을 확실히 알 수 있는 경우에는 "명시적 인텐트"

그렇지 않고, 액션과 데이터를 지정하긴 했지만 호출할 대상이 달라질 수 있는 경우에는 "암시적 인텐트" 라고 한다.

 

암시적 인텐트는 Data의 MIME 타입에 따라 시스템에 서 적절한 다른 앱의 액티비티를 찾을 후 띄우는 방식이다.

 

암시적 인텐트는 Action과 Data로 구성되지만, 그 이외에도 여러 가지 속성을 가지고 있으며, 그 종류는 다음과 같다.

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

 

서론이 길었으니, 간단한 ACTION_VIEW 사용과 intent 객체에 Component를 셋팅하여 띄우는 예제를 확인해보자.


◎activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    <EditText
            android:layout_width="411dp"
            android:layout_height="66dp"
            android:text="tel:010-0000-0000"
            android:ems="10"
            android:textSize="24sp"
            android:id="@+id/editText"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="16dp"
            app:layout_constraintHorizontal_bias="0.0"/>
    <Button
            android:text="전화 걸기"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:id="@+id/button"
            app:layout_constraintTop_toBottomOf="@+id/editText" app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" app:layout_constraintHorizontal_bias="0.049"/>
    <Button
            android:text="메뉴 열기"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:id="@+id/button2"
            app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/button"
            app:layout_constraintHorizontal_bias="0.926" app:layout_constraintTop_toBottomOf="@+id/editText"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintVertical_bias="0.0"/>
</androidx.constraintlayout.widget.ConstraintLayout>

 

◎activity_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MenuActivity">
    <TextView
            android:text="메뉴입니다."
            android:layout_width="244dp"
            android:layout_height="101dp" android:id="@+id/textView"
            app:layout_constraintTop_toTopOf="parent"
            android:textSize="30sp"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

 

◎MainActivity.java

package com.example.myapplication;

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

public class MainActivity extends AppCompatActivity {

    EditText editText;

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

        editText = findViewById(R.id.editText);

        Button button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String data = editText.getText().toString();
				
                // EditText에 입력된 문자열 = tel:010-0000-0000을 intent객체로 넘기면
                // 전화 걸기 화면으로 넘어간다.
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(data));

                startActivity(intent);
            }
        });

        Button button2 = findViewById(R.id.button2);

        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
				
                // ComponentName("컴포넌트의 패키지", "컴포넌트의 패키지 + 컴포넌트 클래스 이름")
                ComponentName name = new ComponentName("com.example.myapplication", 
                	"com.example.myapplication.MenuActivity");

                intent.setComponent(name);

                startActivity(intent);
            }
        });
    }
}

 

Comments