안드로이드 개발 Tutorial : Activity 전환

분류 Specialist/Android Tutorial 작성일 2010/01/27 00:06

지난 번 글에서 두 개의 Layout을 만들어 놓고 텍스트 박스에 이름을 입력하고 OK버튼을 누르면 이름과 함께 환영메시지가 나오는 간단한 애플리케이션을 만들면서 화면전환을 구현해보았다.

헌데, 이 방법에는 한 가지 문제가 있는데 것은 ‘돌아가기’ 버튼을 활용할 수 없다는 것이다. 환영 메시지가 나온 화면에서 ‘돌아가기’ 버튼을 눌러보면 텍스트박스 입력 화면이 나올 것이라는 예상과 달리 다른 화면이 표시되는 것을 확인 할 수 있었다.
이와 같이 되는 이유는 안드로이드의 ‘돌아가기’ 구현 방식에 있다.
안드로이드는 Activity가 호출 될 Stack 구조에 쌓아놓게 된다. 그렇기 때문에 ‘돌아가기’ 버튼을 누르면 이전에 호출되었던 Activity가 다시 호출 될 수 있는 것이다. Activity Stack에 대한 그림으로 설명하자면 아래와 같다.


지난 번 만들었던 애플리케이션은 하나의 Activity를 가지고 그 안에서 버튼이 누르면 레이아웃을 다시 구성하는 방법으로 구현을 하였기 때문에 Activity Stack에는 하나의 Activity만 쌓이게 된다. 그렇기 때문에 ‘돌아가기’ 버튼이 예상과 달리 움직이게 된 것이다.
이번 글에서는  ‘돌아가기’ 버튼을 활용할 있도록 지난 번과 같은 애플리케이션을 두 개의 Activity를 가진 구조로 구현해 보겠다.

  1. 지난 번 작성한 HelloWorldExt 프로젝트를 연다. 소스는 아래에 링크시키겠다.
  2. 현재 HelloWorldExt 프로젝트의 구조이다. 만들었던 두 개의 Layout XML이 보인다.
  3. 이제 Activity를 만들어보자. 프로젝트 생성시에 HelloWorldExt라는 Activity를 만들었으므로 하나의 Activity만 더 만들면 된다.

    일단 Activity클래스를 상속하는 클래스 파일을 추가해보자. 아래 화면과 같이 com.bbare.studies.helloworldext 패키지를 선택 후 오른쪽 마우스 버튼을 클릭하여 New->Class 를 선택한다.

    선택 후 나오는 New Java Class 창이 뜰 것이다. Name 항목에 DisplayWelcomeMsg 라고 입력한다.
    만드는 Activity는 Activity 클래스를 상속하여야 하기 때문에 Superclass 항목의 Browser를 눌러 아래와 같이 부모 클래스를 선택하고 OK버튼을 누른다.
    New Java Class 창에서 Finish버튼을 눌러 Class 파일 생성한다.
    생성한 Class 파일의 내용을 아래 코드와 같이 수정한다.
    package com.bbare.studies.helloworldext;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.widget.TextView;
    
    
    public class DisplayWelcomeMsg extends Activity {
            
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.secondview);
        }
    }
    

    이제 AndroidManifest.xml 파일을 수정해보자. xml파일의 수정 방법에는 두 가지 방법이 있는데 하나는 xml형식으로 하드 코딩하는 방법이고 두 번째 방법은 ADT에서 제공하는 eclipse로 녹아든 툴을 이용하는 방법이다. 사람마다 차이가 있겠지만 작업속도는 xml 하드코딩 하는 방법이 훨씬 빠른 것 같다.
    아래와 같이 AndroidManifest.xml 을 수정해 준다.
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.bbare.studies.helloworldext"
          android:versionCode="1"
          android:versionName="1.0">
        <application android:icon="@drawable/icon" android:label="@string/app_name">
    		<activity android:name=".HelloWorldExt" 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="DisplayWelcomeMsg" android:label="@string/app_name">
    		</activity>
    	</application>
        <uses-sdk android:minSdkVersion="7" />
    </manifest> 
    

    아래 화면은 ADT에서 제공하는 eclipse 플러그인으로써 AndroidManifest.xml를 UI를 이용하여 수정 할 수 있게 해준다.

  4. AndroidManifest.xml 파일에 Activity를 추가하였으면 이 애플리케이션은 HelloWorldExt와 DisplayWelcomeMsg 라는 이름의 Activity를 두 개 가지고 있을 것이다. 이제 할 일은 HelloWorldExt Activity에서 DisplayWelcomeMsg Activity를 호출 하는 일이다. 여기서 Intent가 나오는데 이번 포스트에서는 Activity 호출 시 쓰이는 것이라고만 하고 넘어가고 다음 글에서 그 개념을 알아보겠다. HelloWorldExt.java 파일을 열어 아래와 같이 수정한다.
     
    package com.bbare.studies.helloworldext;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    
    public class HelloWorldExt extends Activity {
        /** Called when the activity is first created. */
        
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.firstview);
            
            Button btnOk = (Button)findViewById(R.id.btnOk);
            btnOk.setOnClickListener(new View.OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    EditText etName = (EditText)findViewById(R.id.etName);
                    
                    Intent intent = new Intent(HelloWorldExt.this, DisplayWelcomeMsg.class);                
                    intent.putExtra("etNameValue", etName.getText().toString());
                    startActivity(intent);                
                }
            });
        }    
    }
    

    Intent intent = new Intent(HelloWorldExt.this, DisplayWelcomeMsg.class);
    위 코드는 Activity 호출 시 쓰이는 Intent를 생성하는 코드이고 첫 번째 인자는 현재 컨텍스트이고 두 번째 인자는 호출 할 Activity의 class이다.

    intent.putExtra("etNameValue", etName.getText().toString());
    이 코드는 etName의 text값을 etNameValue라는 key로 설정하여 intent에 저장하는 역할을 수행한다.

    startActivity(intent);  
    이 코드는 위에서 만든 intent 설정을 인자로 받아 Activity를 호출 하는 역할을 수행한다.

  5. DisplayWelcomeMsg.java 파일도 다시 열어 아래와 같이 수정해 준다.
    package com.bbare.studies.helloworldext;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.widget.TextView;
    
    
    public class DisplayWelcomeMsg extends Activity {
            
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.secondview);  
            
            Intent intent = getIntent();       
            
            TextView tvHelloMsg = (TextView)findViewById(R.id.tvHelloMsg); 
            tvHelloMsg.setText("Welcome!! " + intent.getStringExtra("etNameValue"));
        }
    }
    

    Intent intent = getIntent();
    이 코드는 현재의 Activity를 호출한 Intent를 가져와서 intent에 대입하는 역할을 수행한다.

    intent.getStringExtra("etNameValue")
    이 코드는 intent에 저장되어 있던 etNameValue를 key로 하는 값을 가져오는 역할을 수행한다.

  6. 이제 Ctrl+F11을 눌러 에뮬레이터로 애플리케이션을 실행시켜보자.
    화면은 이전 글에서 만든 애플리케이션과 똑같다. 하지만 값을 입력시키고 OK버튼을 눌러 Welcome 메시지가 나오는 화면에서 ‘돌아가기’ 버튼은 누르면 이전 애플리케이션과의 차이를 확인 할 수 있을 것이다. 돌아가기 버튼을 누르면 이전 Activity인 이름을 입력하라는 화면이 나온다.
    확대

