간단하게 Android의 Activity 라이프 사이클에 대해 정리하고 그중 onStart()와 onResume()이 구체적으로 어떤 차이가 있는지 알아보고자 합니다. 또한, Task에 관해서도 간단히 공부해보려고 합니다. 1. Activity LifeCycle 안드로이드를 공부해 봤다면 반드시 한 번쯤 봤을 그림입니다. 바로 Activity 라이프사이클에 대한 그림인데요. 이미 많은 사람들이 잘 알고 있지만, 복습 겸 한번 더 정리해보고자 합니다. onCreate() 액티비티가 생성되는 시점에 실행되며, 전체 생명 주기 동안 한 번만 발생합니다. 보통 OnCreate에서는 XML 파일을 정의하고 setContentView()에 전달하는 대신, 활동 코드에 새로운 View 객체를 생성하고 새로운 View..
최근 면접을 보면서 최신 기술에 대해 공부하기 급급한 나머지, 안드로이드의 기본적인 지식을 놓치고 있다는 것을 알게 되어 이참에 다시 공부해보고자 합니다. manifest에 입력하는 exported가 어떤 역할을 하는지에 대한 질문이었으나, 정확하게 답변하지 못해 알아보도록 하겠습니다. 1. android:exported 란 우선, 공식문서를 확인해 보면 android:exported 속성은 다른 애플리케이션에서 안드로이드 컴포넌트(액티비티, 서비스, 브로드캐스트 리시버)를 실행할 수 있는지에 대한 설정을 하는 역할을 합니다. true인 경우, 모든 앱이 활동에 액세스 할 수 있으며, 정확한 클래스 이름으로 시작할 수 있다. false인 경우, 동일한 애플리케이션, 동일한 사용자 ID를 가진 애플리케이션..
지난 callbackFlow에 이어서 callback를 coroutine 형태로 받을 수 있는 suspendCoroutine과 suspendCancellableCoroutine에 대해 알아보려고 합니다. 1. suspendCoroutine public suspend inline fun suspendCoroutine( crossinline block: (Continuation) -> Unit): T { } 먼저 suspendCoroutine에 대해 알아보도록 하겠습니다. 내부 코드와 함께 적힌 설명을 살펴보면, block 람다 함수는 Continuation 객체를 인자로 받으며, 비동기 작업이 완료되면 결과를 이 Continutaion 객체를 통해 반환합니다. Continuation 객체는 현재 코루틴 상..
라이브러리나 sdk에서 callback 형태로 받는 API를 Flow로 받고 싶을 땐 어떻게 해야 할까요?! callbackFlow, suspencoroutine 등을 이용하여 Flow로 받을 수 있습니다. 이번에는 callbackFlow에 대해 공부해보려고 합니다. 1. callbackFlow란 public fun callbackFlow(@BuilderInference block: suspend ProducerScope.() -> Unit) : Flow = CallbackFlowBuilder(block) callbackFlow는 callback을 Flow로 변환할 수 있는 Flow Builder입니다. 공식 문서에 따르면, ProducerScope를 통해 빌더 블록의 코드에 전달된 SendChannel..
EditText를 이용할 때 입력 문자에 제한을 두어야 할 때가 있습니다. 한글만 입력이 가능하게 한거나, 특수문자 입력을 막거나 할 때 등등 보통 InputFilter를 사용하여 입력을 막도록 하는데요 최근에 개발하다가 Filter 조건을 잘 걸었지만 이상하게 동작하는 현상이 발견돼서 기록해보려고 합니다!!! 1. InputFilter EditText에서 InputFilter를 사용하여 특정 문자 입력을 제한, 문자열 길이 제한 조건 설정을 할 수 있습니다. fun EditText.filterDigitAndSpecialChar() { this.filters = arrayOf( InputFilter { source, start, end, dest, dstart, dend -> val pattern = "..
때론 디자인에 따라 Toast 위젯 디자인을 커스텀해야 하는 경우가 있습니다. 최근 사이드 프로젝트에서 Jetpack Compose로 Toast 위젯을 커스텀해야 하는 경우가 생겨 이번 기회에 알아보려고 합니다! 1. 기존에 사용한 Toast Message Custom //Toast 위젯 상속 class CustomToast(context: Context) : Toast(context) { } //객체 생성 Toast(context).apply { view = toastLayout setGravity(Gravity.CENTER,0,0) } 기존에는 Toast 위젯를 상속받는 Class를 통해 Customview를 생성하거나, 객체를 생성하여 setView(), setGravitiy() 등 다양한 속성값을..
안드로이드 개발을 하다보면 상황에 따라 화면 터치 여부를 파악하거나 이벤트를 추가해야하는 경우가 있는데요! onTouchEvent(), onClick 등 많이 사용해보았지만 내부 구조에까지는 알지 못했던 것 같아 뷰 계층 구조를 통해 터치 이벤트가 흐르는 방식에 대해 정리해보려고 합니다. 1. MotionEvent 간단하게 MotionEvent 종류에 대해 다시 한번 정리 해보도록 하겠습니다. ACTION_DOWN : 손가락 또는 물체가 화면에 처음 접촉할 때 발생하는 이벤트입니다. 이벤트에는 제스처의 초기 시작 위치가 포함됩니다. ACTION_UP : 손가락 또는 물체가 화면에서 떼어질 때 발생하는 이벤트입니다. 제스처의 최종 놓은 위치가 포함됩니다. ACTION_MOVE : ACTION_DOWN과 A..
최근에 서버 개발자분이 안드로이드 위젯에 관한 질문을 주셔서 알아보다가 JetPack Compose에서는 어떻게 위젯을 만드는지에 대한 궁금증이 생겼습니다. 어떤 라이브러리를 사용하고 어떻게 개발하는지 알아보려고 합니다! 1. Glance 라이브러리 추가 implementation "androidx.glance:glance-appwidget:1.0.0-alpha05" 우선, 앱 위젯을 사용하기 위한 라이브러리를 추가해 줍니다. (아직 Jetpack용 Glance는 알파 버전만 출시된 상황입니다.) Glance는 선언형 Kotlin API를 제공하므로, 훨씬 적은 코드로 보기에도 좋고 반응이 빠른 앱 위젯을 빌드할 수 있다고 합니다. 해당 라이브러리를 사용해보니 compileSdk가 33인 곳에서 실행이 ..
Flow는 스스로 라이프사이클을 알지 못하기 때문에 CoroutineScope에 따라 생명주기에 따라 맞추어 사용하며 불필요한 메모리나 리소스가 낭비되지 않도록 하는 것이 중요합니다! 이번에는 LifecycleOwner.launchWhenStarted, Lifecycle.repeatOnLifecycle 등이 어떻게 다른지 알아보고 어떻게 불필요한 리소스 낭비를 방지해야 할지 알아보려고 합니다. lifecycleScope.launch private val _stateFlow = MutableStateFlow(0) val stateFlow get() = _stateFlow private fun testCount() { viewModelScope.launch(Dispatchers.IO) { repeat(10)..
최근 MVI를 공부하면서 여러 예제 프로젝트를 보면서 공부하던 중 Channel을 이용하여 상태값을 주고 받는 것을 알게 되었습니다. 이참에 Channel에 대해서도 알아보고자 합니다! 1. Channel 이란 Channel은 두개의 Coroutine 사이를 연결한 파이프이며, 단방향보다는 여러 방향에서 데이터를 주고 받는 형식으로 코루틴끼리 데이터를 전달하기 위한 것입니다. Channel은 BlockingQueue와 유사하지만, 약간의 차이점이 존재합니다. BlockingQueue은 put(), take()를 사용하여 차단해서 전송하는 방법이고 Channel은 send(), receive()를 사용하여 일시중단(suspend)으로 전송하는 방식입니다. 또한, Channel은 더 이상 사용하지 않을 때 ..