📌 UI 화면을 나타내는 액티비티
💜 액티비티 (Activity)
- 사용자가 바라보는 인터페이스 화면을 가지고 있는 요소
- Activity_main.xml과 같은 레이아웃 파일로 구성
💜 메인 스레드 (UI 스레드)
- 눈에 보이지는 않지만 액티비티를 제어하는 통제 센터와 같은 역할 (Start/Stop Activity)
- 메인 스레드가 액티비티 구동 -> 액티비티는 뷰를 그림
💜 뷰 (View)
- 보이지 않는 레이아웃 요소 : 화면 배치 등
- 보이는 요소 : 텍스트 박스, 버튼 등 위젯 (Widget)
class MainActivity : AppCompatActivity() { // 상위의 Activity 클래스로부터 상속
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) // UI 화면을 나타내는 xml을 해석
}
}
💌 액티비티의 생명주기
콜백 함수 : 메인 스레드의 명령 이벤트에 따라 호출
- onCreate( ) : 액티비티 생성 시 호출, 반드시 구현
- setOnCreateView( ) : 레이아웃 지정하여 화면 그리기
- onPause( ) : 일시중단. 다른 것에 의해 앱이 가려졌을 때 호출
- onResume( ) : 다시 시작
- onDestroy( ) : [Back]키 연속 눌러서 백 스택의 액티비티 없으면 호출 / 리소스 부족하면 시스템 강제 종료
- onSaveInstanceState( ) / onRestoreInstanceState( ) 오버라이딩 : 강제 종료 시 상태를 저장 복구
💌 프래그먼트의 생명주기
프래그먼트 : 화면의 작은 단위
- onAttach( ) : 액티비티에 프래그먼트 추가
- onDetach( ) : 제거
- onCreateView( ) : 프로그램 실행 중간에 UI를 구성하는 View를 반환
- onActivityCreated( ) : 완전히 UI 구성된 다음 나머지 동작 코드 구성
💬 lateinit 사용
- 각 콜백 함수 호출 시기 정해져있지 않으므로 특정 UI 사용 시 유용
class MainActivity : AppCompatActivity() {
// 알람 시스템 서비스의 선언
lateinit var alarmManager: AlarmManager
// 앱의 생명주기 (생성 시 호출되는 콜백 함수)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
alarmManager = getSystemService(AlarmManager::class.java) // 지연 초기화 시점
}
}
- getSystemService( )는 안드로이드 프레임워크의 시스템 서비스를 서로 연결하기 위한 API로 시스템 서비스 중 AlarmManager::class.java를 가리킴
❓ 시스템 서비스란?
- 네트워크, 알람, 디스플레이, 위치 등의 서비스가 스마트폰이 켜지면 백그라운드에서 구동.
- 이것을 애플리케이션에서 연결하기 위해서 getSystemService( ) 함수 사용.
💬 lazy 사용
class MainActivity : AppCompatActivity() {
private val messageView : TextView by lazy {
// messageView의 첫 접근에서 초기화
findViewById(R.id.message_view) ad TextView
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
onSayHello()
}
fun onSayHello(){
messageView.text = "Hello" // 이 시점에서 초기화됨
}
}
- by lazy{ }는 message_view라는 리소스에 접근할 때 실행
- findViewById( ) 함수 사용하여 R.id.message_view를 찾아 초기화
📌 백그라운드에서 계속 실행되는 서비스
- 서비스(Service)는 눈에 보이지 않는 백그라운드에서 실행
- 메인 스레드가 제어
- 애플리케이션(프로세스)내에 있으면 startService( )/stopService( )로 시작/중단
- 다른 프로세스에 있으면 xxxManager 역할하는 중간 매개채(Proxy)의 서비스 거쳐 AIDL통해 원격 서비스에 명령 내림
- Parcel을 통해 필요 데이터 전달
- bindService( ) '붙인다'/ unbindService( ) '떼어낸다'로 사용/중단
- 바인더(Binder) : 두 프로세스 간의 메시지를 전달
- AIDL(Android Interface Definition Language) : 통신에 사용하는 인터페이스를 만들기 위한 정의언어
- 한번 시작된 서비스는 앱이 종료되고 다른 앱으로 이동해도 계속 백그라운드에서 실행될 수 있음
📌 방송 수신자 (Broadcast Receiver)
- 안드로이드에서 발생하는 다양한 이벤트 및 정보를 받고 전달
📌 콘텐츠 제공자 (Content Provider)
📌 인텐트 (Intent)
- 안드로이드 4대 요소 간에 메시지를 전달
- 명시적 인텐트 : 특정 클래스를 지정
- 묵시적 인텐트 : 특정 데이터에 대해 수행할 액션을 지정
(여러 개의 연관된 요소를 호출할 수 있는 장점)
📌 핸들러와 메시지 큐
- 앱 실행시 메인 스레드에서 메시지 큐(Message Queue)와 루퍼(Looper)가 항상 자동 생성됨
- UI 요소 갱신/변경은 오로지 메인 스레드를 통해서만 변경해야 함