https://coding-factory.tistory.com/203


어플리케이션을 만들때 하나의 화면을 가지고 어플리케이션을 만들지는 않죠. 하나의 화면에 모든기능을 담기란 불가능합니다. 대부분의 어플리케이션은 많은 View를 모으고 모아서 만든 결과물입니다. 그래서 안드로이드에서는 화면간 이동과 화면간 데이터 전달이 무척이나 빈번하고 중요합니다. 안드로이드에서 페이지 전환과 페이지간 데이터 전달은 Intent를 통해서 구현할 수 있습니다.


※ 인텐트란

인텐트는 앱 컴포넌트가 무엇을 할 것인지를 담는 메시지 객체입니다. 메시지는 의사소통을 하기 위해 보내고 받는 것이지요. 메시지를 사용하는 가장 큰 목적은 다른 액티비티, 서비스, 브로드캐스트 리시버, 컨텐트 프로바이더 등을 실행하는 것입니다. 인텐트는 그들 사이에 데이터를 주고 받기 위한 용도로도 쓰입니다. 


화면 전환

화면은 하나의 액티비티로 생각할 수 있습니다. 즉 화면 간의 이동하는 과정은 각각의 액티비티를 필요에 따라 띄우거나 닫는 과정과 같습니다. 어플리케이션을 구성하다보면 메인 액티비티에서 띄워야 할 화면들이 여러개가 될 뿐만 아니라 띄웠던 화면을 닫고 원래의 메인 화면으로 돌아올 때 데이터를 새로 적용해야 하는 경우등 다양한 케이스를 고려하여 작업하여야 합니다. 즉 단순히 액티비티를 띄워주는 것이 아니라 어떤 액티비티를 띄운 것인지 그리고 띄웠던 액티비티로부터의 응답을 받아 처리하는 코드가 필요하게 됩니다. 액티비티를 띄우기 위해 사용되는 메서드는 startActivity()와 startActivityForResult()이 정의되어 있습니다.

화면전환

화면 이동 간 예제


Manifest

<activity android:name=".SubActivity"/> <!--액티비티 추가시 <application> 안에 추가해줘야함-->


MainActivity.class

package com.example.user.intent;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    public static final int sub = 1001; /*다른 액티비티를 띄우기 위한 요청코드(상수)*/
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button)findViewById(R.id.sub); /*페이지 전환버튼*/

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(),SubActivity.class);
                startActivityForResult(intent,sub);//액티비티 띄우기
            }
        });
    }
}


결과

화면전환결과



화면 간 데이터 전달

액티비티간의 데이터를 전달할때도 Intent는 유용하게 쓰입니다. 마치 웹에서 request랑 비슷하다고 생각하시면 이해가 빠르실겁니다. String값,Int값은 물론이고 배열이나 List같은 형태도 전달가능하며 Serializable을 상속받게 되면 클래스형태까지 전달할 수 있습니다. 데이터를 보내는 메서드는 putExtra() 전 페이지에서 보낸 값을 받아올때는 getExtra() 이 두 함수만 알고 계시면 됩니다. 예제를 보시면 한번에 이해하실 수 있으실겁니다.

데이터송수신

화면 간 데이터 송 수신 예제


Manifest

<activity android:name=".SubActivity"/> <!--액티비티 추가시 <application> 안에 추가해줘야함-->


MainActivity.class

package com.example.user.myintent;

import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button sub = (Button)findViewById(R.id.sub);

        sub.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String[] array = {"홍길순","김춘추","김유신"}; /*송신 할 배열*/
                Option option = new Option("010xxxxxxxx","서울특별시xxxx"); /*송신 할 클래스*/

                Intent intent = new Intent(getApplicationContext(), SubActivity.class);

                intent.putExtra("name","홍길동"); /*송신*/
                intent.putExtra("age",20);
                intent.putExtra("array",array);
                intent.putExtra("class",option);

                startActivity(intent);
            }
        });
    }
}

SubActivity.class

package com.example.user.myintent;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

public class SubActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sub);

        TextView tx1 = (TextView)findViewById(R.id.textView1); /*TextView선언*/
        TextView tx2 = (TextView)findViewById(R.id.textView2);
        TextView tx3 = (TextView)findViewById(R.id.textView3);
        TextView tx4 = (TextView)findViewById(R.id.textView4);
        TextView tx5 = (TextView)findViewById(R.id.textView5);

        Intent intent = getIntent(); /*데이터 수신*/

        String name = intent.getExtras().getString("name"); /*String형*/
        tx1.setText(name);

        int age = intent.getExtras().getInt("age"); /*int형*/
        tx2.setText(String.valueOf(age));

        String array[] = intent.getExtras().getStringArray("array"); /*배열*/
        String add_array="";
        for(int i=0;i<array.length;i++){
            add_array+=array[i]+",";
        }
        tx3.setText(add_array);

        Option option = (Option)intent.getSerializableExtra("class"); /*클래스*/
        tx4.setText(option.getPhone());
        tx5.setText(option.getAddr());

    }
}


Option.class

package com.example.user.myintent;

import java.io.Serializable;

/**
 * Created by user on 2016-12-22.
 */

public class Option implements Serializable{

    String phone;
    String addr;

    public Option(){

    }
    public Option(String phone, String addr){
        this.phone = phone;
        this.addr = addr;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }
}


결과

데이터송수신결과


예제소스의 XML은 올리지 않았습니다. 글이 너무 길어져서요 .. 아마 자바파일을 보시면 XML도 아실거라 생각합니다. 혹시나 XML이 궁금하신분은 댓글주세요. 알려드리겠습니다.