본문 바로가기

어플리케이션 구성/인텐트(Intent)

인텐트(Intent) 입문- (1) 액티비티 호출

이번 강좌에서는 인텐트(Intent)를 이용하여 다른 액티비티를 불러오는 것에 대해 알아보도록 하겠습니다.

일단, 강좌를 따라오기 전에, 준비해야 할 것들은 다음과 같습니다.

- 새로운 프로젝트
- 두 개의 소스 코드 및 레이아웃 코드 (액티비티를 두 개 만들어야하니, 당연히 두 개 필요하겠죠??)

중요!!
프로젝트에 액티비티를 추가하는 방법은 이전 포스트(2009/03/01 - [안드로이드/안드로이드 입문] - [강좌] [수정] 이클립스에서 안드로이드 액티비티 추가하기 ) 에서 상세하게 다루고 있으니, 이 글에서는 따로 다루지 않겠습니다.

이번 강좌에서 예제로 만드는 어플리케이션의 구성은 다음과 같습니다.

* 첫 번째 액티비티에서 버튼을 누르면 두 번째 액티비티가 호출됨
* 두 번째 액티비티에서 종료 버튼을 누르면 두 번째 액티비티가 종료됨

우선, 첫 번째 액티비티의 레이아웃 코드와 소스 코드를 보겠습니다.

[레이아웃]
<
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
	android:orientation="vertical" 
	android:layout_width="fill_parent" 
	android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent" 
	android:layout_height="wrap_content" 
	android:text="첫 번째 액티비티 화면입니다."/>
<Button android:layout_width="fill_parent" 
	android:layout_height="wrap_content" 
	android:text="두 번째 액티비티 호출" 
	android:id="@+id/launchActivity"></Button>
</LinearLayout>


[소스]
package com.androidhuman;
import android.app.Activity;
import android.content.Intent; // 인텐트 사용 위해 import합니다.
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class Activity1 extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
                Button launch = (Button)findViewById(R.id.launchActivity);
        launch.setOnClickListener(new Button.OnClickListener(){
	public void onClick(View v) {
		// TODO Auto-generated method stub
		Intent intent = new Intent(Activity1.this, Activity2.class); // 두번째 액티비티를 실행하기 위한 인텐트
		startActivity(intent); // 두번째 액티비티를 실행합니다.
			} 
       	        });
    }
}


다른 것들은 대부분 앞에서 다루었던 것들이고, 생소한 것은 단연 인텐트(Intent)일 것입니다. 인텐트에 관한 것을 설명하자면 엄청 길어지지만, 항상 그래왔던 것처럼(!) 하나하나씩 다루어보도록 하겠습니다. (그래도 늦지 않는답니다!)

이번 예제에서 사용한 인텐트의 생성자는 "다른 액티비티를 호출할 때" 사용하는 생성자입니다. 참고로 인텐트를 사용하여 다른 네이티브 액티비티(전화번호 입력기, 주소록, 브라우저등..)도 호출할 수 있습니다. 하지만 일단 그런 것은 나중에 다루도록 하고, 이번 강좌에서는 사용자 액티비티를 호출하는 것에 대해 다루도록 하겠습니다.

그럼, 생성자의 원형을 분석해보도록 합시다.

public Intent(Context packageContext, Class<?>cls)

* packageContext : 
문서에는 어렵게 설명되어있지만, 한마디로 말하면 호출하는 액티비티를 뜻합니다. 여기에서는 Activity1 이 되겠습니다.
(Activity1.this)
*cls :
호출할 클래스를 뜻합니다. 여기에서는 Activity2 액티비티를 호출해야하므로, Activity2의 클래스인 Activity2.class를 입력합니다.


이렇게 인텐트 설정이 끝났으면, 인텐트를 실행해야겠지요? 사실, 인텐트 자체를 생성함으로써 인텐트가 실행되는 것이 아니라, 인텐트는 하나의 "실행하는 방법"만을 담고 있고, 실제로 그 일을 수행하는 것은 startActivity()메소드가 담당합니다. 인텐트를 실행하는 메소드도 이것 말고도 여러 가지가 있지만, 일단은 요거 하나만 다뤄보도록 하겠습니다.

public void startActivity(Intent intent)

파라미터로 받은 intent 인텐트를 실행합니다.


자, 그럼 첫 번째 액티비티에 대한 코딩은 끝났으니 두 번째 액티비티에 대한 소스와 레이아웃을 설계해보도록 하죠.

[레이아웃]

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:id="@+id/LinearLayout01">

<TextView android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="두번째 액티비티 화면입니다. 아래 버튼을 누르시면 액티비가 종료됩니다." 
android:id="@+id/Activity_2_text"></TextView>

<Button android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="액티비티 종료하기" 
android:id="@+id/terminateActivity"></Button>
</LinearLayout>

[소스]
package com.androidhuman;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class Activity2 extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
	    setContentView(R.layout.layout2);
	    Button terminate = (Button)findViewById(R.id.terminateActivity);
	    terminate.setOnClickListener(new Button.OnClickListener(){
		public void onClick(View v) {
		// TODO Auto-generated method stub
		finish(); // 액티비티를 종료합니다.
		}
	    		   
 		});		    

	}
}


두 번째 액티비티는 사실 더 별 거 없습니다. 버튼에 리스너 다는 건 이제 아무것도 아니고, 인텐트도 없구요. 대신에, 액티비티를 종료하는 메소드인 finish()메소드를 볼 수 있습니다. 사용자가 액티비티를 종료하고 싶을 땐, 이 finish()메소드를 사용하면 됩니다.

public void finish()

액티비티를 종료합니다.

여기까지 잘 따라오셨다면, 다음과 같은 화면을 보실 수 있을 것입니다.
첫 번째 액티비티에서 버튼을 누르면 두 번째 액티비티가 실행되고, 두 번째 액티비티의 버튼을 누르면 두 번째 액티비티는 종료됩니다.

이로서, 인텐트에 대한 첫번째 강좌를 마치도록 하겠습니다.
인텐트는 사실 이 강좌에서 다룬 것보다 훨씬 복잡한 기능을 가지고 있지만, 당장 어플리케이션을 만드는 데 우선순위가 높은 "사용자가 만든 액티비티를 호출"하는 방법에 대해 먼저 다루어보았습니다.

다음 시간에는 사용자가 만든 액티비티를 호출하지만, 조금 더 고급 기능을 사용하는 방법에 대해 다루도록 하겠습니다.

* 추가 - 3/7(토)
많은 분들이 잘 안된다고 하시는데... 아마도 위에 쓴 "액티비티 추가하기" 강좌를 보시지 않아서 그럴 것으로 생각합니다.

일단, 가장 중요한 것은 액티비티 추가 과정을 제데로 수행 하는 것입니다. 액티비티를 추가하는 과정에서 하나라도 빠지게 되면 당연히 오류가 생길 수 밖에 없습니다. 액티비티를 추가하는 방법은 2009/03/01 - [안드로이드/안드로이드 입문] - [강좌] [수정] 이클립스에서 안드로이드 액티비티 추가하기 를 참고하시고, 그래도 제데로 되지 않는 부분이 있다면 자세한 내용과 함께 질문 올려주세요~~