분류 전체보기 (34) 썸네일형 리스트형 Lifecycle Activity, Fragment 와 같은 생명 주기를 가진 컴포넌트들은 특정 상황이 되면 Android 프레임워크에서 자동으로 Lifecycle Callback 메서드를 호출해줍니다. Activity 의 각 Lifecycle Callback 메서드에 Log 를 찍어보면 현재 Lifecycle state 가 어떤 지 금방 확인할 수 있지만, 어떤 경로를 통해 Lifecycle 의 state 가 변경되는 지 코드를 통해 분석해보기로 했습니다. 아래의 Activity Lifecycle state 가 업데이트 되는 경로는 앱을 처음 실행하여 MainActivity 가 실행될 때의 경로를 확인한 것입니다. ActivityThread 에서 관찰중인 Looper 에 새로운 Activity 를 실행해달라는 메시지가 .. Fragment 내에 ViewPager 를 사용한 Fragment 호스팅 시 Navigation 문제 상황 AFragment 내에 ViewPager2 를 사용하여 BFragment 를 호스팅하고 있음 BFragment 의 특정 UI 요소를 클릭하면 CFragment 로 navigate 되어야 하는 상황 문제 발생 BFragment 의 UI 요소를 클릭하여 CFragment 로 navigate 하는 순간 java.lang.IllegalArgumentException: Navigation action/destination com.xxx.xxx:id/action_BFragment_to_CFragment cannot be found from the current destination Destination(com.xxx.xxx:id/aFragment) label=AFragment class=com.xxx.xxx... setContentView Android 프로젝트를 생성하면 MainActivity 클래스의 onCreate() 메서드에서 setContentView() 메서드를 호출하는 코드가 기본으로 생성됩니다. setContentView() 메서드가 정확히 어떤 작업을 담당하는 것인지 알지 못한 채 그냥 "setContentView() 메서드에 전달한 Layout 파일이 파싱되고, View 인스턴스가 생성되겠지?" 라고만 생각했었는데, Android 의 View System 에 대해 좀 더 알고 싶어져서 과연 setContentView() 메서드는 내부적으로 어떤 동작을 하는지 분석해보기로 했습니다. 총 9단계로 setContentView() 메서드를 분석하였습니다. 1. MainActivity 가 상속받은 AppCompatActivity .. Jetpack Navigation NavHostFragment Jetpack Navigation 을 사용하여 Fragment 간에 전환하면 NavController 가 적절한 Navigator(예: FragmentNavigator) 를 선택하여 직접 FragmentManager 를 사용하여 FragmentTransaction 을 생성하고 각 Destination(NavBackStackEntry) 을 BackStack 에 push,pop 을 하기 때문에 개발자 입장에서는 굉장히 편리하게 화면 전환을 구현할 수 있습니다. Chapter 01 Navigation Graph 의 각 Destination 을 호스팅하는 NavHostFragment 일반적으로 Jetpack Navigation 을 통해 Single Activity 에 여러 Fragment 를 사용할 때는 act.. Dagger2 with ViewModel ① 제가 Dagger2 를 공부하여 Android 개발에서 최종적으로 하고싶은 것은 ViewModel(+ UseCase, Repository, DataSource, APIService) 을 직접 생성하지 않고 외부에서 주입받아서 보일러 플레이트 코드를 줄이고 유닛 테스트를 보다 쉽게 작성하기 위함입니다. 하지만 개인적으로 느낀점은 Dagger2 를 통해 ViewModel(정확히는 ViewModel 을 가지고 있는 ViewModelFactory)을 주입해보니 일반적으로 ViewModelProvider 에 ViewModelFactory 를 넘겨서 ViewModel 을 생성하는 방법과 비교해봤을 때 코드의 양은 많이 줄어든 것 같지 않다는 점을 느꼈습니다. ② 예제 코드 Fragment 클래스 - SubCom.. Dagger2 Singleton ① Member-Inject Method 또는 Provision Method 를 호출하면 Dagger 에 의해서 주입되거나 반환될 인스턴스가 매번 새로 생성됩니다. 만약 인스턴스를 매번 생성하지 않고 한번 생성된 인스턴스를 특정 스코프 내에서 계속해서 사용해야 하는 경우에는 @Singleton 어노테이션을 사용해야 합니다. ② @Provides 메서드에 의해 제공되는 인스턴스를 싱글톤 패턴으로 만들기 위해서는 @Provides 어노테이션에 추가로 @Singleton 어노테이션을 붙인 후 해당 모듈이 연결된 Component 에도 @Singleton 어노테이션을 붙여야 합니다. ③ 하나의 ComponentImpl 인스턴스를 통해 싱글톤 인스턴스를 요청할 때는 항상 동일한 인스턴스를 반환해주지만, 같은 Co.. Dagger2 필드 주입 ① 앞의 글에서 작성한 생성자 주입은 특정 객체를 생성할 때 생성자의 매개변수를 통해 객체를 주입하는 것이고, 이번 글에서 작성할 필드 주입은 이미 생성되어있는 객체의 필드에 객체를 주입하기 위해 사용할 수 있는 방법입니다. ② Andorid 에서는 Activity 와 같은 컴포넌트 객체는 개발자가 직접 생성하는 것이 아니라 Android 시스템에서 객체를 생성하여 생명주기를 관리합니다. 그렇기 때문에 Activity 와 같은 Android 컴포넌트에 특정 객체를 주입하기 위해서는 생성자 주입이 아닌 필드 주입을 사용하여야 합니다.(생성자 주입을 하기 위해서는 Dagger 에서 해당 객체를 직접 생성해야 하는데 그것이 불가능하기 때문에) ③ 이 글에서는 Dagger 가 생성한 코드를 기반으로 필드 주입 .. Dagger2 생성자 주입 ① 만약 A 클래스에서 B 클래스의 인스턴스를 생성할 때 생성자에 C 클래스의 인스턴스를 넘겨줘야 한다면 Dagger 의 생성자 주입을 사용하여 자동으로 B 클래스의 생성자에 C 클래스의 인스턴스를 주입할 수 있습니다.(예: MainActivity(A)에서 ViewModel 인스턴스(B)를 생성할 때 생성자에 UseCase 인스턴스(C)를 넣는 것). ② 이 글에서는 Dagger 가 생성한 코드를 기반으로 생성자 주입 시 작업 흐름에 대해 작성하였습니다. ③ 예제 코드는 아래와 같습니다. Component interface @Component(modules = [CarModule::class]) interface CarComponent { fun getCar(): Car } Component 와 연결된 .. Dagger2 시작 Dagger2 는 Dagger 로 용어를 통일하여 작성하였습니다. ① 안드로이드 앱 개발을 공부하다보니 의존성 주입에 대한 이야기를 많이 듣게됩니다. Android Dev Summit 2019 에서 "We believe that you should always apply dependency injection principles to your application" 라고 말할 정도로 앱 개발시 의존성 주입을 사용하는 것을 적극적으로 권장하는 것으로 보입니다. 이 카테고리에서는 여러 블로그에서 가장 많이 언급되는 Dagger 라는 의존성 주입 프레임워크에 대해 공부한 내용을 작성할 예정입니다. (처음 공부하는 것이라 틀린 내용이 포함될 수 있습니다. 틀린 내용은 댓글 남겨주시면 정말 감사드리겠습니다!) ② .. 6. ViewModelStore 와 ViewModelStoreOwner ① ViewModelStore 은 ViewModel 객체를 저장하기 위한 클래스입니다. 내부에 ViewModel 을 저장하기 위해 HashMap 을 가지고 있으며, put(ViewModelStore 에 ViewModel 저장), get(ViewModelStore 에 저장된 ViewModel 반환), clear(ViewModelStore 에 저장된 ViewModel 객체 정리) 메서드를 제공합니다. ② ViewModelStore 객체는 ViewModelStoreOwner 인터페이스 구현 객체에서 관리합니다. Activity(ComponentActivity class) 또는 Fragment(Fragment class) 는 ViewModelStoreOwner 인터페이스를 구현한 ViewModelStoreOwn.. 이전 1 2 3 4 다음