출처 : 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>
'Android' 카테고리의 다른 글
[Android] 안드로이드 정리 (9) - 액티비티의 생명주기 (0) | 2020.03.12 |
---|---|
[Android] 안드로이드 정리 (8) - 플래그와 부가 데이터 사용하기 (0) | 2020.03.12 |
[Android] 안드로이드 정리 (6) - 여러 화면 만들고 화면 간 전환하기 (0) | 2020.03.12 |
[Android] 안드로이드 정리 (5) - 레이아웃 인플레이션 이해하기 (0) | 2020.03.12 |
[Android] 안드로이드 정리 (4) - 토스트, 스낵바, 대화상자, 프로그레스바 (0) | 2020.03.12 |