Android 개발(8) : Intent를 사용하여 액티비티 전환하기

Myeong Ho Song
Android Develop & Android
8 min readJan 18, 2015

대부분의 안드로이드 앱들은 여러 액티비티로 나눠져 많은 양의 정보를 적절한 액티비티에 나누어 보여줍니다. 이 때 한 액티비티에서 뷰들에 액션을 취해 다른 액티비티로 전환을 하게 되는 경우가 많습니다. 이 때 사용되는 것이 Intent 입니다.

Intent란, 액티비티 등의 전환이 일어날 때 호출이나 메시지를 전달하는 매개체입니다. 한마디로 이사를 갈 때 이삿짐 센터 차량과 같다고 생각하면 편할 것 같네요.

인텐트는 명시적 인텐트와 암시적 인텐트 총 2가지 방법으로 사용이 됩니다. 둘다 이름에 드러나 있듯 명시적 인텐트는 전환될 액티비티를 직접 적어서 표현하는 방법입니다.

Intent intent=new Intent(MainActivity.this,SubActivity.class);
startActivity(intent)

암시적 인텐트는 전환될 곳을 직접 지정하지 않고 액션을 적어서 사용합니다. 전환될 곳에도 액션을 적어 인텐트를 받습니다. 암시적 인텐트의 경우 매니페스트에서 액티비티를 추가해준 부분에 인텐트필터를 이용하면 됩니다.

이번 포스팅에서는 명시적 인텐트에 대해 포스팅을 하려합니다. 인텐트를 사용할 때 데이터도 같이 전달하도록 하겠습니다.

1. 레이아웃 구성

처음 보여줄 액티비티와 인텐트로 전달 받은 액티비티 총 2개의 액티비티를 구성해야합니다. 이번 레이아웃 구성은 어렵거나 새로운 부분이 없으므로 빠르게 넘어가도록 하겠습니다. 우선 처음 보여줄 activity_main입니다.

<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android"
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:padding=”10dp”
android:orientation=”vertical”
android:background=”#ff6">
<TextView android:text=”Main Activity”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:textSize=”20dp”/>
<EditText
android:id=”@+id/edittext”
android:layout_width=”200dp”
android:layout_height=”wrap_content” />
<Button
android:id=”@+id/button1"
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:text=”go to sub Activity”
android:background=”#eee”/>
</LinearLayout>

에디트 텍스트에 입력을 하고 버튼을 누르는 식의 액티비티입니다.

다음은 activity_sub 입니다.

<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android"
android:orientation=”horizontal” android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:padding=”10dp”
android:background=”#1ff”>
<TextView
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”Sub Activity : “
android:textSize=”20dp”/>
<TextView
android:id=”@+id/textview”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:textSize=”20dp”/>
</LinearLayout>

MainActivity의 에디트 텍스트에서 입력된 문자열을 출력하도록 하는 액티비티 입니다.

2. MainAcitivty 구현

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1=(Button)findViewById(R.id.button1);
final EditText editText=(EditText)findViewById(R.id.edittext);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,SubActivity.class);
intent.putExtra(“text”,String.valueOf(editText.getText()));
startActivity(intent);
}
});
}

MainActivity의 코드입니다. Intent가 쓰인 부분을 보도록 하겠습니다.

Intent intent=new Intent(MainActivity.this,SubActivity.class);
intent.putExtra(“text”,String.valueOf(editText.getText()));
startActivity(intent);

Intent 객체를 선언할 때 입력해주어야 하는 파라미터는 현재 액티비티와 전환할 액티비티입니다. 프레그먼트에서 사용할 경우 프레그먼트액티비티를 나타내는 getActivity()를 써주면 됩니다.

에디트텍스트에 입력된 문자열을 넘겨줄 때 putExtra를 사용합니다. 넘겨줄 데이터의 이름과 데이터를 적어주면 됩니다. 이 때 사용한 이름은 데이터를 넘겨 받는 액티비티에도 똑같이 써줘야 합니다. 에티드텍스트에서 텍스트를 불러오는 부분에서그냥 쓰게 되면String형으로 반환이 되지 않아서 String형으로 변환을 시켜주었습니다.

그리고 전환될 액티비티로 넘어갈 때 startActivity()를 사용합니다. 만약 MainActivity를 종료시키고 싶다면 finish()를 startActivity()다음에 적어주면 됩니다.

3. SubActivity 구현

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
Intent intent=new Intent(this.getIntent());
String s=intent.getStringExtra(“text”);
TextView textView=(TextView)findViewById(R.id.textview);
textView.setText(s);
}

SubActivity에서도 MainActivity에서 인텐트를 받아 데이터를 출력하기 때문에 인텐트 객체를 선언해야 합니다. 이 때는 보낸 인텐트를 받아야 하기 때문에 getIntent()를 사용합니다.

MainActivity에서 보낸 문자열을 SubActivity에서 받아야 하므로 getExtra를 사용합니다. 이 때 데이터의 형태에 맞춰 getExtra를 사용해야되는데 지금은 문자열이므로 getStringExtra를 사용했습니다.

4. Manifest 작성

SubActivity를 구현하는데 까지 하고 실행을 하게 되면 버튼을 눌렀을 때 에러가 뜨면서 앱이 죽게 됩니다. 새로운 액티비티를 생성하였을 경우 매니페스트에 꼭 기입을 해주어야 합니다. application그룹 안에 새로 만든 액티비티를 기입해주면 됩니다.

<activity android:name=”.SubActivity”
android:screenOrientation=”portrait”/>

현재 페이지가 회전되지 않고 세로로 고정되기 위해서 screenOrientation을 portrait으로 주었습니다.

인텐트를 사용하여 데이터 전달과 액티비티 전환에 대해 알아봤습니다. 액티비티가 전환되는 것을 깊이(depth)라 하는데 깊이가 깊어질수록 유저가 피곤하게 되므로 3뎁스 이상으로 만드는 것은 삼가는 편이 좋습니다.

이번 포스팅에 사용된 코드는 아래 주소에 가면 받을 수 있습니다.

https://github.com/songmho/Intent

--

--