이것으로 Activity 호출 하는 방법을 알아보았다.
오늘 나온 Intent 라는 개념은 아주 중요한 것 같아서 따로 포스팅 해야 될 것 같다.

혹시라도 제가 작성한 글에 못된 점이 있다면 피드백 해주세요^^;

트랙백 주소 :: http://bbare.tk/88/trackback/

댓글을 남겨주세요

  1. 떵꺼리 2010/02/10 14:25 답글수정삭제

    포스트 잘 보고 있습니다.
    현재 보이는 이클립스 배경은 어떤 Syntax Coloring을 사용하시는지요 ^^;

    • 빠레 2010/02/10 16:20 수정삭제

      댓글 감사합니다.
      제 이클립스의 Syntax Color 설정은 이전에 포스팅 해놓은 것이 있습니다.
      http://bbare.tk/53 이 글 보시면 될 것 같네요..
      댓글 달린 글에는 이크립스 화면이 안나오는데..
      혹시 글 속에 있는 코드의 컬러가 궁금하신 거면 이 기능은 텍스트 큐브에서 지원하는 코드 하이라이트 기능을 쓴 것입니다.

  2. 안드로메다 2010/02/21 23:45 답글수정삭제

    정말 도움 많이 되었습니다. 감사합니다.

  3. Intent - Avtivity호출과 정보전달

    Tracked from Confluence: UBSNI 프로젝트 문서 2010/04/02 15:02

    관리자의 승인을 기다리고 있는 트랙백입니다

  4. Copy of Intent - Avtivity호출과 정보전달

    Tracked from Confluence: UBSNI 프로젝트 문서 2010/04/15 10:42

    관리자의 승인을 기다리고 있는 트랙백입니다

옵션
댓글 달기
Powerd by Textcube, Google, designed by criuce (이 블로그는 맑은고딕 글씨체에 최적화되어 있습니다.)
rss