[Ch3-4] 안드로이드 인텐트 사용하여 액티비티 연결하기 (Using intents to link activities)
Android Studio 공부 시작 2019. 6. 12. 23:15안드로이드에서 하나의 액티비티 (화면)이 다른 화면과 연결하기 위해서는 인텐트를 사용한다고 한다.
그러면 정말 간단하게 (나 같은 안드로이드 병아리의 경우에는 그다지 녹록지는 않았다) 인텐트로 화면을 서로 이어보자!
우선, 그전에 사용했던 프로젝트는 다시 또 더러워졌으니 일단 버리고 새로 만들자.
Empty activity 로 만들고 프로젝트명은 "Intents"로 해보자.
** 패키지 이름은 나와 다를 수 있다는걸 재차 강조한다. 나는 "example"로 되어 있지만, 각자의 화면에서 설정한 패키지 이름으로 서로 다를 것이다.
자 여기까지가 초기 셋팅이 되었으니, 우선 방법을 하나하나 실행해보고 나중에 파헤쳐보자.
Step 1 연결할 다른 액티비티의 java 클래스 파일과 xml 파일 만들기
프로젝트 디렉토리에서 app -> java 폴더에 마우스 오른쪽 클릭 한 다음, new-> Java class 생성하도록 하자. 신규 클래스의 이름은 "SecondActivity"로 명명하자. 그러면 위와 동일한 화면을 얻을 것이다.
그다음 바로 xml 파일을 생성해도 상관은 없으나, 혹시 기억하는 병아리가 있을지 모르겠다. 모든 액티비티를 관장하는 java 파일은 AndroidManifest.xml (App -> manifests 폴더 하위에 있음)에 등록이 되어야 한다. 따라서 우선 AndroidManifest.xml 에 우리가 새로운 자바 클래스 파일을 만들었다는 사실을 알려주고 오자.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.intents">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
/* 아래로 다 추가 */
<activity android:name=".SecondActivity">
<intent-filter >
<action android:name="com.example.intents.SecondActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
위의 코드 블록을 참조하여 기입하도록 하자. 우리 병아리들이 이제 벼슬이 나기 시작했으니, 이전처럼 하나하나 어디 추가하라고는 말하지 않겠다. 절대로 귀찮아서 그러는 것은 아니니 미소 지으며 넘어가자.
자 이제, 자바 클래스 파일을 생성한 뒤 manifest.xml 에 생성했다는 것을 알려줬다. 이제 자바 클래스 파일에 연동된 UI 화면만 있으면 된다.
그러기 위해서, 귀찮으니 있는 것을 복사해다 쓰도록 하자.
layout 에서, activity_main.xml을 복사해서 똑같은 layout 폴더 안에 붙여 넣기 한 다음, 이름은 "activity_second.xml"로 명명한다.
그러면, 첫 번째 액티비티가 Empty 액티비티 임으로 두 번째도 똑같이 Empty Activity에서 "Hello World!"라는 텍스트뷰를 가지고 있는 화면이 생긴다.
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SecondActivity"> // 연결되는 자바 클래스 파일 수정
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="두 번째 액티비티" // 글자 수정
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
xml (UI 화면)과 자바 클래스 (기능)을 서로 올바르게 연결하기 위해 activity_second.xml의 "tools:context=" 부분을 "". SecondActivity">"로 수정하여 SecondActivity.java 와 연결해준다.
그리고 TextView의 android:text="두 번째 액티비티"로 바꾸어서, 나중에 화면이 바뀔 때 첫 번째 화면과 다른 점을 한눈에 볼 수 있도록 하자.
그리고 반대로도, SecondActivity.java 파일로 다시 돌아가서, 아래와 같이, activity_second 레이아웃을 참조하게 한다.
package com.example.intents;
import android.app.Activity;
import android.os.Bundle;
public class SecondActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
}
이렇게 하면, "화면과 기능을 서로 연결한다"라는 목표에서, "화면과 기능" 부분은 완료된다. 즉, "서로 연결한다!"라고 말할 때 그 "서로"는 정의된 것이다.
이제 연결을 시작하자.
Step 2 연결하기
연결을 언제 할 것인가? 보통 버튼을 누를 때 하지 않나?
버튼 만들러 가자.
첫 번째 보는 화면은 activity_main.xml UI 화면 일 것임으로, 해당 UI 화면에 버튼을 만들어 보자.
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="첫 번째 액티비티" // 수정
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
/* 아래로 다 추가 */
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="두 번째 액티비티로 가즈아!"
android:onClick="onClick"
android:id="@+id/button"
/>
</android.support.constraint.ConstraintLayout>
그다음, 저 버튼을 눌렀을 때 수행하는 "기능"은 activity_main.xml과 연결된 MainActivity.java로 가서 기능을 만들면 된다.
package com.example.intents;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.content.Intent; // 추가
import android.view.View; // 추가
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/* 아래로 다 추가 */
public void onClick(View view) {
startActivity(new Intent("com.example.intents.SecondActivity"));
}
}
여기까지 하면, 화면의 UI 버튼과 기능까지 연결되었다. 여기까지 같이 온 사람은 굉장히 고생이 많았다. 꼭 좋은 결실 있기 바란다.. (나한테도 ㅠ)
Step 3 실행해보자
다시 되짚어 보자.
처음에 우선 새로운 java class(SecondActivity.java)를 만들어 액티비티를 정의하고, 사용자가 볼 수 있는 UI 컴포넌트(activity_second.xml)를 만들어 자바 클래스와 연동한다. 여기까지 되면, 최초에 있던 MainActivity와 연결할 다른 액티비티 하나를 더 만든 셈이다.
그다음 모든 액티비티는 manifests.xml 에 등록되어야 사용이 가능하다고 함으로, 등록한다.
다른 액티비티로 넘어갈 수 있는 버튼을 UI 컴포넌트 (activity_main.xml)에 만든 뒤, 그 버튼 클릭 시 실행되어야 하는 기능을 MainActivity.java 에 정의한다.
바로 저 정의되는 부분이 인텐트이다.
향후 내가 공부를 더 채워서, 다시 와서 어떻게 기술적으로 되는지 차근차근 설명을 다시 해보겠다. 우선 지금은 기능이 활성화됨에 만족하고 넘어가자.