최근 Google에서 출시 한 새로운 Android Architecture Components, 특히 ViewModel 라이프 사이클 인식 클래스를 MVVM 아키텍처 및 LiveData와 함께 사용하기로 결정했습니다.MVVM 패턴 및 startActivity
단일 액티비티 또는 단일 프래그먼트를 다루는 한 모든 것이 정상입니다.
그러나 활동 전환을 처리하는 좋은 해결책을 찾을 수 없습니다. 간단한 예를 들어 Activity A에 Activity B를 시작하는 버튼이 있다고 가정 해보십시오.
startActivity()는 어디에서 처리됩니까?
MVVM 패턴에 따라 clickListener의 로직은 ViewModel에 있어야합니다. 그러나 우리는 거기서 Activity에 대한 참조를 피하기를 원합니다. 따라서 컨텍스트를 ViewModel에 전달하는 것은 옵션이 아닙니다.
나는 "OK"로 보이는 몇 가지 옵션을 좁혔지만 "여기에 어떻게 할 것인가"에 대한 적절한 답을 찾을 수 없었습니다.
옵션 1 : 값이 가능한 라우팅 (ACTIVITY_B, ACTIVITY_C)에 매핑 된 값으로 ViewModel에 열거 형을 지정하십시오. 이걸 LiveData와 연결하십시오. 액티비티는이 LiveData를 관찰 할 것이고, ViewModel이 ACTIVITY_C를 시작해야한다고 결정할 때 postValue (ACTIVITY_C) 일뿐입니다. 액티비티는 startActivity()를 정상적으로 호출 할 수 있습니다.
옵션 2 : 일반 인터페이스 패턴. 옵션 1과 같은 원리이지만, 액티비티는 인터페이스를 구현합니다. 나는 이것과 조금 더 많은 결합을 느낀다.
옵션 3 : 오토와 같은 메시징 옵션. ViewModel은 브로드 캐스트를 전송하고, Activity는이를 선택하여 시작해야하는 것을 시작합니다. 이 솔루션의 문제점은 기본적으로 ViewModel 내에 해당 브로드 캐스트의 등록/등록 취소를 지정해야한다는 것입니다. 그래서 도움이되지 않습니다.
옵션 4 : 임의의 활동에 관련 라우팅을 발송하기 위해 호출 될 수있는 큰 라우팅 클래스를 단독으로 또는 유사한 것으로 어딘가에 가지고 있습니다. 결국 인터페이스를 통해? 그래서 모든 활동 (또는 BaseActivity)는 앱이 그건 그래서 조각/많은 활동 (라우팅 클래스는 엄청난 될 것 때문에)
을 가지고 시작할 때이 방법은 단지 나에게 조금 걱정
IRouting { void requestLaunchActivity(ACTIVITY_B); }
을 구현하는 것이 그것. 그게 내 질문이다. 어떻게 처리합니까? 내가 생각하지 못했던 옵션을 사용합니까? 어떤 옵션이 가장 관련성이 높고 그 이유는 무엇이라고 생각하십니까? Google의 권장 접근 방식은 무엇입니까?
PS : - Android ViewModel call Activity methods 2 - 당신은 AAC를 사용하여 시작하는 것이 가장 큰 How to start an activity from a plain non-activity java class?
감사합니다. 기꺼이 도와 드리겠습니다 :-) –