Android 19

[Android] Service 의 타입과 사용법 그리고 권장사항

[서비스란?] 안드로이드 앱 4대 컴포넌트 중하나이다. 즉 앱 프로세스의 진입점 중 하나이다. (유저가 앱과 상호작용하고 있지 않아도) 백그라운드에서 길게 실행되는 연산들을 수행할 수 있다. (Activity 와는 다르게 UI 제공 x) 그러니 어플리케이션이 실행 중이지 않을 때도 ((아마) 앱 프로세스를 강제 종료 하지 않는 한) 작업해야하는 경우 서비스를 사용. (어플리케이션이 실행 중일 때만 작업해야하는 경운 스레드권장) 다른 앱으로 이동해도 한동안 실행을 지속할 수 있다. 한 컴포넌트와 bind 하여 소통할 수 있고, IPC(interprocess communication) 도 가능 주의할 점은 위 설명에서 백그라운드라는 말이 나왔다고 해서 서비스가 메인스레드(UI스레드) 외의 다른 스레드에서 작..

[Android/Kotlin] Intent 에 커스텀 객체 전달하기? 직렬화, 역직렬화 Serializable 과 Parcelable, @Parcelize

[시작하며 (반성)] 한 화면에서 다른 화면으로 이동할 때 데이터를 전달하려고하는 데, Primitive type 이 아닌 내가 만든 data class(디자인 패턴을 관점에서는 POJO 클래스, Model) 을 통째로 전달하고 싶을 수 있다. 액티비티 객체는 안드로이드 시스템에서 관리하는 컴포넌트로 데이터 전달에는 Intent 를 사용하기 때문! 그리고 최근에 Jetpack navigation 으로 프로젝트를 진행해왔는데, navigation 라이브러리에서도 Serializable 과 Parcelable 을 지원해서 Fragment 간 객체를 전달할 수 있었다. Serializable 과 Parcelable 의 개념을 안드로이드 공부 시작하고 초반에 접하고 따로 더 공부한 적이 없이 자연스레 사용해서 ..

[Android/Kotlin] startForActivityForResult 가 Deprecated 라고? Activity Result APIs 를 써보자

[시작 전 반성] 한동안 Jetpack navigation 을 사용해서 프로젝트를 진행해서 startForActivityForResult 가 Deprecated 인지 몰랐다. (알게된 건 작년 여름쯤) Deprecated 라는 것은 더이상 개발되지 않고 사라질 수 있으니 사용을 지양하라는 의미로 알고 있어서 대체제를 찾았다. 찾아보니 Activity 를 시작하고 값을 받아오는 기능 뿐만 아니라 Permission 을 받아오는 기능을 깔끔한 콜백코드로 대체할 수 있어서 좋았다. 프로젝트에 치여 기록을 잊지말자는 반성으로 쓰기 시작해야겠다. 활동에서 결과 가져오기 | Android 개발자 | Android Developers 활동에서 결과 가져오기 개발자 앱 내의 활동이든 다른 앱의 활동이든 다른 활동을 시..

[Android] Hilt 의 다양한 어노테이션을 알아보자

[DI 가 무엇인지 모른다면?] 아래 링크를 먼저 참고하자 [Android] 안드로이드의 DI (Dependency Injection) [DI 개념과 필요한 이유] 한 클래스는 다른 클래스를 참조해야하는 일이 빈번하다. (특히 디자인패턴을 다루면서) 예를 들어 Computer 클래스를 실행시키려면 Computer 클래스 내에서 Cpu 클래스 객체 nosorae.tistory.com [Hilt 란?] 힐트는 제트팩에서 권장하는 DI 라이브러리이다. 힐트는 Dagger 위에 구축되어있고 대거 컴포넌트를 만든다. (compile-time correctness, runtime performance, scalability 측면에서 이득) 따라서 힐트 역시 compile-time dependencies, runti..

[Android] 안드로이드의 DI (Dependency Injection)

