대부분의 안드로이드 어플리케이션은 두개 이상의 Activity로 이루어진다. 각 Activity 들은 서로 Intent 를 통해서 통신을 하게된다.

이번 포스트에서는 Activity 간에 통신하는 방법을 예제와 함께 알아보자.

 

먼저 가장 메인 화면 레이아웃은 아래와 같이 구성한다.

 

main.xml 파일은 아래와 같다.

<?xml version="1.0" encoding="utf-8"?>
<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_height="wrap_content"
        android:id="@+id/textView"
        android:textSize="10pt" android:text="display"
        android:layout_width="wrap_content"
        android:layout_gravity="center"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:id="@+id/openBtn"
        android:text="open"/>
</LinearLayout>

 

새로운 Activity 를 위해서 아래와 같은 레이아웃을 하나 더 추가한다.

 

파일명은 form.xml 로 하고 내용은 아래와 같다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:orientation="vertical">
    <EditText
        android:layout_height="wrap_content"
        android:id="@+id/editText"
        android:layout_width="fill_parent"
        android:hint="enter text"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="OK" android:id="@+id/okBtn"/>
</LinearLayout>

 

위 레이아웃을 보면 어느 정도 눈치 채겠지만 프로그램에 대해서 설명하자면 두 번째 레이아웃에 텍스트를 입력하고

OK 버튼을 누르면 첫 번째 레이아웃에 표시되는 것이다.

먼저 main.xml 과 연결되어 있는 MainActivity 를 만들도록 하자.

package net.cranix.android.activitytest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button openBtn = (Button)findViewById(R.id.openBtn);
        openBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this,FormActivity.class);
                startActivityForResult(i, 0);

            }
        });
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            if (requestCode == 0) {
                TextView textView = (TextView)findViewById(R.id.textView);
                textView.setText(data.getExtras().getString("text"));

            }
        }
    }
}

위 소스에서 굵게 표시한 부분이 중요한 부분이다.

먼저 첫번째 부분은 Intent 를 이용하여 다른 Activity 를 호출하는 코드이다. 여기서 Intent는 안드로이드내 의 모든 Activity 간의 통신을 담당하는 구조체다. Intent 는 위와 같이 new Intent([호출한Activity],[호출당한Activity]) 형태로 만든다.

startActivityForResult 함수는 인텐트와 함께 resultCode 를 다른 Activity 로 보내는 역할을 한다 여기서 resultCode 가 어떤 역할을 하는지는 계속 읽다보면 이해 할 수 있을것이다.

 

 

다음으로 form.xml 과 연결될 Activity 를 만들어 보자.

 

아래와 같이 AndroidManifest.xml 파일을 열어 Application 탭의 Add 버튼을 누른다.

 

다음에 나오는 대화상자에서 Activity 를 클릭하면 아래와 같이 오른쪽에 Activity 설정 대화상자가 나온다.

거기서 아래와 같이 오른쪽에 있는 name 을 클릭하자

 

그럼 아래와 같이 클래스 추가하는 대화상자가 나오는데 Name 에다가 FormActivity 을 넣고 클래스를 생성한다.

 

 

소스는 아래와 같다.

package net.cranix.android.activitytest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class FormActivity extends Activity {
    private EditText editText;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.form);

        editText = (EditText)findViewById(R.id.editText);
        Button okBtn = (Button)findViewById(R.id.okBtn);
        okBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = getIntent();
                i.putExtra("text", editText.getText().toString());
                setResult(RESULT_OK, i);
                finish();

            }
        });
    }
}

 

이번 소스에도 중요한 부분은 볼드체로 되어있다.

현재 Activity 가 떠 있다는 소리는 어떤 Intent 에 의해서 호출되어진 것을 의미한다.

getIntent() 함수는 호출한 Intent 를 돌려주는 함수이다.

Intent 에다가는 데이터를 저장할 수 있는 이렇게 데이터가 저장된 intent 를 다른 Activity 로 보냄 으로서 통신이 이루어 지는 것이다.

데이터를 저장하는 방법은 위와 같이 intent 의 putExtra([key],[value]) 함수를 사용하면 된다.

setResult 함수는 호출한 Activity 에 전달해줄 intent 를 저장하는 함수로서 resultCode 와 같이 사용한다.

마지막으로 finish() 함수가 호출되면 setResult 함수에 의해 저장되어있던 resultCode 와 intent 가 이전의 Activity 에 전달되면서 현재의 Activity 는 닫히게 된다.

이러한 방식은 html 의 form 전달 방식을 보는듯 하다.

 

그럼 완성된 어플리케이션 화면을 보도록 하자.

 

 

사실 이 어플리케이션에서 Intent 를 쓰지 않고도 같은 기능을 하도록 만들 수 있다. 그럼에도 구지 Intent 를 쓰는 이유는 다른 어플들과의 통신을 쉽게 하기 위해서 이다.

안드로이드 내의 모든 어플들은 Activity 단위로 되어있으며 이 모든Activity 는 AndroidManifest 파일에서 허용만 해주면 다른 Activity 가 끌어다 쓸 수 있게 되어있다.

이러다 보니 수많은 사람들이 만든 Activity 들간의 통신방법이 존재 할 수 있기 때문에 이러한 통신 방법을 통일할 필요가 있었던 것이다.

 

 

신고

'알짜정보 > Android' 카테고리의 다른 글

android 소스 다운로드 받기  (40) 2010.03.18
goldfish 커널 다운로드 및 컴파일 하기  (818) 2010.03.16
android 커널부팅부터 액티비티까지  (21) 2010.03.12
AlertDialog 와 Toast  (45) 2010.03.01
SharedPreferences  (1017) 2010.03.01
Activity 간의 통신  (121) 2010.02.25
by cranix 2010.02.25 23:47
| 1 |