NOW OR NEVER

[Android] 안드로이드 공식 문서 정리 - Activity 개념 본문

Android

[Android] 안드로이드 공식 문서 정리 - Activity 개념

LAURA 2023. 11. 18. 07:03
반응형

Activity

개념

  • 앱의 경우 웹과 다르게 사용자와 앱의 상호작용은 같은 곳에서 이뤄지지 않는다. 그래서 동일한 입력을 하더라도 항상 동일한 출력을 하지 않는다. 예를 들어 홈 스크린에서 이메일 앱을 열면 이메일 목록이 보이며 반대로 sns앱을 사용하다가 이메일 앱을 열면 바로 이메일을 작성하는 화면이 보인다. 앞서 설명한 과정을 용이하기 위해 설계된 것이 Activity이다.
  • 사용자와의 앱 상호 작용의 진입점 역할 : 한 앱이 다른 앱을 호출할 때 호출하는 앱은 해당 앱의 다른 액티비티를 호출하며, 앱을 원자적인(원자적인 : 여러 단계로 나눠지지 않고, 중간에 다른 프로세스가 간섭하지 않는 하나의 단위로 수행되는 연산) 전체로 호출하지 않는다. 
  • UI를 구성할 수 있는 창 제공 :  일반적으로 앱의 하나의 액티비티는 앱의 하나의 화면을 구현한다.
  • 앱에는 여러 화면이 포함되어 있으므로 여러 액티비티로 구성된다. 
    • MainActivity :  사용자가 앱을 시작할 때 처음으로 나타나는 화면
    • 각 액티비티는 다른 작업을 수행하기 위해 다른 액티비티를 시작할 수 있다.
  • 액티비티들은 일관된 사용자 경험을 형성하기 위해 함께 작동하지만, 각 액티비티는 다른 액티비티에 느슨하게 연결되어 있다.
    • 보통 액티비티 간에 최소한의 종속성이 존재한다. (종속성 : 일반적으로 라이브러리, 모듈, 또는 패키지가 다른 코드에 의존하는 상황)
    • 액티비티는 다른 앱의 액티비티를 실행시킬 수 있다. ex) 브라우저 앱에서 sns 앱의 ShareActivity를 실행 시킬 수 있다.
  • 앱에서 액티비티를 사용하려면 해당 정보를 앱의 manifest에 등록하고, 액티비티 라이프사이클을 적절하게 관리해야 한다

Manifest 설정

1.  Activity 선언

  • 액티비티를 선언하기 위해선 manifest 파일에 activity 태그를 application 태그의 자식태그로 넣어야 한다.
  •  android:name 속성 :  activity 태그는 해당 속성이 무조건 있어야 한다. 해당 속성은 액티비티의 class Name을 명시한다.
  • activity 태그에 label, icon, UI theme 등의 액티비티 특징을 정의하는 속성들을 추가할 수 있다. 
  • 앱 배포 후에는 액티비티 이름을 바꿀 수 없다. 이름을 바꿀 경우 사용자가 앱의 특정 기능에 빠르게 접근하고 실행할 수 있도록 하는 기능 등에서 기능성에 문제가 생길 수 있다. 그 외의 바꿀 수 없는 것들 참고 링크 : https://android-developers.googleblog.com/2011/06/things-that-cannot-change.html
<manifest ... >
  <application ... >
      <activity android:name=".ExampleActivity" />
      ...
  </application ... >
  ...
</manifest >

 

2. Intent Filter 선언

  • 인텐트 필터는 안드로이드 플랫폼에서 아주 강력한 기능 중 하나이다.
  • UI 상에서 특정 작업을 수행할 어떤 앱을 사용할지 묻는 경우가 Intent Filter 작동하는 경우이다.
  • 명시적 요청과 암시적 요청에 기반해 액티비티 시작 가능
    • 명시적 요청  ex) 지메일 앱에서 EmailActivity를 시작하라고 시스템에 지시
    • 암시적 요청 : 작업을 수행할 수 있는 모든 액티비티에서 이메일 보내기 화면을 시작하라"고 시스템에 알림
  • 액티비티 태그 자식 태그로 선언해야 한다.
<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>
  • 인텐트 필터의 자식 태그는 액티비티가 응답할 수 있는 인텐트 유형을 지정하는 데 사용한다.
    • <action> : 인텐트 필터가 필수적으로 하나 이상 가져야 할 자식 태그
      • 표준 : android.intent.action.액션이름 으로 작성
      • 사용자 정의 : 패키지 경로.액션이름 ex) com.example.project.액션이름
    • <category> : 인텐트 필터의 카테고리 이름 명시
      • 표준 : android.intent.category.카테고리이름 으로 작성
      • 사용자 정의 : 패키지 경로.카테고리이름 ex) com.example.project.카테고리이름
    • <data> : 인텐트 필터의 데이터를 명시
    • * 인텐트 관련해서는 추후 https://developer.android.com/guide/components/intents-filters 해당 링크를 참고해 더 자세히 블로그에 다시 정리할 예정
  • activity의 intent 호출하는 법
