검색결과 리스트
activity에 해당되는 글 1건
- 2010.02.25 Activity 간의 통신 121
대부분의 안드로이드 어플리케이션은 두개 이상의 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 소스 다운로드 받기 (40) | 2010.03.18 |
---|---|
goldfish 커널 다운로드 및 컴파일 하기 (818) | 2010.03.16 |
android 커널부팅부터 액티비티까지 (21) | 2010.03.12 |
AlertDialog 와 Toast (45) | 2010.03.01 |
SharedPreferences (1016) | 2010.03.01 |
RECENT COMMENT