인텐트(intent)란??
이번시간은 인텐트에 대해서 알아보도록 하겠습니다.
안드로이드 앱을 개발하면서 액티비티를 띄우는 가정에서 인텐트라는 것을 만들고 그 인텐트의 파라미터로 액티비티 클래스를 전달하면 그 액티비티가 실행되는 것을 경험해보셨을 것입니다. 또한 인텐트 안에 웹페이지 주소나 전화번호 등을 URI 객체로 만들어 넣으면, 웹 브라우저나 전화걸기 화면이 띄워지는 것도 모두 인텐트가 그 중심에 있습니다.
또 안드로이드에서는 시스템을 구성하는 4개 콤포넌트가 있다고 말씀드렸습니다. Activity(화면구성), BroadCastReceiver(방송수신), Service(백단작업), ContentProvider(Data공유) 들이 바로 그 4대 콤포넌트들입니다. 이 4대 콤포넌트들은 서로가 목적에 맞게 존재하면서 유기적으로 정보전달을 합니다. 이 때 4대 콤포넌트끼리 유기적으로 정보전달을 가능케해주는 녀석이 바로 인텐트입니다.
위의 내용을 바탕으로 인텐트는 앱에서 무언가 작업을 수행하기 위해 사용하는 일종의 전달수단이라는 것을 추론할 수 있습니다.
또한 인텐트는 자신이 만든 앱안에서 활동하는 것 뿐만 아니라 내가 만들지 않은 타 애플리케이션의 기능을 수행할 수 있습니다.
즉 안드로이드 시스템은 내가 만든 인텐트의 정보를 처리하면서 내가 만든 액티비키나 애플리케이션의 구성요소가 해야할 일을 지정하는 것 이외에도 타 애플리케이션의 기능을 수행하는 등 훨씬 유연한 기능의 애플리케이션을 만들 수 있게 합니다.
이제 인텐트가 어떤 녀석인지 감이 잡혔을 것입니다.
그럼 인텐트를 구성하는 요소가 무엇인지 알아보도록 하겠습니다.
인텐트의 기본 구성요소로 액션(Action)과 데이터(Data)가 존재합니다.
액션은 수행할 기능이며, 데이터는 액션이 수행될 대상 데이터를 의미합니다.
예를들어
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(data));
액션은 ACTION_DIAL 전화다이얼을 걸어라라는 액션이며,
data값을 uri로 파싱한 Uri.parse(data)는 것은 액션이 수행할 data 즉 전화번호일 것입니다.
요약하면 Uri로 파싱한 전화번호 data를 대상으로 전화다이얼을 걸어라. 라는 뜻이 되고 이 뜻을 인텐트에 담아 안드로이드 시스템에게 전달하면 되는 것입니다.
인텐트가 무엇이고, 인텐트를 구성하는 요소를 알아보았습니다. 이런 인텐트는 2가지 종류가 존재합니다.
1. 명시적 인텐트
2. 암시적 인텐트
각 인텐트는 사용방법과 그 사용목적이 다르기 때문에 어떤경우에 명시적 인텐트를 써야하고 암시적 인텐트를 써야하는지 알아보겠습니다.
우선 명시적,암시적 인텐트를 각각 테스트해보기 위한 예제를 다음과 같이 준비해주시기 바랍니다.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
tools:context="com.example.limky.myintent.MainActivity">
<LinearLayout
android:orientation="horizontal"
android:layout_width="368dp"
android:layout_height="wrap_content"
tools:layout_editor_absoluteY="0dp"
tools:layout_editor_absoluteX="8dp">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="명시적 인텐트"
android:id="@+id/explicit_button"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="암시적 인텐트"
android:id="@+id/implicit_button"/>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
MainActivity
package com.example.limky.myintent;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.explicit_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "명시적 인텐트", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(getApplication(), Activity2.class);
intent.putExtra("Key","MainActiviy에서 명시적 인텐트 전달");
startActivity(intent);
}
});
findViewById(R.id.implicit_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "암시적 인텐트", Toast.LENGTH_SHORT).show();
//암시적 인텐트 목적에 맞는 호출 : 지도보기, 연락처보기, 인터넷, SNS 공유 등등.
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com/"));
startActivity(intent);
}
});
}
}
Activity2
package com.example.limky.myintent;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class Activity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_2);
TextView textview = (TextView) findViewById(R.id.textview);
Intent intet = getIntent();
textview.setText("전달받은 데이터 : "+intet.getStringExtra("Key"));
}
}
Activity2.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
tools:context="com.example.limky.myintent.Activity2">
<TextView
android:text="test"
android:textSize="30dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textview"/>
</android.support.constraint.ConstraintLayout>
인터넷을 사용하기 위해 매니패스트에 다음과 같은 권한 추가!!도 잊지마세요.
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
우선 명시적 인텐트를 알아봅시다.
1. 명시적 인텐트
명시적 인텐트는 인텐트에 클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상을 확실히 알 수 있는 경우에 사용합니다. 주로 애플리케이션 내부에서 사용합니다.
명시적 인텐르를 사용하는 이유론 특정 컴포넌트나 액티비티가 명확하게 실행되어야할 경우에 사용됩니다.
명시적 인텐트를 클릭하면, 코드에서 명시한 액티비티 Activity2가 실행되고 intent.putExtra 키-값 형태로 넘겨준 값을 Activity2가 getIntent()를 통해 전달받아 인텐트가 전달해준 값을 TextView에 출력를 합니다.
명시적 인텐트 결과화면
다음은 암시적 인텐트를 알아보겠습니다.
2. 암시적 인텐트
인텐트의 액션과 데이터를 지정하긴 했지만, 호출할 대상이 달라질 수 있는 경우에는 암시적 인텐트를 사용합니다.
즉 설치된 애플리케이션들에 대한 정보를 알고 있는 안드로이드 시스템이 인텐트를 이용해 요청한 정보를 처리할 수 있는 적절한 콤포넌트를 찾아본 다음 사용자에게 그 대상과 처리 결과를 보여주는 과정을 거치게 됩니다.
암시적 인텐트를 사용하는 대표적인 경우로 문서편집기를 예로 들 수 있습니다.
깨톡을 하다가 누군가 자신의 자소서를 좀 봐달라며 PDF를 첨부했습니다. 우리는 그 PDF를 클릭하여 열기를 하면 해당 안드로이드 폰에
PDF를 편집하거나 보여줄 수 있는 많은 애플리케이션이 내가 그 PDF파일을 보여줄 수 있다고 손듭니다. 그러면 안드로이드 시스템에서는
PDF를 열 수 있는 앱들이 이렇게 많은데 어떤거 선택할래? 라고 어플리케이션을 선택할 수 있는 위젯을 띄웁니다. 이런 일련의 과정을 가능케 하는 녀석이 암시적 인텐트 입니다. 이제 감이 확 오실거라 생각됩니다.
좀 더 생각해봅시다. 왜 굳이 암시적 인텐트를 써야할까요? PDF 파일을 열기위해 이미 많은 PDF 리더 앱들이 존재하는데 굳이 PDF 리더를 만드는 것은 현실적으로 좋은 방법이 아닙니다. 따라서 이미 기존에 어떤 기능들을 지원하는 앱들이 있는 경우에 암시적 인텐트를 사용해서 그 앱들을 사용하면 되는 것입니다.
자 그럼 암시적 인텐트가 무엇이고 어느 경우에 쓰면 효율적인지 알아보았습니다.
해당 예제에서 암시적 인텐트 이벤트를 누르면 구글 사이트로 인터넷브라우저가 열리게 인텐트에 정보를 심어놓았습니다.
결과를 보면 그냥 크롬이 알아서 제 명령대로 구글사이트를 들어갑니다.
안드로이드 스튜디오에 내장된 애뮬레이터를 돌렸기 때문입니다...ㅎㅎ
기본적으로 애뮬레이터에 인터넷 브라우져는 크롬밖에 없기 때문에 바로 크롬에서 구글사이트로 진입하는 모습을 볼 수 있습니다.
암시적 인텐트 결과화면
만약 인터넷익스플로어, 크롬, 사파리등 다양한 브라우저가 존재하는 폰에서 네이버 접속하기 정보를 암시적 인텐트에 심어놓고 실행하면 다음과 같이 어떤 앱에서 네이버에 접속할지 물어보는 위젯을 안드로이드 시스템이 띄울것입니다.
이상으로 인텐트가 무엇이고 인텐트를 왜 사용해야 하며, 인텐트 종류로는 어떤것이 있으며, 각 인텐트가 어떤 경우에 사용되어야 하는지 알아보았습니다.
다음시간에는 인텐트 액션들을 걸러주는 인텐트 필터와 암시적 인텐트에 대해서 부족한 점들을 좀 더 깊게 알아보도록 하겠습니다.
참고 Do it! 안드로이드 앱 프로그래밍 서적
참고 http://bitsoul.tistory.com/132
참고 http://arabiannight.tistory.com
'프로그래밍 > Android' 카테고리의 다른 글
[Android] 서비스(Service) 전반적인 개념 (3) | 2017.06.21 |
---|---|
[Android] Fragment 생명주기 (4) | 2017.06.18 |
[Android] 안드로이드 Activity 생명주기(Life Cycle) (0) | 2017.06.12 |
[Android] Android 4대 컴포넌트(Activity,Service,Broadcast Receiver,Content Provider) (0) | 2017.06.12 |
[Android] 비디오뷰 에러시 예외처리 (0) | 2017.06.02 |
댓글