안드로이드 앱간 데이터 전달 - andeuloideu aebgan deiteo jeondal

이전 글 - 액티비티의 시작과 종료:startActivity() and finish()

다른 액티비티로 데이터 전달하기

데이터를 전달하는 방향에 따라 전달방법을 두가지로 나눌 수 있습니다.

  • A Activity에서 B Activity를 호출과 함께 Data 전달
  • A Activity가 B Activity를 호출한 뒤, B Activity를 종료하며 결과값을 A액티비티로 데이터 전달

다른 액티비티로 데이터 전달하기

사용자의 텍스트 입력을 받을 수 있는 InputActivity가 있다고 가정한다면 다음과 같이 입력한 데이터를 String으로 변환 할 수 있습니다.

String data = editText.getText().toString();

컴포넌트(예:액티비티)간 데이터 전달을 위해서는 인텐트가 필요합니다. 그러므로 인텐트를 만들도록 하겠습니다. 데이터를 전달받을 액티비티는 ResultActivity입니다.

Intent intent = new Intent(InputActivity.this, ResultActivity.class);

인텐트와 data가 모두 준비되었습니다. putExtra메소드를 통해 인텐트에 data를 싣어보겠습니다.

intent.putExtra("my_data", data);

첫번째 인자는 String 타입의 key 이며, 두번째인자가 실제로 전송하고자 하는 data입니다. (key: value = my_data, data)

이제 startActivity()호출 합니다.

startActivity(intent);

 

이제 ResultActivity로 가보겠습니다

Intent intent = getIntent();
String myData = intent.getStringExtra("my_data");

 액티비티가 가지고 있는 getIntent() 메소드를 이용하여 이전 액티비티에서 전달 한 인텐트를 가져올 수 있습니다.
인텐트에는 InputActivity에서 전달한 데이터가 포함되어있으니 getStringExtra()와 key값을 이용하여 data를 얻습니다.

액티비티로부터 데이터 전달 받기

이번엔 액티비티로 부터 데이터를 전달 받는 방법에 대해서 알아보겠습니다

먼저 인텐트를 통해 다른 액티비티(InputActivity2)를 호출해야합니다.

public class RecieverActivity extends AppCompatActivity{
    ...
    Intent intent = new Intent(ReceiverActivity.this, InputActivity2.class)
    startActivityForResult(intent, 1234);
    ...
}

startActivityForResult(Intent, int)라는 메소드를 호출해야 합니다. 이 메소드를 통해 다른 액티비티로부터 데이터를 전달받기를 기대할 수 있습니다.

두번째 인자는 Request Code로 결과값을 주는 액티비티를 구분하기 위한 사용자정의 코드 입니다. 

InputActivity2는 사용자의 입력을 받을수 있는 EditText를 포함하고 있는 액티비티입니다.

String data = editText.getText().toString();
Intent intent = new Intent();//startActivity()를 할것이 아니므로 그냥 빈 인텐트로 만듦
intent.putExtra("my_data",data);
setResult(RESULT_OK,intent);
finish();

먼저 EditText에 입력한 값을 String 형 data로 변환합니다. 그런뒤 인텐트를 만들어 해당 data를 싣습니다. 여기까지는 위의 내용과 같습니다. 

setResult(int, Intent)를 보시면 Result Code와 intent를 입력하고 있습니다.
Result Code는 Activity클래스에 상수로 선언되어있으며, Activity.RESULT_OK, Activity.RESULT_CANCELED, RESULT_FIRST_USER 가 있습니다.

결과값 코드의미RESULT_OK수행한 작업이 성공적일때 일반적으로 쓰는 코드RESULT_CANCELED수행한 작업이 실패일때 일반적으로 쓰는 코드RESULT_FIRST_USER사용자 정의 결과 코드 
일반적으로 다음과 같이 사용됩니다.
public static final int MY_RESULT_CODE = Activity.RESULT_FIRST_USER +1;

setResult()코드 뒤에 finish()를 하여 InputActivity2를 종료하면 해당 인텐트가 이전 액티비티(ReceiverActivity)로 전달됩니다.

public class ReceiverActivity extends AppCompatActivity {
    ...
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 1234 && resultCode == RESULT_OK){
            String myData = data.getStringExtra("my_data");
            textView.setText(myData);
        }else{
            textView.setText("No Data");
        }
    }
    ...
}

InputActivity2의 setResult값을 전달받는 위치는 onActivityResult()입니다.
액티비티를 호출했던 Request Code와 Result Code 그리고 인텐트를 파라미터로 받을 수 있습니다.
InputActivity2에서 만든 인텐트로부터 my_data키 값을 통해 데이터를 꺼낼수 있습니다

본문의 예제는 github의 012 Activity_Communication모듈에서 확인가능합니다.

안드로이드 앱간 데이터 전달 - andeuloideu aebgan deiteo jeondal

후원하기다음 글 - ANR이란? (Android Not Responding)

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

 

※ 인텐트란

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

 

 화면 전환 

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

안드로이드 앱간 데이터 전달 - andeuloideu aebgan deiteo jeondal

화면 이동 간 예제

 

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);//액티비티 띄우기
            }
        });
    }
}

 

결과

안드로이드 앱간 데이터 전달 - andeuloideu aebgan deiteo jeondal

 

 

 화면 간 데이터 전달 

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