Android 34

액티비티 (8) : 최근 사용한 앱 화면

최근 사용한 앱 화면(이하 최근 앱 화면)은 가장 최근에 액세스한 액티비티와 태스크가 나열된 시스템 수준 UI이다. 이 목록을 탐색해서 태스크를 재개하거나 스와이프로 제거할 수 있다. 최근 앱 화면은 문서 중심 모델(안드로이드 5.0에 추가됨)을 사용한다. 이 모델은 같은 액티비티의 여러 개의 인스턴스(서로 다른 내용을 포함)가 최근 앱 화면에 태스크로 표시되도록 한다. 예를 들어 구글 드라이브는 여러 문서에 대해 각각 태스크를 가질 수 있다. 각 문서가 최근 앱 화면에 태스크로 표시된다. 다른 일반적인 예로 브라우저를 사용할 때 공유 > Gmail을 탭하면 Gmail 앱의 메일 작성 화면이 표시된다. 이때 최근 앱 버튼을 탭하면 브라우저와 Gmail 앱의 태스크가 분리되어 있다는 것을 알 수 있다. 일..

Android 2022.05.13

액티비티 (7) : Parcelable과 Bundle

액티비티 간 데이터 전송 startActivity()로 새 액티비티를 시작할 때 전달할 Intent 객체를 생성할 때 putExtra()를 사용하여 파라미터를 전달할 수 있다. 다음과 같이 사용할 수 있다. val intent = Intent(this, NewActivity::class.java).apply { putExtra("media_id", "a1b2c3") } startActivity(intent) OS는 인텐트 안의 Bundle을 포장하고 나서 새 액티비티를 생성하고 데이터를 다시 푼 다음 새 액티비티에 인텐트를 전달한다. Intent 객체에 원시 타입 데이터를 저장할 때에는 Bundle을 사용하는 것을 권장한다. Bundle 클래스는 Parcel을 사용하는 마셜링/언마셜링 작업에 매우 최적화..

Android 2022.05.13

액티비티 (6) : 프로세스와 앱 수명 주기

안드로이드 앱은 대부분 자체 리눅스 프로세스에서 실행된다. 이 프로세스는 앱의 코드가 실행되어야 할 때 생성되고, 더 이상 필요하지 않으면서 시스템이 다른 앱을 위해 메모리를 회수해야 할 때까지 계속 실행된다. 앱 프로세스의 수명은 앱 자체가 아니라 시스템이 제어한다. 시스템이 실행 중인 것으로 파악하는 앱의 요소, 사용자에게 있어 요소의 중요도 및 시스템이 사용 가능한 메모리 양 등에 기반하여 결정된다. 앱 개발자는 다른 앱의 컴포넌트가 어떻게 자신의 앱에 영향을 미치는지 이해해야 한다. 이 컴포넌트들을 올바르게 사용하지 않으면 앱이 중요한 작업을 수행하는 도중 시스템이 앱의 프로세스를 종료할 수 있다. 프로세스 수명주기 버그의 일반적인 예로 브로드캐스트 리시버를 들 수 있다. BroadcastRece..

Android 2022.05.12

액티비티 (5) : 태스크와 백 스택

태스크는 사용자와 상호작용하는 액티비티의 모음이다. 각 액티비티는 스택(백 스택)에 열린 순서대로 정렬된다. 예를 들어 이메일 앱에서 메시지 목록을 표시하는 액티비티가 있고 메시지를 선택하면 이를 표시하는 새 액티비티가 열린다고 하자. 이 새 액티비티는 백 스택에 추가된다. 그러고 나서 사용자가 뒤로 돌아가는 동작을 취하면 새 액티비티가 종료되고 백 스택에서 pop된다. 태스크의 수명주기와 백 스택 디바이스의 홈 화면은 대부분의 태스크의 시작 지점이다. 사용자가 앱 아이콘이나 앱 런처(또는 홈 화면)의 바로가기를 터치하면 해당 앱의 태스크가 포그라운드로 나온다. 해당 앱에 대한 태스크가 없다면 새 태스크가 생성되고 앱의 메인 액티비티가 백 스택에 루트 액티비티로서 열린다. 현재 액티비티가 다른 액티비티를..

Android 2022.05.11

액티비티 (4) : 액티비티 테스트

액티비티는 앱 내 모든 사용자 상호작용의 컨테이너로 사용되므로 디바이스 수준 이벤트가 발생했을 때 액티비티가 어떻게 동작하는지 테스트하는 것이 중요하다. 해당 디바이스 수준 이벤트는 다음과 같다. 다른 앱이 앱의 액티비티를 방해한다. 시스템이 액티비티를 소멸시키고 재생성한다. 사용자가 액티비티를 PIP/멀티 윈도우 모드와 같은 새 윈도우 처리 환경에 배치한다. 특히 액티비티가 수명 주기 포스팅에서 설명한 이벤트에 올바르게 동작하도록 하는 것이 중요하다. 이 가이드에서는 앱이 수명주기 상태가 전환될 때 데이터 통합과 뛰어난 UX를 유지하는 능력을 평가하는 방법을 설명한다. 액티비티 상태 변경 액티비티 테스트의 가장 중요한 측면 중 하나는 앱의 액티비티를 특정 상태에 배치하는 것이다. 이러한 "특정 요소"를..

