Android/Basic

Android/Basic

[Android] Thread와 Handler

안드로이드의 ANR은 메인스레드로 긴 작업이 지속될 경우에 다른 이벤트가 들어오면 처리되지 않는다는 문제를 가진다. 이를 해결하기 위해 프로그램을 멀티스레드(여러 개의 스레드)로 작성하는 방안이 존재한다. → 비동기적 처리 방식 비동기적 처리의 다른 방식으로는 AsyncTask, Coroutine이 존재한다. ※ Thread-Handler와 AsyncTask는 현재 공식 Deprecation 된 상태이므로 비동기적 처리를 구현할 때 Coroutine 사용을 권장한다. 메인스레드(Main Thread) 애플리케이션은 성능을 위해 멀티스레드를 많이 활용하지만, UI를 업데이트하는 데는 단일 스레드 모델이 적용된다. 멀티 스레드로 UI를 업데이트하면 동일한 UI 자원을 사용할 때 교착 상태(deadlock),..

Android/Basic

[Android] ANR

ANR Activity Not Response의 약어로 액티비티에서 발생하는 에러 상황을 뜻한다. ANR을 고려하지 않고 앱을 만들면 애플리케이션이 에러에 의해서 수시로 종료될 가능성이 있다. 이 ANR은 유저 이벤트에 액티비티가 5초 이내에 반응하지 못하는 경우 발생하며, 앱이 포그라운드에 있으면 아래와 같이 시스템에서 사용자에게 다이얼로그를 표시한다. ANR이 일어나는 상황 유저가 이벤트를 주었을 때, 이벤트는 메시지 큐에 담기게 되고 시스템 내부에서는 메시지 큐에서 이벤트를 추출하여 해당 업무를 수행한다. 이때, 유저 이벤트에 의해서 이벤트가 큐에 담기는 순간부터 5초 이내에 이 이벤트가 처리되지 않으면 시스템에서 강제적으로 해당 액티비티를 종료시키게 된다. → ANR이 발생 메시지 큐(Messag..

Android/Basic

[Android] Intent

Intent 컴포넌트를 실행하기 위해 시스템에 전달하는 메시지 객체로 기능을 수행하는 함수를 제공하지 않고 데이터를 담는 클래스이다. 이 객체를 통해 다른 컴포넌트 간에 정보를 주고받을 수 있다. (컴포넌트 간의 통신을 맡고 있음) 또한, 인텐트는 앱 내에서 메시지를 전달함에 그치지 않고 외부 앱의 컴포넌트와 연동할 때도 사용한다. 안드로이드의 컴포넌트 클래스는 시스템에서 라이프사이클을 관리하기 때문에 개발자가 코드에서 직접 생성해 실행할 수 없다. 이에 컴포넌트를 실행하기 위해서는 Intent를 시스템에 전달하여 시스템에서 컴포넌트를 실행해야 한다. 액티비티 등 안드로이드 컴포넌트를 manifest에 등록하는 것도 Intent가 시스템에 요청하여 해당 컴포넌트를 실행하기 때문이다. 인텐트가 주로 사용되..

Android/Basic

[Android] Activity와 Fragment의 Lifecycle

액티비티와 프래그먼트는 시작되고 종료되는 시점까지 각각의 생명주기 즉, Activity Lifecycle, Fragment Lifecycle을 갖는다. 이 주기 안에서 액티비티와 프래그먼트는 각각의 상태가 계속해서 바뀌게 된다. 예를 들어, 안드로이드 앱이 실행된 후 다른 화면으로 전환되거나, 화면이 꺼짐, 폰 상태바를 내려서 화면이 가려짐, 혹은 앱이 종료될 때 등의 상황에서 상태 변화가 일어난다. 안드로이드 프레임워크에서는 액티비티/프래그먼트의 상태가 변화할 때마다 특정 동작을 수행할 수 있도록 여러 콜백 메서드를 제공한다. 이를 Lifecycle Callback Method라고 하며, 콜백 메서드의 구현을 통해 상태 변화로 일어나는 다양한 문제를 예방하고 앱이 보다 안정적으로 동작하게 할 수 있다...

Android/Basic

[Android] Activity와 Fragment

Activity와 Fragment는 안드로이드에서 View를 보여주기 위한 Container 역할을 하는 두 개의 클래스이다. Activity 액티비티는 사용자가 애플리케이션과 상호작용하는 부분이며, UI를 그리는 컨테이너 역할을 제공한다. 대부분의 앱은 여러 액티비티로 구성되지만 일반적으로 앱의 활동 간에는 최소한의 종속성만 존재한다. • 일반적으로 한 액티비티는 하나의 화면을 구현함 • 액티비티는 화면을 가득 채우지만 화면보다 작거나 다른 창 위에 떠 있을 수도 있음 • 액티비티는 다중 화면 UI를 만들 수 없기 때문에 다중 화면 UI를 만들기 위해서는 프래그먼트를 사용해야 함 Fragment 프래그먼트는 다양한 화면 구성을 위한 앱 UI 재사용을 위해 설계되었다. 여러 개의 프래그먼트를 하나의 액티..

Android/Basic

[Android] Android 4대 컴포넌트

Android 앱은 컴포넌트(Activity, Service, Broadcast Receiver, Content Provider)들로 구성되어 있다. 각 컴포넌트들은 하나의 독립적인 형태로 존재하며, 고유의 기능을 수행한다. 이 컴포넌트들은 인텐트를 통해 서로 상호작용한다. Intent: 메시지 객체로 이 객체를 통해 다른 컴포넌트끼리 정보를 주고 받을 수 있다. Activity 사용자가 애플리케이션과 상호작용하는 단일 화면을 담당하는 컴포넌트를 의미한다. 모든 안드로이드 애플리케이션은 액티비티로 구성되어 있다. 즉, 액티비티는 사용자와 상호작용을 담당하는 인터페이스라고 할 수 있다. 보통 앱은 여러 화면으로 구성되어 있어 여러 액티비티로 구성되어 있다고 할 수 있다. 예를 들어 앱을 시작할 때 나오는 ..

Android/Basic

[Android Kotlin] SQLiteDatabase - insert, update, delete, query

SQL문 실행 방법 execSql(), rawQuery() 함수 사용 -> 개발자가 sql 문을 직접 만든다. insert(), update(), delete(), query() 함수 사용 -> 개발자가 직접 sql문을 작성하는 것이 아니라 sql문에 해당하는 정보만 제공해 준다. ContentValues insert, update를 위한 칼럼 데이터 집합 객체 Map 객체처럼 키-값 형태로 데이터 여러 건을 ContentValues에 등록한다.

Android/Basic

[Android Kotlin] SQLiteDatabase - execSql, rawQuery

SQLiteDatabase SQLite를 이용하기 위한 최소한의 API SQLiteDatabase를 획득하는 방법 openOrCreateDatabase() 함수를 이용해 획득 SQLiteOpenHelper 객체를 이용해 획득 execSql() 함수 select를 제외한 sql문을 실행시키기 위해 사용 rawQuery() 함수 select문을 실행시키기 위해 사용 함수의 return 값은 Cursor 객체(select 된 row의 집합 객체)이며, 특정 칼럼의 데이터를 뽑아내기 위해서는 Cursor 객체를 움직여 row를 선택하고 선택된 row의 column data를 획득해야 한다.

Android/Basic

[Android Kotlin] SQLiteOpenHelper

안드로이드에서 데이터베이스를 이용하기 위해서는 SQLiteDatabase 객체 이용은 필수이다. SQLiteOpenHelper SQLiteOpenHelper 클래스는 앱을 위한 데이터베이스 관리적인 코드를 추상화시킬 목적을 가지고 있다. *관리적인 코드: 데이터베이스에 테이블을 create 하거나 alter 혹은 drop을 하기 위한 코드 SQLiteOpenHelper 클래스를 상속받아 작성한다. 클래스의 매개변수에 파일명(두번째 매개변수), 데이터베이스 버전 정보(마지막 매개변수) 등을 작성해 주어야 한다. *데이터베이스 버전 정보는 바뀌는 순간에 내부적으로 감지가 이루어짐 꼭 오버라이드 받아야 하는 함수들이 존재한다.

Android/Basic

[Android Kotlin] 데이터 저장/액세스 - SQLite

SQLite 오픈소스로 만들어진 관계형 데이터베이스 안드로이드 폰에 내장되어 있는 데이터베이스이다. 복잡하고 구조화된 애플리케이션 데이터 저장 및 관리를 담당한다. (SharedPreference는 키-값으로 데이터를 저장하기 때문에 대량의 데이터를 저장하기에는 부적절하며, 데이터를 구조화하기 부적절한데 SQLite는 이를 해결할 수 있다.) SQLite Database 특징 SQLite Database는 별도의 프로세스가 아닌 라이브러리를 이용한다. 데이터베이스는 생성한 애플리케이션의 일부로 통합된다. -> 커넥션이라는 개념이 없음 SQLite를 이용한 데이터는 파일에 저장되며 /data/data//databases 폴더에 저장된다. (내장 메모리 공간에 저장됨) 로컬에 데이터베이스가 필요한 이유 데이..

jeonge
'Android/Basic' 카테고리의 글 목록 (2 Page)