안드로이드 앱이 실행되면 화면이 등장하고 UI가 화면 위에 나타나며, 버튼을 터치하거나 스크롤을 하는 등 앱을 사용하게 될 것입니다. 이와 같이 앱의 전반적인 활동을 담당하는 것이 액티비티 (Acitivity)이며, 액티비티와 xml을 연결하여 UI를 표시하고 사용자가 여러가지 액션을 취할 수 있게 해줍니다. 액티비티를 어떻게 앱에 등록하고 레이아웃과 연결하는지 알아보도록 합시다.
1. Activity 만들기
사실 안드로이드 앱 프로젝트를 맨 처음 만들었을 때 MainActivity라는 클래스가 생성이 되어 있을 것입니다. 그래도 하나 더 만들어봅시다. 아래의 사진과 같이 app - java의 하위 패키지를 우클릭하고, New -> Java Class로 자바 클래스를 만들어주세요.
생성된 Java Class는 예상했지만 클래스 하나만 덩그러니 있을 뿐입니다. 기존에 생성되었던 MainActivity와 뭔가 많이 차이가 나는데요, AppCompatActivity를 상속하고 onCreate를 오버라이딩한 것과 달리 기본 클래스에는 아무것도 없네요. 물론 위와 같은 방식이 아니고 사진에 보면 Java Class를 선택하는 부분의 아래쪽에 초록색 아이콘과 함께 Activity, Fragment 등을 선택하는 부분이 있는데, 이것을 통해 액티비티를 만들면 액티비티를 조금 더 간편하게 만들 수 있지만, MainActivity의 기본적인 구조를 설명하고자 위와 같이 만들어봤습니다.
1-1. AppCompatActivity란?
자세하게 설명하지는 않지만, 간단하게 말하자면 Android의 다양한 API Level을 지원하기 위해 만들어진 Activity class의 하위 클래스입니다. 최신 OS를 가진 기기라면 안드로이드 운영체제가 업그레이드 되면서 새로 생긴 여러 기능들을 지원하겠지만, android 4 등과 같이 현재는 거의 사용하지 않는 낮은 버젼의 운영체제의 경우 최신 기능들을 사용하지 못할 수 있습니다. 따라서 Support 라이브러리나 AndroidX 라이브러리에 존재하는 AppCompatActivity와 같은 다양한 클래스를 사용해서 버전 컨트롤을 한다면 다양한 Level에서 거의 동일한 기능을 가질 수 있게 개발을 할 수 있습니다. 물론 최신 버젼의 OS만을 타겟으로 한다면 AppCompatActivity를 상속받을 필요는 없지만요. 일단 어떤 버전에 어떤 기능이 있는지 잘 모르므로 사용하도록 합시다. AppCompatActivity에 대해선 아래의 링크에서 확인할 수 있습니다.
https://developer.android.com/reference/androidx/appcompat/app/AppCompatActivity
1-2. onCreate() 는 무엇일까?
onCreate를 이해하려면 안드로이드의 생명주기를 알아야 하는데요, 유니티와 같은 엔진을 사용해 본 경험이 있다면 좀 더 익숙할 수도 있습니다. 액티비티가 앱에서 처음으로 생성될 때 딱 한번 실행되는데요, 즉 액티비티가 생성되었다는 것을 알려주는 것과 같다고 볼 수 있습니다. 보통 이 onCreate에서 초기화 등을 하게 되는데 xml 파일과 연결하는 것도 여기서 하게 됩니다. setContentView가 바로 그 역할을 하는 것입니다. saveInstanceState는 앱이 불가피하게 종료되었을 경우 상태를 복구하기 위해 사용되는 것인데, 지금 당장 필요한 것은 아니므로 넘어가겠습니다. 안드로이드의 생명주기에 대한 내용은 아래에서 확인할 수 있습니다.
https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko
2. Layout을 생성하고 Activity와 연결하기
잡담이 너무 길어졌는데, 우리의 원래 목적인 액티비티를 만들고, 등록하고, UI와 연결하는 것을 진행해 봅시다. 일단 생성한 클래스를 아래와 같은 형태로 만들어주세요.
package com.example.test;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class SubActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
}
}
아마 activity_sub에서 빨간줄이 생성될텐데, activity_sub란 레이아웃을 만들지 않았기 때문에 그렇습니다. 레이아웃을 한번 만들어봅시다. 아래의 사진과 같이 res - layout - 우클릭 - New - Layout Resource File을 클릭한 후 activity_sub란 이름으로 만들어주세요.
3. AndroidManifest.xml에 Activity 등록하기
이렇게만 하고 실행한다면 앱에서 액티비티를 찾지 못해 오류가 날 것입니다. AndroidManifest.xml 파일에 만든 액티비티를 등록해야 비로소 완성이 됩니다. 안드로이드 스튜디오 버전마다 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.test">
<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/Theme.Test">
<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=".SubActivity"></activity>
</application>
</manifest>
여기까지 했다면 큰 문제 없이 정상적으로 생성이 될 것입니다. 다만 앱을 실행할 때 SubActivity의 레이아웃이 나오는 것이 아니라 MainActivity의 레이아웃이 먼저 나오게 됩니다. AndroidManifest.xml 파일에서 MainActivity를 등록한 부분을 보면
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
이 부분을 우리가 등록한 SubActivity 안에 넣어야 첫 시작 액티비티로 등록이 됩니다. 즉 아래와 같이 변경해주시면 앱이 실행될 때 맨 처음에 SubActivity의 화면이 나오게 됩니다. (물론 MainActivity와 SubActivity의 레이아웃 모두 하얀 화면이기 때문에 당장은 구분할 수 없을 것입니다. 둘 중 하나에 UI를 아무거나 추가한 후에 한번 띄워보셔도 좋습니다.)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test">
<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/Theme.Test">
<activity android:name=".MainActivity"></activity>
<!-- 만든 액티비티 새로 등록하기 -->
<activity android:name=".SubActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
마치며..
액티비티를 만들고, 레이아웃을 디자인하고, 액티비티 클래스에서 UI를 제어하는 방법만 알면 누구나 쉽게 앱을 만들 수 있습니다. 그 중 가장 기초적인 부분을 공부해 보았는데, 큰 문제 없이 되었다면 좋겠네요. 혹시 뭔가 잘못된 점이나 부족한 점이 있다면 댓글 등을 통해 알려주시면 감사하겠습니다. 즐거운 개발 하세요!
댓글
댓글 쓰기