티스토리 뷰



이 자료들은 팁스소프트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하면 더 편리하게 볼수 있습니다.
* 알짜배기 프로그램 받기 - http://www.tipssoft.com/bulletin/tb.php/QnA/8406
* 안드로이드 강좌 목록 - http://www.tipssoft.com/bulletin/tb.php/old_bbs/501
보통 여러가지 기능을 제공하는 안드로이드용 어플리케이션은 기능에 따른 여러개의 사용자 화면이
필요하게 됩니다. 이 때 표현되는 사용자 화면은 액티비티로 구성되기때문에 현재 출력되는 사용자
화면에서 다른 사용자 화면으로 전환하려면 현재 액티비티에서 새로운 액티비티를 실행하여 전환할
수 있습니다.
이번 강좌에서는 인텐트를 이용하여 어플리케이션 내에 존재하는 여러개의 액티비티를 전환하는 방법과
전환할 때 데이터를 주고 받는 방법에 대해서 알아보도록 하겠습니다. 만약 액티비티에 대한 기초 지식이
없다면 아래에 링크된 자료를 먼저 읽어 보시길 바랍니다.
액티비티(Activity)의 이해 - http://www.tipssoft.com/bulletin/tb.php/FAQ/944
1. 추가할 액티비티 클래스 파일과 리소스 파일 생성하기
보통 command-line 으로 "android create project ..." 명령어를 사용하여 프로젝트를 생성하면
프로젝트 내에는 하나의 액티비티 클래스 파일과 리소스 파일이 존재합니다. 이 파일들이 존재하는
경로에 새로 추가할 액티비티의 클래스 파일과 리소스 파일을 추가적으로 생성해줍니다.
예를 들어 액티비티명이 SecondActivity 인 경우 SecondActivity.java 클래스 파일과 임의의 리소스
파일( 예 : sub.xml ) 을 다음과 같은 경로에 생성하시면 됩니다.
클래스 파일 : 프로젝트폴더경로\src\com\example\ChangePage\SecondActivity.java
리소스 파일 : 프로젝트폴더경로\res\layout\sub.xml
추가된 액티비티는 기존의 액티비티를 정의하던 방식과 동일하게 코드를 구성해주면 됩니다.
sub.xml 에는 자신이 원하는 액티비티의 레이아웃을 xml 코드로 구성하고, SecondActivity.java
파일에는 액티비티를 어떻게 실행시킬 것인지 구성해주시면 됩니다.
2. 추가할 액티비티 등록하기
먼저 어플리케이션 내에 존재하는 액티비티는 manifest 파일에 등록되어야 합니다.
만약 ChangePageActivity 가 main 액티비티이고 SecondActivity 를 추가하는 경우라면 아래와
같이 XML 코드를 구성할 수 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="
http://schemas.android.com/apk/res/android"
package="com.example.ChangePage"
android:versionCode="1"
android:versionName="1.0">
<application android:label="@string/app_name" android:icon="@drawable/icon">
<activity android:name="ChangePageActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="SecondActivity">
</activity>
</application>
</manifest>
만약 위의 코드처럼 manifest 파일에 사용할 액티비티를 명시하지 않고 해당 액티비티를 실행시키면
어플리케이션이 알 수 없는 이유로 멈춰졌다는 오류 메세지와 함께 프로그램이 강제종료 됩니다.
3. 출력용 액티비티 단순하게 전환하기
사용자 화면을 전환하려면 어떤 액티비티에서 다른 액티비티를 실행시켜야 하는데 이 때, 아래 예제의
onClick 메소드에서 보이는 것처럼 Intent 를 이용하면 쉽게 실행시킬 수 있습니다.
아래의 코드는 버튼을 클릭하여 액티비티를 실행시키는 호출자 액티비티의 클래스 파일 내용입니다.
package com.example.ChangePage;
import android.app.Activity;
import android.os.Bundle;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.view.View;
import android.content.Intent;
public class ChangePageActivity extends Activity implements OnClickListener
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// main.xml 파일에 정의된 레이아웃을 액티비티의 출력 형태로 지정
setContentView(R.layout.main);
// id_btn 이라는 아이디의 버튼을 얻어온다.
Button button = (Button) findViewById(R.id.id_btn);
// 버튼을 클릭리스너에 등록한다.
button.setOnClickListener(this);
}
// 버튼이 클릭되면 호출되는 콜백메소드
public void onClick(View view)
{
// SecondActivity 를 실행시킬 것을 명시한 인텐트를 생성한다.
Intent act = new Intent(this, SecondActivity.class);
// 인텐트 정보를 이용하여 액티비티를 실행시킨다.
startActivity(act);
}
}
위의 onClick 콜백메소드처럼 코드를 구성하면 버튼을 클릭했을 때 SecondActivity 가 실행됩니다.
SecondActivity 클래스 파일에는 별도의 코드를 추가할 필요가 없으며 "back" 키를 누르거나 별도의
종료 루틴을 수행하면 실행됐던 SecondActivity 가 종료되면서 기존의 ChangePageActivity 가 다시
수행됩니다.
4. 전달값과 반환값이 있는 액티비티 전환하기
추가적인 액티비티를 실행시킬 때 인텐트를 생성하여 해당 액티비티의 정보를 인텐트에 저장하는데
이 때 putExtra 메소드를 이용하여 액티비티에 대한 정보 외에 정수, 실수, 문자열 등 여러가지 정보를
인텐트에 저장할 수 있습니다. 새로 실행된 액티비티는 자신을 실행한 액티비티에서 생성한 인텐트를
getIntent 메소드를 이용하여 얻어올 수 있으며, 해당 인텐트에 저장된 정보들은 getStringExtra,
getIntExtra, getDoubleExtra 등 각 데이터 타입에 맞는 메소드를 이용하여 다시 가져올 수 있습니다.
main 액티비티 부분...
// SecondActivity 를 실행시킬 것을 명시한 인텐트를 생성한다.
Intent act = new Intent(this, SecondActivity.class);
// 인텐트에 NO 이라는 이름으로 정수 데이터를 저장시킨다.
act.putExtra("NO", 123);
// 인텐트에 PW 라는 이름으로 문자열 데이터를 저장시킨다.
act.putExtra("PW", "tipssoft");
// 액티비티를 실행시킨다. startActivity 메소드가 아닌 이 메소드를 사용하면 반환값을 받을 수 있다.
startActivityForResult(act, 1);
새로 실행된 액티비티 ( SecondActivity ) 부분...
// main 액티비티에서 생성했던 인텐트를 얻는다.
Intent intent = getIntent();
// NO 라는 이름의 정수 데이터를 가져온다.
int no = intent.getIntExtra("NO", 123);
// PW 라는 이름의 문자열 데이터를 가져온다.
String pw = intent.getStringExtra("PW");
// ... 넘어온 정보를 이용하여 부가적인 작업을 한다.
이와 동일한 맥락으로 액티비티의 반환값을 얻을 때에는 새로 실행된 액티비티의 종료 시점에
인텐트를 생성하여 main 액티비티에 반환할 정보를 putExtra 메소드로 저장합니다.
그리고 새 액티비티가 종료되어 main 액티비티가 다시 실행되면 시스템에 의해 onActivityResult
콜백메소드가 호출되고, 해당 메소드의 세번째 인자인 Intent 에 종료한 액티비티가 생성했던
인텐트가 들어오게 됩니다.
새로 실행된 액티비티 ( SecondActivity ) 부분...
// 인텐트를 생성한다.
Intent intent = new Intent();
// 인텐트에 AGE 라는 이름으로 정수 데이터를 저장시킨다.
intent.putExtra("AGE", 25);
// 인텐트에 ADDRESS 라는 이름으로 문자열 데이터를 저장시킨다.
intent.putExtra("ADDRESS", "SEOUL");
// 정상적인 결과 값을 반환하는 경우 RESULT_OK 를 첫번째 인자에 명시하고,
// 두번째 인자에 인텐트를 명시한다.
setResult(RESULT_OK, intent);
// 액티비티를 종료시킨다.
finish();
main 액티비티 부분...
// startActivityForResult 메소드에 의해 새로 실행된 액티비티가 종료될 때 호출되는 콜백메소드
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
// 결과 값이 있고, 액티비티를 시작할 때 1로 설정해둔 결과값인 경우
if(resultCode == RESULT_OK && requestCode == 1) {
// AGE 라는 이름의 정수 데이터를 가져온다.
int age = data.getIntExtra("AGE", 0);
// ADDRESS 라는 이름의 문자열 데이터를 가져온다.
String address = data.getStringExtra("ADDRESS");
// ... 넘어온 정보를 이용하여 부가적인 작업을 한다.

}
}
5. 첨부된 예제에 대하여...
이 강좌에 첨부된 프로젝트는 세개의 액티비티를 가진 어플리케이션을 구성한 것입니다.
첫번째 액티비티에서 두번째 액티비티로 넘어갈 때에는 3. 에서 설명한 것처럼 데이터의 이동없이
단순히 액티비티를 출력하고, 두번째 액티비티에서 세번째 액티비티로 넘어갈 때에는 데이터를
넘겨줍니다. 또한 세번째 액티비티가 종료되면 두번째 액티비티에 반환값을 출력하도록 하였습니다.
① 첫번째 액티비티가 두번째 액티비티를 실행시킨다. 아무 데이터도 전달하지 않는다.
② 두번째 액티비티가 세번째 액티비티를 실행시킨다. 실행시킬 때 정수 데이터와 문자열 데이터를
전달하여 세번째 액티비티에 있는 중앙의 텍스트뷰에 출력시킨다. (NO, PW)
③ 세번째 액티비티를 종료 한다. 두번째 액티비티로 복귀하면서 정수 데이터와 문자열 데이터를
반환값으로 전달한다. 전달된 값은 두번째 액티비티 중앙의 텍스트뷰에 출력된다.
④ 두번째 액티비티를 종료 한다. 두번째 액티비티는 종료할 때 어떤 값도 반환하지 않는다.


댓글