프로그래밍/Android

안드로이드 화면 전환, 액티비티 간 정보 전송 (인텐트,Intent)

Lou Park 2016. 1. 27. 11:15

안드로이드에서 인텐트(Intent)는 기본이다.

고등학교 때 100% 열정만으로 뛰어든 앱 개발에 가장 당황했던 것은 그 흔한 화면 넘기기 조차 자바 코드였다는 사실이다.

특히나 그 때 자바 문법에 대한 지식이 1도 없어서 인텐트는 사용해보지도 못했다. (그래서 Tab으로 구현했는데 이것도 이상하네..)

그래서 이번에는 인텐트에 대해서 정리를 해서 나처럼 화면전환을 못하는 사람에게 도움을 주려한다.


인텐트는 어떤 일을 할 수 있는가?

인텐트는 A Activity에서 어떤 동작이 발생하면, B Activity를 실행하는 화면 전환의 기능을 할 수 있다.

그리고 A Activity에서 발생하는 어떤 형태의 데이터(int,String,char,float,array...etc)를 B Activity로 넘길 수 있다.


인텐트 사용법

인텐트 사용법의 예시를 보기 위해

MainActivity.java === activity_main.xml

SubActivity.java === activity_sub.xml

이렇게 두가지의 화면과 두가지의 액티비티가 있고, MainActivity에서 SubActivity로 화면 전환을 해야한다고 가정하자.

MainActivity에 있는 버튼을 누르면, SubActivity로 넘어갈 것이다.


activity_main.xml

여기서는 화면 전환을 위한 버튼을 하나 생성한다.


1
2
3
4
5
<Button
android:id="@+id/btn_next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="화면전환"/>
cs


그러면 '화면전환'이라는 라벨이 달린 버튼이 하나 생성 될 것이다.

이것에 OnClickListener를 달아 버튼이 눌리면 인텐트를 실행시키기 위해 MainActivity.java를 열어 수정한다.


MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MainActivity extends Activity 
{    
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         
        Button btn_go = (Button) findViewById(R.id.btn_go);
        btn_go.setOnClickListener(
            new Button.OnClickListener() {
                public void onClick(View v) {
                    //SubActivity로 가는 인텐트를 생성
                    Intent intent = new Intent(this, SubActivity.class);
                    //액티비티 시작!
                    startActivity(intent);
                }
            }
        );
    }
}
cs


이렇게 까지 하면 MainActivity에 있는 버튼을 누르면 SubActivity로 넘어갈 것이다.

오류가 뜬다고...? 그것은 아마 SubActivity를 AndroidManifest.xml 파일에 등록해주지 않아서이다.

<activity android:name=".SubActivity"></activity>

위 한 줄을 <activity android:name=".MainActivity">...</activity> 바로 밑에 추가해주자!


activity_sub.xml

이제 화면 전환까지는 했으니 정보를 주고 받는 일을 해보겠다.

MainActivity의 버튼을 누르면 "jizard"와 119라는 정보 두가지를 전달 해 보겠다. 보다시피 하나는 String, 하나는 int 타입이다.

SubActivity 에서는 받아 온 값을 TextView에 출력할 것이다. 값이 2개이므로 TextView를 두개 만든다.


1
2
3
4
5
6
7
8
9
10
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/username"
/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/birthday"
/>
cs


username이란 id를 가진 TextView에는 "jizard"를, birthday에는 119를 넣을 것이다.


정보 전송을 위해 다시 MainActivity를 수정한다.


MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MainActivity extends Activity 
{    
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         
        Button btn_go = (Button) findViewById(R.id.btn_go);
        btn_go.setOnClickListener(
            new Button.OnClickListener() {
                public void onClick(View v) {
                    //SubActivity로 가는 인텐트를 생성
                    Intent intent = new Intent(this, SubActivity.class);
                    intent.putExtra("USERNAME_KEY","jizard"); //키 - 보낼 값(밸류)
                    intent.putExtra("BIRTHDAY_KEY",119); 
                    //액티비티 시작!
                    startActivity(intent);
                }
            }
        );
    }
}
cs


putExtra에다가 원하는 값을 넣어주면 된다.

그런데 원하는 값 앞에있는 "USERNAME_KEY" 같은건 뭐냐?!

컴퓨터공학도들이나 자료구조에 대해 약간 배운 사람들은 Key-Value 관계를 잘 안다.

하지만 비전공자들에겐 생판 처음 보는 것들이다. 왜 값을 두개나 보내지라고 생각할지도...

말하자면 이름을 붙여주는 것이다. 지금은 "jizard"라는 특정 값을 전달하지만 혹시나 유저가 임의로 만든 문자를 전달하는 상황이 올지도 모른다.

그래서 프로그램에서 처리하기 쉽도록 '그 값의 이름은 "USERNAME_KEY"니까 그 놈으로 가져와라.'하는 것이다.

2학년 5반 37번이라고 이름짓는 거랑 똑같다.

그럼 이제 2학년 5반 37번 아이를 불러보는 일을 SubActivity에서 해보자.


SubActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class SubActivity extends Activity 
{    
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sub);
         
        TextView tv_username = (TextView) findViewById(R.id.tv_username);
        TextView tv_birthady = (TextView) findViewById(R.id.tv_birthday);
        
        Intent intent = getIntent(); //이 액티비티를 부른 인텐트를 받는다.
        String username = intent.getStringExtra("USERNAME_KEY"); //"jizard"문자 받아옴
        int birthday = intent.getIntExtra("BIRTHDAY_KEY",0); //119 받아옴
 
        tv_username.setText(username);
        tv_birthday.setText(String.valueOf(birthday));
    }
}
cs


인텐트를 받기 위해서 여기서도 인텐트를 하나 생성한다.

예전에 잘 몰랐을땐 이 액티비티 호출한 인텐트랑 여기서 만든 인텐트랑 변수명이 다르면 작동이 안될까봐...ㅋㅋ

무조건 같게했었는데, 그럴 필요는 없다...

intent에서 String 값을 받아오기 위해서는 getStringExtra(String key)를 사용하며

int 값을 받아오기 위해서는 getIntExtra(String key, int defaultValue)를 사용한다.

int를 불러올 땐 인텐트 값을 받아오지 못했을 때 설정할 기본 값을 주는 것이다. 그럼 String을 못받아오면? null 이된다.

이러한 것은 Intent에 관한 구글 안드로이드 API에 다 있다.


영어로 적혀있어서 읽기 싫은건 사실이지만,

백번 천번 도움되니 API는 꼭 읽기를 바란다!