val sendIntent = Intent().apply {
    action = Intent.ACTION_SEND
    type = "text/plain"
    putExtra(Intent.EXTRA_TEXT, textMessage)
}
startActivity(sendIntent)
  • 앱이 외부 앱에 의해 호출되지 않고 자체적으로만 활성화되기를 원한다면 해당 액티비티에는 인텐트 필터가 필요없다.

3. Permission 선언

  • manifest의 activity 태그를 앱의 특정 액티비티를 실행하기 위한 용도로 사용할 수 있다.
  • manifest에서 부모, 자식 두 액티비티가 동일한 permission을 갖고 있지 않는다면 부모 액티비티는 자식 액티비티를 실행할 수 없다. 그래서 만약 부모 액티비티가 android:permission 속성을 통해 권한을 선언한다면 자식 액티비티에도 android:permission 속성을 통해 권한을 선언해 동일한 권한을 선언해줘야 한다.
  • 앱 전체에 대한 허용 권한 설정 시  아래 태그를 사용해 설정한다.
<uses-permission android:name="권한경로.권한이름" />

Lifecycle 관리

  • activity 자체의 수명주기 동안 액태비티는 다양한 상태를 거친다. 상태들의 전환을 위해 여러 개의 callback 함수들을 사용한다.
  • callback 함수 종류
    • onCreate() 
      • 액티비티를 생성시 이 콜백 함수가 반드시 호출되어야 한다. 
      • 해당 함수 안에서 액티비티의 필수 구성 요소들을 초기화해야 한다.
      • 뷰를 생성하거나 리스트에 데이터를 연결하는 작업 등을 한다.
      • 중요! 해당 함수 안에서 setContentView() 함수를 사용해서 액티비티의 UI의 레이아웃을 정의해야한다.
      • 해당 함수가 끝나고 다음 콜백함수는 항상 onStart() 콜백 함수이다.
    • onStart()
      • onCreate()가 끝나면 액티비티는 시작 상태로 진입하며 유저에게 보이기 시작한다. 
      • 해당 콜백 함수는 액티비티가 화면 상단으로 나오고 상호작용이 가능해지기 전의 마지막 준비 작업이 포함되어 있다.
    • onResume()
      • 액티비티가 유저와 상호작용하기 직전에 해당 콜백함수를 호출한다.
      • 호출 시 액티비티는 액티비티 스택의 맨위에 위치해 있으며 모든 사용자의 입력을 포착한다. 
      • 대부분의 앱의 핵심적인 기능은 해당 콜백 함수에서 구현된다.
      • onPause() 콜백은 항상 onResume() 다음에 호출된다.
    • onPause()
      • 시스템은 액티비티가 포커스를 잃고 일시 중지된 상태로 전환될 때 onPause()를 호출한다.
      • 이 상태는 사용자가 뒤로가기 또는 최근 앱 버튼을 탭하는 경우와 같이 발생한다.
      • 시스템이 액티비티에 대해 onPause()를 호출한다는 것은 기술적으로 액티비티가 여전히 부분적으로 보이지만 대부분의 경우 사용자가 액티비티를 떠나고 액티비티가 곧 중지된 상태 또는 재개된 상태로 전환될 것을 나타낸다.
      • 일시 중지된 상태의 액티비티는 사용자가 UI 업데이트를 기대하는 경우 UI를 계속 업데이트할 수 있다. ex) 내비게이션 지도 화면, 영상 플레이어 등
      • onPause()를 사용하여 애플리케이션 또는 사용자 데이터를 저장하거나 네트워크 호출 또는 데이터베이스 작업을 하면 안된다. 
      • onPause()의 실행이 완료되면 다음 콜백함수는 액티비티가 일시 중지된 상태에서 어떤 일이 발생하는지에 따라 onStop() 또는 onResume() 함수를 호출 할 수 있다.
    • onStop()
      • 액티비티가 사용자에게 더 이상 보이지 않을 때 onStop()을 호출
      • 액티비티가 파괴되고 있는 경우, 새로운 액티비티가 시작되고 있는 경우, 또는 기존 액티비티가 다시 재개되어 중단된 액티비티를 덮고 있는 경우 해당 함수 호출한다. 앞서 말한 모든 경우를 통해 중단된 액티비티는 더 이상 화면에 보이지 않는다.
      • 해당 함수의 다음 콜백 함수는, 액티비티가 사용자와 상호작용하려고 다시 돌아가는 경우에는 onRestart() 콜백 함수를 호출하고, 액티비티가 완전히 종료되는 경우에는 onDestroy() 콜백 함수를 호출한다.
    • onRestart()
      • 액티비티가 재시작하기 직전 중단 상태일 때 해당 함수를 호출한다.
      • 액티비티의 상태를 중지되기 이전의 상태로 복원하는 역할을 한다.
      • onRestart() 콜백은 항상 onStart() 다음에 호출된다.
    • onDestroy()
      • 이 콜백 함수는 액티비티가 파괴(액티비티가 더 이상 필요하지 않거나 메모리 관리 등의 이유로 시스템에 의해 완전히 종료) 되기 전에 호출된다.
      • 해당 함수는 액티비티가 받는 마지막 콜백 함수이다.
      • 일반적으로 액티비티나 해당 액티비티를 포함하는 프로세스가 파괴될 때 액티비티의 모든 리소스가 해제되도록 보장하기 위해 구현된다.
 
 

참고

Comments