반응형

안드로이드 어플리케이션을 구성하는 네 가지 기본 요소에는 ActivityServiceBroadcast ReceiverContent Provider가 있다.  인텐트(Intent)란 이러한 어플리케이션 구성요소(컴포넌트) 간에 작업 수행을 위한 정보를 전달하는 역할을 한다.  인텐트를 가장 손쉽게 사용한 예로는 액티비티간의 화면전환을 들 수 있다.  즉 인텐트는 컴포넌트A가 컴포넌트B를 호출할 때 필요한 정보를 담고 있으며, 이 정보에는 호출되는 컴포넌트B의 이름이 명시적으로 표시되기도 하고, 속성들이 암시적으로 표시되기도 한다.  또한 호출된 컴포넌트B가 호출한 컴포넌트A로 어떠한 결과를 전달할 때도 인텐트가 사용된다. 어떠한 컴포넌트를 호출하냐에 따라 사용되는 대표적인 메소드로는 다음과 같은 것들이 있다.

  • startActivity() -새로운 액티비티를 화면에 띄울 때
  • startService(), bindService() – 서비스와 관련
  • broadcastIntent() – 브로드캐스팅을 수행할 때

인텐트는 명시적 인텐트(Explicit Intent)와 암시적 인텐트(Implicit Intent)로 구분할 수 있는데 인텐트에 클래스 객체나 컴포넌트 이름을 지정하여 호출될 대상을 확실히 알 수 있는 경우에는 명시적 인텐트, 호출될 대상의 속성들을 지정했지만 호출될 대상이 달라질 수 있는 경우에는 암시적 인텐트라고 한다.

  1. 명시적 인텐트

다음은 MainActivity에서 button을 눌렀을 때 SecondActivity로 화면전환하는 코드이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*MainActivity*/
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
 
 
public class MainActivity extends Activity implements View.OnClickListener{
Button button;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 button = (Button)findViewById(R.id.button);
 button.setOnClickListener(this);
 }
 
 @Override
 public void onClick(View v) {
 Intent intent = new Intent(getApplicationContext(),SecondActivity.class);
 startActivity(intent);
 }
}

위 코드에서 살펴 볼 코드는 다음과 같다.

1
2
Intent intent = new Intent(getApplicationContext(),SecondActivity.class);
startActivity(intent);

새로운 인텐트 객체를 생성하면서 getApplicationContext()와 SecondActivity.class를 파라마터로 넘긴다. getApplicationContext()는 현재 액티비티 정보가 담겨있는 것이라고 생각하면 될 듯 하다. SecondActivity는 호출할 컴포넌트이다. 그리고 startActivity()에 인텐트 객체인 intent를 파라미터로 넘겨주면 새로운 화면인 SecondActivity가 실행된다. startActivity()는 새로 띄우는 액티비티로부터 받는 응답을 처리할 필요가 없을 때 간단하게 사용된다. 이에 반해 startActivityForResult()의 경우 새로 띄운 액티비티로 받는 응답을 처리할 경우에 사용된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*MainActivity*/
Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
startActivityForResult(intent,REQUEST_CODE);
 
...
 
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode==REQUEST_CODE){
        if(resultCode==RESULT_OK){
            String key = intent.getExtras().getString("key");
            Toast.makeText(getApplicationContext(),key,Toast.LENGTH_LONG).show();
        }
    }
}

startActivityForResult()는 인텐트 객체인 intent뿐만 아니라 정수형태의 코드 값을 파라미터로 전달하는데, 새로 띄웠던 여러 액티비티 중에 어떤 것으로부터 온 응답인지 구분하기위해 사용된다. 이 코드 값은 임의로 선언할 수 있지만 어플리케이션에 들어갈 액티비티가 여러 개 있을 수 있으므로 서로 중복되지 않는 값으로 설정해야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*SecondActivity*/
...
public class SecondActivity extends View.OnClickListener{
Button button;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    button = (Button)findViewById(R.id.button);
    button.setOnClickListener(this);
  }
@Override
public void onClick(View v){
    Intent result = new Intent();
    result.putExtra("key",value);
    setResult(RESULT_OK,result);
    finish();
  }
}

새로 띄워진 SecondActivity에서 result라는 인텐트 객체를 생성하고, putExtra()를 통해 부가 데이터를 넣고 있다. putExtra() 메소드를 이용할 때는 key와 value 값을 함께 넣어줘야 나중에 value값을 확인하고자 할 경우 key값을 가지고 데이터를 가지고 올 수 있다. 그리고 setResult()메소드를 통해 MainActivity로 응답을 보내고 있다. 그러면 MainActivity에서는 onActivityResult()함수로 그 응답을 처리하는 역할을 한다.

2. 암시적 인텐트

1
2
3
4
5
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://m.naver.com"));
startActivity(intent);
....
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("tel:010-0000-0000"));
startActivity(intent);

위와 같이 암시적 인텐트는 보통 액션(Action)과 데이터(data)라는 속성으로 구성되어있다. 이 두가지 속성말고도 Category, Type, Component, Extras 라는 속성을 가진다. Component라는 속성을 지정할 경우 컴포넌트 클래스 이름을 명시적으로 지정하게 되는데 이 경우가 명시적 인텐트에 속하게 된다. 결국 암시적 인텐트는 Component 속성을 제외한 나머지 속성들로 구성되며, 이러한 속성들에 부합하는 컴포넌트가 실행된다.(호출할 대상들이 달라질 수 있음)

1
2
3
4
5
...
public void onClick(View v){
  Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://m.naver.com"));
  startActivity(intent);
}

위 코드를 실행했을 때의 화면이다.
intent
이와 같이 암시적 인텐트는 그 속성에 부합하는 컴포넌트가 여러개 있을 때 선택할 수 있도록 해준다.

3. 인텐트 필터

안드로이드 어플리케이션을 만들 때 메니페스트라는 파일이 있고, 파일 내용을 보면 Intent-filter라는 것이 있다.  예를 들어 컴포넌트 A가 컴포넌트 B로 인텐트를 보냈다고 하자. 명시적 인텐트라면 컴포넌트B는 바로 인텐트를 받았겠지만 암시적 인텐트라면 컴포넌트B는 이 인텐트가 자신의 속성과 부합하는지 확인을 해야할 것이다. 이러한 확인작업을 위해 Intent-filter라는 것이 존재한다. 인텐트 필터도 암시적 인텐트의 속성처럼 Action, data, category 필터라는 것을 가지고 있다. 이 필터들을 가지고 암시적 인텐트의 속성과 비교를 하게된다.

반응형
,