[DI 개념과 필요한 이유] 한 클래스는 다른 클래스를 참조해야하는 일이 빈번하다. (특히 디자인패턴을 다루면서) 예를 들어 Computer 클래스를 실행시키려면 Computer 클래스 내에서 Cpu 클래스 객체를 참조해야한다고 해보자. 이 상황에서 Computer 클래스가 Cpu 클래스에 의존한다고 한다. 이 방법에는 당장 생각나는 두 가지가 있을 것이다. Cpu 객체를 클래스 내부에서 직접 생성하기 Computer 클래스가 한 타입의 Cpu 객체만 사용해버린다. 즉 서브클래스를 쉽게 사용할 수 없다. 그렇다면 Intel Cpu, AMD Cpu 각각을 사용하는 Computer 클래스를 각각 만들어야 할 것이다. Computer 에서 Cpu 객체를 직접 생성하면 테스트도 어렵게 함 생성자나 메소드 파라미..

[Android] 안드로이드의 Background 작업

Background 작업이 필요할 때! UI 스레드로 실행이 오래걸리는 작업을 진행한다면 UI 블로킹으로 좋지 못한 UX 를 제공할 것이다. 따라서 bitmap 을 디코딩한다든지, 네트워크 요청이나 저장소에 접근 그리고 머신러닝 모델을 동작시키는 등의 무거운 작업을 할 때는 따로 백그라운드 작업이 필요할 것이다. Background 작업의 3 가지 카테고리와 각 2 가지 타입 백그라운드 작업은 기본적으로 아래 세 가지 카테고리로 분류됨 Immediate 당장 실행해야하고 금방 끝나는 작업 Long-running 끝나는 데 시간이 걸리는 작업, 약 10분 이상 Impersistent 권장 x Persistent 권장 o (따라서 WorkManager 사용 권장) ex 청크할 수 없는 큰 파일 다운로드하는 ..

[Android] Activity 의 Life cycle 과 App Life cycle 을 연관지어 생각해보기

본 글은 아래 링크에서 이어지는 글입니다. [Android] 안드로이드의 Processes 와 App Life-cycle 안드로이드 프로세스 관리 기본원리 안드로이드 어플리케이션은 리눅스 프로세스 상에서 동작한다. 프로세스는 앱의 코드가 실행되어야할 때 만들어지고, 더이상 필요하지 않거나 시스템이 다 nosorae.tistory.com [Activity 소개] 안드로이드 앱의 중요한 컴포넌트 중 하나로 유저와 소통하기 위한 시작점이 되어준다. UI 를 그리기 위한 window 를 제공한다. [Activity 관점] 액티비티의 생명주기를 단순 나열하면 다음과 같다. (onCreate - onStart - onResume - onPause - onStop - onDestroy) 위 process 종류 섹션에..

[Android] 안드로이드의 Processes 와 App Life-cycle

안드로이드 프로세스 관리 기본원리 안드로이드 어플리케이션은 리눅스 프로세스 상에서 동작한다. 한 앱 컴포넌트가 시작하고 다른 앱의 컴포넌트가 실행중이지 않으면 안드로이드 시스템은 하나의 스레드 실행과 함께 새로운 리눅스 프로세스를 시작 컴포넌트 실행 시작하려는데 이미 그 앱의 다른 컴포넌트의 프로세스가 존재한다면 같은 프로세스, 같은 스레드에서 실행되는 것이 디폴트 하지만 하나의 앱에 이는 다른 각 컴포넌트를 다른 프로세스, 다른 추가적인 스레드를 만들어서 실행시킬 수 있다. 방법은 매니페스트에 , , , 엔트리를 넣고 android:process 속성값을 주어 각 컴포넌트가 어느 프로세스에서 실행되어야하는지 명시할 수 있다. 프로세스는 앱의 코드가 실행되어야할 때 만들어지고, 더이상 필요하지 않거나 시..

[Android] 도메인(패키지명) 변경에 주의할 점

프로젝트를 진행하다가 도메인 네임을 변경해야할 상황이 생겼다. 프로젝트를 만든지 얼마되지 않았다면 그냥 새로 파서 코드를 옮겨도 되겠지만 이미 상당부분 진행되어서 Refator - Rename 을 눌러서 바꿔주기로 했다. 하지만 작업하는 파일들의 상단에 위치한 만큼 수동으로 손 봐줘야 할 일이 생겼다. 모든 항목을 다 바꿔주지 않았을까 하는 안일한 생각을 했다가 'No matching client found for package name ~ ' 같은 에러나 패키지명이 업데이트 되지 않은 파일들에 대해 'can not find symbols' 같은 에러를 만나게 되었다. 패키지명 바꾸는 방법 Android Studio 좌측 'Project' 탭을 클릭하고 패키지를 클릭후 위 사진에서 module_basic..