[안드로이드] 인텐트(Intent)

|

개념

인텐트란 컴포넌트를 실행하기 위해 시스템에 넘겨주는 정보라고 할 수 있는데 그 이유는 애초에 자바로 클래스의 객체를 생성해서 호출할 수 없기 때문이다. 컴포넌트와 일반 클래스는 결합이 발생하지 않기 때문에 명시적인 호출이 불가하고 인텐트로만 호출할 수가 있다. 컴포넌트를 실행할 때 매개시켜주는 것이 바로 시스템이며 이 시스템이 사용하는 컴포넌트가 바로 인텐트인 것. 또한 인텐트를 사용하면 같은 앱 뿐만 아니라 외부 앱의 컴포넌트 또한 활용할 수 있다.


종류

명시적 인텐트

명시적 인텐트는 실행하고자 하는 컴포넌트의 클래스명을 인텐트에 담아서 실행하는 방법이다.

Intent intent = new Intent(this, DetailActivity.class);
startActivity(intent);

startActivity 가 액티비티를 실행하기 위해 시스템에 의뢰하는 것이다.

암시적 인텐트

암시적 인텐트는 컴포넌트의 클래스명이 아니라 Intent Filter 정보를 활용하는 것을 말한다. Intent Filter란 AndroidManifest.xml 파일에 등록된 컴포넌트 정보로서 아래와 같이 구성된다.

<activity android:name=".DetailActivity">
	<intent-filter>
		<action android:name="com.example.ACTION_VIEW"/>
		<category android:name="android.intent.category.DEFAULT"/>
	</intent-filter>
</activity>

Intent Filter에는 3가지 종류가 있다.

  • action: 컴포넌트가 어떤 능력을 갖추고 있는지 나타내는 문자열
    • android.intent.action.VIEW
  • category: 컴포넌트가 어느 범주에 속한건지를 나타냄
    • android.intent.category.LAUNCHER
  • data: 컴포넌트를 실행하기 위해 필요한 데이터에 대한 상세정보 명시
    • android:scheme, android:host

이러한 Intent Filter 정보를 활용하면 다음과 같이 액티비티를 실행할 수 있다.

Intent intent = new Intent();
intent.setAction("com.some.ACTION_VIEW");
startActivity(intent);

action에 대한 정보를 주어 실행한 것인데 category를 주지 않는 이유는 자동으로 android.intent.category.DEFAULT를 추가하기 때문이다. 기본 category 값 말고도 사용자 정의 문자열로 category값을 설정할 수 있으며 뭘 사용하든 상관없다. data는 잘 안쓰기 때문에 스킵!


기능

Extra 데이터

컴포넌트를 실행하면서 데이터를 넘겨야 할 때가 있을 때 putExtra()를 사용할 수 있다.

Intent intent = new Intent(this, DetailActivity.class);
intent.putExtra("data","good");
startActivity(intent);

위 코드처럼 key와 value 포맷으로 넘겨주면 되고 받을 땐 getStringExtra("data")와 같이 그에 맞는 메소드를 사용해서 받을 수 있다.

결과 되돌리기

카톡에서 사진을 전송할 때처럼 뒤로가기를 누르지 않아도 자동으로 이전 액티비티 화면으로 되돌리고 싶을 때가 있다. 이때 사용하는 것이 startActivityForResult() 메소드이다.

Intent intent = new Intent(this, DetailActivity.class);
startActivityForResult(intent,10);

위와 같이 실행하는데 여기서 두번째 매개변수인 10은 requestCode 값으로 0이상의 숫자를 지정하여 결과를 받았을 때 어느 요청인지를 판단하기 위한 변수이다.

이제 실행한 컴포넌트의 처리 동작을 보자.

Intent intent = getIntent();
intent.putExtra("location", textView.getText().toString());
setResult(RESULT_OK,intent);
finish();

finish()로 인해 액티비티가 종료되고 이전 화면으로 돌아가게되면 onActivityResult() 메소드가 호출되며 requestCode와 resultCode를 통해 해당 결과를 처리하게 된다. setResult의 첫번째 매개변수의 RESULT_OK가 정상으로 처리된 것을 명시하는 상수값이다.


출처

  • 깡샘의 안드로이드 프로그래밍 14장: 인텐트와 구글 기본 앱 연동