엑티비티 (Activity)
서비스 (Service)
브로드캐스트 리시버 (Broadcast Receiver)
콘텐트 프로바이더 (Content Provider)
앱을 만들기 위해서는 프로젝트를 생성해야 된다.
File > New > New Project
문서를 작성할 때 '빈 문서'에서 작성하듯 Empty Views Activity를 선택하여 빈 엑티비티를 실행해준다.


패키지(package) : 앱의 고유 아이디 값이며, 출시를 목적으로 한다면 example을 회사명으로 변경하여 작성
naver.com (서비스 도메인) -> com.naver.hyelan (패키지명)
구글 플레이 스토어에 해당 버전의 전체 사용자의 %를 지원하는지 확인하여 설정
Kotlin DSL은 가독성 좋고 간략한 코드를 사용하는 코틀린의 언어적인 특징을 사용하여 Gradle 스크립팅을 하는 것을 목적으로 하는 DSL
MainActivity.kt 열면 기본적으로 생성되는 구문이 있다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_main)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
그 중, enableEdgeToEdge()와 ViewCompat.setOnApplyWindowInsetsListener()이 생성되는 사람도 있고 없는 사람도 있을 것이다. 이 두 구문을 지워서 사용하여도 무방하나 어떤 역할을 하고 있는지 알아보자.
enableEdgeToEdge()는 statusBar(상단의 시계와 카메가 있는 부분)를 투명하게, navigationBar(하단의 홈버튼이 있는 부분)에 색깔을 지정하는 역할이다

enableEdgeToEdge() 사용

enableEdgeToEdge() 미사용
inset은 statusBar, navigationBar의 여백 처리를 해주는 역할이다.

ViewCompat.setOnApplyWindowInsetsListener() 사용

ViewCompat.setOnApplyWindowInsetsListener() 미사용
만약, 화면 최하단 및 상단에 어떠한 위젯을 만들었을 때 해당 위젯을 실행하려고 해도 statusBar, navigationBar와 겹치게 되어 실행이 되지 않는 상황이 발생할 수 있다.
즉, inset은 enableEdgeToEdge() 속성 때문에 생겨난 코드라고 할 수 있다.
모든 프로그램은 Entry Point(프로그램 시작점, 진입점)를 가지고 있는데 안드로이드 같는 경우 manifests에 지정되어 있다.

앱을 처음 만들면 MainActivity가 생성되고, manifests에 MainActivity 태그가 만들어진다.
<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>
intent-filter로 action.MAIN이 지정되어 있는데 이를 안드로이드의 시작 지점임을 알린다. 그리고, MainActivity의 onCreate 메서드가 시작점이 된다.
마찬가지로, Activity를 추가로 만들면 manifests에 추가한 Activity 태그가 생성되지만 intent-filter가 없음을 확인할 수 있다.
<activity
android:name=".Text2Activity"
android:exported="false" />
<activity
android:name=".Text1Activity"
android:exported="false" />
<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>
만약, intent-filter를 다른 Activity에 넣어주면 그 Activity가 진입점이 된다.
액티비티는 화면에 표시되고 종료될 때까지 라이플 사이클이 존재한다.

A액티비티가 실행되고 B액티비티를 호출하면, A액티비티는 화면에 보이지 않게 되면서 다운로드 하던 것을 멈춰야 되는 등의 이벤트를 처리할 상황이 존재하기 때문에 액티비티의 수명이 존재한다.
액티비티의 Visibility 구간 <onStart() ~ onStop()>
: 여러번 호출 가능하며, 사용자에게 보여줬다 숨겼다 함액티비티가 foreground에서 동작하는 구간 <onResume() ~ onPause()>
: 사용자 입력이 집중되어 모든 액티비티 앞에 표시
액티비티가 생성되면서 해제될 때 까지 액티비티의 상태에 따라서 불려지는 메소드를 라이프 사이클 콜백 메소드라 부르며, 액티비티 전환 시 호출 순서는 다음과 같다.

주요 콜백 메소드인 onPause()는 사용자가 액티비티를 떠날 때 호출되는데, 액티비티가 완전히 소멸하는 것은 아니지만 사용자가 돌아오지 않을 수 있기 때문에 그 동안 이루어졌던 변경사항 등을 저장한다.
최종 수정일 24.04.11