woniper

Android Intent를 이용한 Activity간 Data 공유 본문

Android

Android Intent를 이용한 Activity간 Data 공유

woniper1 2014. 8. 2. 01:24

  안드로이드에서는 Activity간 Data 공유를 Intent라는 객체를 사용해서 구현한다. Intent는 명시적 Intent와 암시적 Intent가 있다. Intent에 대한 자세한 설명은 제외하고 이번 포스팅에서는 Intent를 사용해서 Activity간 Data 공유하는 방법을 설명한다.


PutActivity에서 이름, 나이 입력 후 Data객체 생성 후 GetActivity로 Data를 전송한다고 가정하자

1. PutActivity (데이터 전송 화면)

  • Data.java
package com.woniper.example;

import java.io.Serializable;

public class Data implements Serializable {

    public String name;
    public int age;

    public Data() {}

    public Data(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
  • PutActivity.java
package com.woniper.example;

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 PutActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final EditText etName = (EditText)findViewById(R.id.et_name);
        final EditText etAge = (EditText)findViewById(R.id.et_age);

        Button btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = etName.getText().toString();
                int age = Integer.parseInt(etAge.getText().toString());
                // Data 객체 생성
                Data data = new Data(name, age);

                // Intent에 Data객체 저장
                Intent intent = new Intent(PutActivity.this, GetActivity.class);
                intent.putExtra("data", data);

                // GetActivity로 Activity 전환
                startActivity(intent);
            }
        });
    }
}
  • put_activity.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" >

    <EditText

            android:id="@+id/et_name"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:hint="이름을 입력해주세요."/>

    <EditText

            android:id="@+id/et_age"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:hint="나이를 입력해주세요."/>

    <Button

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:text="전송"

            android:id="@+id/btn"/>

</LinearLayout>


2. GetActivity (데이터 받아서 처리하는 화면)

  • GetActivity.java
package com.woniper.example;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class GetActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.get_activity);

        // Data 객체를 받을 Intent 생성
        Intent intent = getIntent();
        Data data = (Data)intent.getSerializableExtra("data");

        TextView txtName = (TextView) findViewById(R.id.txt_name);
        TextView txtAge = (TextView) findViewById(R.id.txt_age);

        // Data TextView에 적용
        txtName.setText("이름 : " + data.name);
        txtAge.setText("나이 : " + String.valueOf(data.age));
    }
}
  • get_activity.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

              android:orientation="vertical"

              android:layout_width="match_parent"

              android:layout_height="match_parent">

    <TextView

            android:id="@+id/txt_name"

            android:textSize="30sp"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"/>

    <TextView

            android:id="@+id/txt_age"

            android:textSize="30sp"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"/>

</LinearLayout>


3. AndroidManifest.xml (Activity 설정)

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

          package="com.woniper.example"

          android:versionCode="1"

          android:versionName="1.0">

    <uses-sdk android:minSdkVersion="19"/>

    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher"

  android:theme="@android:style/Theme.Light">

<!--Main Activity(첫화면) -->

        <activity android:name="com.woniper.example.PutActivity"

                  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="com.woniper.example.GetActivity" />

    </application>

</manifest>

Activity는 AndroidManifest.xml이라는 애플리케이션 설정 파일에 적용되어 있어야 Activity간 전환이 가능하다.


4. 화면

  PutActivity화면                                     GetActivity화면

   



5. Intent Method

 Type

PUT 

GET 

 설명

 Object

 putExtra("object", Object) 

 getSerializableExtra("object")

 객체 전송, 반드시 Serializable을 상속

 String

 putExtra("string", "StringType")

 getStringExtra("string")

 문자열 전송

 Integer

 putExtra("int", 100)

 getIntExtra("int")

 int 타입 전송
 Long

 putExtra("long", 100L)

 getLongExtra("long")

 long 타입 전송
 Double

 putExtra("double", 100.123)

 getDoubleExtra("double")

 double 타입 전송
 Boolean

 putExtra("boolean", true)

 getBooleanExtra("boolean")

 boolean 타입 전송
 Bundle

 putExtra("bundle", Bundle)

 getBundleExtra("bundle") Bundle 객체 전송


Object객체와 Bundle객체를 제외하고는 기본으로 모든 DataType을 제공한다. 위 표에 제외된 Type도 있다.

4 Comments
  • 프로필사진 11 2016.04.19 00:29 안녕하세요 안드로드를 연습하고 있는 학생입니다.
    이 글을 보고 따라해봤는데 저는 계속 PutActivity화면이 나오고 버튼을 누르면 GetActivity화면으로 넘어가지 않고 강제종료가 되는데 이 부분은 어떻게 해야될까요???
  • 프로필사진 11 2016.04.19 00:36 아 제가 타이핑한 코드가 오타가 있을지도 몰라 packge부분을 뺀 나머지 부분을 붙어넣어봤는데도 똑같은 현상이 일어납니다
  • 프로필사진 학생! 2016.05.28 10:15 안녕하세요! 저도 안드로이드를 연습하고 있는 한 학생입니다.
    저는 MainActivity 에서 NameActivity 로 데이터를 전달하는 것이 아닌, MainActivity 에서 NameActivity 로 화면이 전달된 후, 일방적으로 NameActivity 에 입력된 문자열 정보들을 MainActivity 로 전달하고자 합니다.

    그래서 MainActivity 에서도 Intent intent = new Intent (........ 이 형식으로 만든 후 startActivity(intent); 로 화면을 전환 시키고, NameActivity 클래스에서 또 Intent intent = new Intent(NameActivity.this, MainActivity.class);
    intent.putExtra("names", names);
    finish();

    이렇게 한 후, MainActivity 에서 밑에 부분에 Intent intent = getIntent();
    intent.getStringArrayExtra("names");
    이렇게 정보를 얻어오려고 했는데 오류가 나서요.

    MainActivity 에서 NameActivity 로 정보를 주는 것이 아닌, NameActivity 에서 MainActivity 로 정보를 주고자 할 때는 어떻게 해야하나요??
  • 프로필사진 학생 2016.05.28 10:16 이에 대한 답변을 해주실 수 있으시다면 ㅠㅠㅠㅠ
    ksw05088@naver.com 으로 연락바랍니다.
댓글쓰기 폼