Android 2022.05.09

액티비티 (3) : 액티비티 상태 변화 관리

구성 변경 발생 구성 변경을 발생시키는 이벤트가 몇 가지 존재한다. 아마 가장 널리 알려진 것은 화면 회전일 것이다. 다른 예로는 언어 변경 및 디바이스 입력 등이 있다. 구성 변경이 발생하면 액티비티는 소멸된 후 재생성된다. 원래의 액티비티 인스턴스에서는 onPause(), onStop(), onDestroy()가 실행되고 새 인스턴스가 생성되어 onCreate(), onStart(), onResume()이 실행된다. ViewModel, onSaveInstanceState(), 영구 로컬 저장소를 조합해서 사용하면 구성 변경이 발생했을 때 액티비티의 UI 상태를 보존할 수 있다. 이들을 조합하는 방법은 UI 데이터의 복잡도, 앱의 사용 사례, 메모리 사용 대비 검색 속도에 따라 달라진다. 멀티 윈도우 ..

Android 2022.04.08

액티비티 (2) : 액티비티의 수명 주기

액티비티의 전체 수명주기 동안 여러 상태를 거친다. 상태가 바뀔 때마다 일련의 콜백 메서드를 사용할 수 있다. 수명주기 콜백을 잘 구현해야 앱의 크래시나 리소스 낭비 등을 방지할 수 있다. Activity 클래스가 제공하는 6가지 핵심 콜백은 다음과 같다. onCreate() 액티비티 상태: 생성됨 시스템이 액티비티를 생성할 때 한 번만 호출되는 콜백. 수명주기 동안 한 번만 발생하는 앱 시작 로직(뷰 초기화 / UI 레이아웃 정의 등)을 구현해야 한다. onCreate()는 savedInstanceState라는 파라미터를 받는데 이는 액티비티의 이전 상태가 저장된 Bundle 객체이다. 처음 생성된 액티비티의 경우 savedInstanceState의 값은 null이다. onCreate()가 완료되면 액..

Android 2022.04.08

액티비티 (1) : 액티비티 만들기

액티비티는 앱에서 단일 화면 UI를 제공하는 컴포넌트이다. 대부분의 앱은 여러 개의 액티비티를 포함한다. 매니페스트 구성하기 액티비티를 사용하려면 매니페스트 파일에 액티비티와 그의 몇 가지 속성을 선언해야 한다. 액티비티 선언하기 액티비티를 선언하려면 매니페스트 파일의 태그 안에 태그를 추가해야 한다. ... ... android:name은 유일한 필수 속성이며 이는 액티비티의 클래스 이름을 지정한다. 이외에는 라벨, 아이콘, UI 테마처럼 액티비티 특성을 지정하는 속성을 정의할 수 있다. 인텐트 필터 선언하기 암시적 인텐트를 수신하려면 태그 안에 태그를 추가해야 한다. 이 태그는 , , 태그를 포함할 수 있다. 아래 예시는 액티비티가 텍스트 데이터를 전송하도록 구성한 것이다. 위 예시의 액티비티를 호출..

Android 2022.04.06

인텐트 (2) : 보류 인텐트

펜딩 인텐트는 내장된 인텐트를 외부 앱에서 실행되도록 하기 위해 사용한다. 주요 사용 사례는 다음과 같다. 사용자가 알림/앱 위젯으로 액션을 수행할 때 실행되는 인텐트를 선언 향후 지정된 시간에 실행되는 인텐트를 선언 펜딩 인텐트를 생성할 때는 다음 메서드 중 하나를 사용한다. getActivity() 액티비티를 시작하는 인텐트 생성 getService() 서비스를 시작하는 인텐트 생성 getBroadcast() 브로드캐스트 리시버를 시작하는 인텐트 생성 각 메서드는 현재 앱의 컨텍스트, 실행할 인텐트, 인텐트의 사용 방식을 나타내는 플래그 값을 인자로 받는다. 가변성 설정하기 앱이 안드로이드 12 이상 버전을 타겟팅할 경우 각 PendingIntent 객체에 다음 두 플래그로 가변성을 설정해야 한다. ..

Android 2022.04.05

인텐트 (1) : 인텐트와 인텐트 필터

인텐트는 컴포넌트에 작업을 요청할 때 사용하는 메시징 객체이다. 인텐트가 컴포넌트와 통신하는 방법은 다양하지만 기본적인 용도는 다음과 같다. 액티비티 시작 startActivity()에 Intent 객체를 전달하여 새 액티비티를 시작한다. 시작한 액티비티가 종료될 때 결과를 수신하려면 대신 startActivityForResult()를 호출한다. 서비스 시작 startService(Intent)로 서비스를 시작한다. 서비스를 다른 컴포넌트에 바인딩하려면 bindService()에 Intent 객체를 전달한다. 브로드캐스트 전달 sendBroadcast() 또는 sendOrderedBroadcast()에 Intent 객체를 전달하여 다른 앱에 브로드캐스트를 전달한다. 인텐트 유형 인텐트는 두 유형으로 분류..

Android 2022.04.04