Activity란 뭘까?

서정한·2023년 8월 2일
0

내일배움캠프 7기

목록 보기
17/66

Intro

  • 안드로이드를 공부하며 맨처음 만난것은 Activity였다. 일단 Activity에서 화면을 그리고 사용자와 상호작용을 하는것이라고 한다. 그런데.. 이정도만 알고 그냥 앱을 만들어도 괜찮은것일까? 의문이 들었고, 그래서 공식문서를 읽어보았다.

공식문서에서 말하는 Activity

  • 사용자가 무슨활동을할지 정형화 할 수 없다. 사용자는 이메일 앱에서 이메일만 작성하는게 아닌, SNS를 공유하다가 이메일앱에 넘어와 메일도 작성하는 등 여러가지 활동을 하는데 이 순서를 예측할 수 없다.
  • 그래서 Activity라는 개념을 사용하게 되었다. Activity는 활동이다. 내가 감히 추측하기로는 Activity라는 이름을 쓰게된것은 사용자와 스마트폰 앱 사이의 상호작용에서 일어나는 모든것을 활동이라고 보고 이름을 활동이라고 지은게 아닐까싶다. 어쨋든, Activity는 사용자가 앱을 실행할때 가장 처음 만나는 곳이다. 그리고 앱은 활동들의 모음이다. 여러 활동들 중 앱이 실행될때 가장 먼저 화면에 보여줄 활동 하나를 정하여 사용자에게 보여준다. 그렇다면 앱의 여러 활동들 중 무엇을 먼저 보여줄지는 어디서 정의할까? 그게 바로 manifest이다.

Manifest

  • manifest에서는 활동 및 다양한 특정 속성을 지정해놓으면 사용자가 앱을 실행할때 여기에 기록된대로 설정하여 실행된다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Calculator"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
  • 현재 나는 계산기 앱을 만들고있기에 그곳의 manifest를 가져와봤다. 속성들에대한 간단한 설명은 아래와 같다.
    • application: 앱이 실행되기위해 반드시 필요한 속성. 말 그대로 애플리케이션의 필요한 요소를 선언하는 곳이다.
    • activity: 앱의 activity를 정의한다. activity를 사용하고싶다면 반드시 여기에 선언해야 쓸 수 있다.
      • intent-filter: 앱에서 intent를 사용할때 해당 필터를 참고하여 명시적, 암시적 인텐트를 처리한다. 예를들어 이 activity는 email 활동을 할 수 있다고 정의해놓았을경우 명시적 인텐트를 사용할시 이메일을 보낼때 해당 activity를 사용할 수 있게되는것이고, 암시적 인텐트시 이메일을 보내는 처리를 할 때 해당 activity가 사용할 수 있는 앱 목록에 보여져 사용자가 선택할 수 있도록 한다. 그리고 여기에서 어떤 activity를 앱의 첫 화면으로 사용할지 정할 수 있다.
      • premission: 앱에서 다른 activity를 실행하려면 동일한 권한을 가지고있어야 한다. 이것에 관한 설정이 activity 내에 android:permission 및 manifest 내 user-permission이다. 여기서 주의할 점은 activity의 permission과 user-permission의 권한이 동일해야 해당 작업을 수행할 수 있다. 가령 SNS에서 게시물을 공유하고자한다면 해당 activity의 공유권한과 user-permission의 권한이 같아야 한다.

Activity Lifecycle

  • activity에는 수명이 존재한다. 왜 존재할까 생각해본다면 한정된 자원을 효율적으로 쓰려면 안쓰는 activity의 자원을 반환해야하기 때문일 것이다.

  • activity가 생성되고 파괴될때까지 아래의 흐름으로 진행된다.
    출처는 여기에

  • onCreate(): activity에서 가장먼저 실행되는 부분. 여기에서 view를 구성하고 그때 사용되는 함수가 setContentView()이다. 여기에서 대부분의 initialize가 이뤄져야 한다. onCreate 상태에서는 사용자가 뷰를 볼 수 없다. 그리고 onCreate가 끝나면 다음콜백은 항상 onStart()이다.

  • onStart(): onCreate가 종료되면 activity는 시작됨으로 바뀌고 activity가 사용자에게 보여진다. 그러나 사용자의 입력을 받을 수는 없다. 뷰만 보여지는 상태

  • onResume(): 사용자와 activity가 상호작용하기 직전 상태. 이 시점에서는 해당 activity가 activity스택(activity를 스택으로 관리하는군!) 맨 위에 존재하고, 드디어 사용자와 상호작용이 가능해지는 상태에 돌입한다. 이 콜백뒤에는 항상 onPause()가 온다.

  • onPause(): activity가 포커스를 잃을때 호출되는 상태. 예를들어 사용자가 뒤로가기를 누른다던지, 다른 activity로 넘어간다던지 등의 활동이 수행될때 이전 사용자가 머물렀던 activity는 onPause 상태가된다. 공식문서에서는 사용자가 UI업데이트를 기다리고있어도 onPause상태가되고 이 때 UI를 업데이트 할 수 있다고 하는데.. 예를들어 미디어플레이어 재생등이라고 한다. 솔직히 명확하게 이해되지는 않는다. 어쨋든, 이 상태에서 갈 수 있는 상태는 2가지인데 onResume으로 돌아가던지, 아니면 onStop으로 가는것이다.

  • onStop(): activity에서 완전히 벗어난 상태로 사용자에게 activity가 표시되지않을때 발생한다. activity가 제거중이거나, 새 activity가 시작중이거나, 기존 activity가 reStart() 상태일때 발생할 수 있다. 그래서 사용자가 activity와 상호작용을 다시시작하게될경우 onRestart()로 넘어가고, 그렇지 않을경우 onDestroy()로 넘어가게된다.

  • onRestart(): onStop 상태의 activity가 다시 활동을 시작하려고할때(이걸 어떻게 분간하지?) 이 콜백을 호출한다. 그래서 이 콜백뒤에는 항상 onStart()가 오게된다.

  • onDestroy(): activity가 제거되기 전 이 콜백을 호출한다. 해당 activity의 마지막 호출이고 일반적으로는 activity가 제거될때 혹은 해당 프로세스가 종료될때 수행된다. 모든 리소스를 해제한다.

Outro

  • 간략하게 activity와 lifecycle에 대해 알아보게되었다. 공식문서를 따라가다보니 lifecycle에서도 상태에 따라 OS에서 메모리가 부족할때 살릴 우선순위의 앱들을 정하는 기준도 보였고, lifecycle에대한 이해없이 앱을 만들게되면 다른 앱으로 넘어갔다가 돌아올때 갑자기 앱이 죽어버린다는등의 크리티컬한 현상이 발생할 수도있겠다는 예상을 할 수 있어 좋은 시간이었다.
  • 이전에는 사용법만 알고 쓸줄알면 다 안다고 생각했었는데 엄청난 착각을 하며 공부를 하고있었다는것을 새삼 느끼게된다. 기술을 만들때에는 컨셉이라는게 존재한다는것도 생각해보게되었고 내가 그 기술을 잘 쓰려면 컨셉에대한 이해가 있어야 해당기술을 안정적으로 잘 사용하고 디버깅할 수 있음을 깨닫는 시간이었다.
profile
잘부탁드립니다!

0개의 댓글