안드로이드 뒤로가기 두번 눌러 종료 기능 Flow로 구현하기
개발/Android2023. 11. 28. 16:03안드로이드 뒤로가기 두번 눌러 종료 기능 Flow로 구현하기

안드로이드 앱에 없어서는 안 되는 기능인 뒤로가기 버튼을 통한 종료 기능, 일반적으로 구현할 때 크게 3가지로 나눌 수 있습니다. 즉시 종료 종료 팝업 종료 토스트 즉시 종료를 시키기도 하지만, 경우에 따라 종료 여부를 팝업으로 띄우거나 토스트/스낵바를 통해 한번 더 눌러 종료한다고 표시하기도 합니다. 이번 글에서는 작년 이 시기 쯤 Rx로 구현한 뒤로가기 기능을 Flow로 구현하기 위해 노력한 기억이 떠올라 시도하였던 경험과 함께 종료기능을 구현하기 위한 아래의 3가지 방법으로 이야기해 보겠습니다. 일반적인 방법 Rx를 사용한 방법 Flow를 사용한 방법 즉시 종료 우선 뒤로가기 버튼을 눌렀을 때 종료한다면 다음과 같이 구현할 수 있습니다. Android API 33부터 onBackPressed 방식..

안드로이드 Proto 설정 시 오류
개발/Android2023. 8. 14. 17:44안드로이드 Proto 설정 시 오류

오랜만에 Proto Datastore를 사용하려고 하니 2가지 오류가 발생하였습니다. Plugin 적용하는 부분에서 아래의 오류가 발생하였습니다. Could not get unknown property 'source' for generate-proto-generateDebugProto of type org.gradle.api.internal.file.DefaultSourceDirectorySet. 실수가 있나하여 공식 문서, Codelab을 참고하여 시도하였지만 변화가 없었습니다. 여기저기 찾아보니 스택오버플로우에서 관련 내용을 찾을 수 있었습니다. 해결 방법은 간단합니다. 코드랩에 안내된 0.8.17 버전 대신 0.9.1을 사용하면 됩니다... id("com.google.protobuf") versio..

컴포즈 내비게이션 CreationExtras must have a value by `SAVED_STATE_REGISTRY_OWNER_KEY` 오류
개발/Android2022. 12. 7. 21:48컴포즈 내비게이션 CreationExtras must have a value by `SAVED_STATE_REGISTRY_OWNER_KEY` 오류

오류 로그 java.lang.IllegalArgumentException: CreationExtras must have a value by `SAVED_STATE_REGISTRY_OWNER_KEY` 오류 시나리오 현재 GDSC TUK(Google Developer Student Clubs - TECH UNIVERSITY OF KOREA)에서 2022년 안드로이드 스터디 마무리 프로젝트로 스쿨메이트라는 서비스를 개발하고 있었다. 초기 프로젝트 셋업 시 Hilt, Ktor 등 필요한 라이브러리도 디펜던시 연결해둔 상태에서 시간이 흘러 내비게이션을 도입을 해야하는 상황까지 오게 되었다. 컴포즈 내비게이션은 회사에서 매 프로젝트마다 작업하던 것이기에 간단하게 생각하고 적용을 하였으나 런타임에서 위의 오류 로그를..

[Room DB] Room Database 마이그레이션 시 주의점 2가지
개발/Android2022. 12. 5. 17:33[Room DB] Room Database 마이그레이션 시 주의점 2가지

What is Room Database? 안드로이드에서 데이터를 저장할 때 에는 SharedPreferences 또는 DataStore를 주로 사용하지만 방대한 자료, 그룹화/분류 및 쿼리문이 필요해지는 등 이러한 상황에서는 Jetpack에서 제공하는 Room Database(이하 Room DB) 주로 사용하고 계신다고 생각됩니다. 상당한 양의 구조화된 데이터를 처리하는 앱은 데이터를 로컬에 유지하여 매우 큰 이익을 얻을 수 있습니다. 가장 일반적인 사용 사례는 기기가 네트워크에 액세스 할 수 없을 때도 사용자가 오프라인 상태로 계속 콘텐츠를 탐색할 수 있도록 관련 데이터를 캐시 하는 것입니다. Room 지속성 라이브러리는 SQLite를 완벽히 활용하면서 원활한 데이터베이스 액세스가 가능하도록 SQLit..

PopupWindow에서 Jetpack Compose를 사용하는 방법
개발/Android2022. 11. 4. 11:30PopupWindow에서 Jetpack Compose를 사용하는 방법

Jetpack Compose에서 PopupWindow를 왜 사용하죠? 사실 처음부터 Compose로 개발하였다면 PopupWindow를 사용할 경우는 거의 없다고 생각된다. 그렇지만 그 이전, 우리는 커스텀 팝업을 만들 때 PopupWindow를 사용하여 XML을 Inflate 시켰기에 보다 편하게 만들어 왔었다. 그러다 점차 신규 프로젝트가 Compose로 개발이 시작되면서, 구 프로젝트(XML)에서도 독립적인(연계되지 않는) 신규 화면에 한해 Compose로 개발을 하였다. 이미 전반적인 커스텀 팝업을 PopupWindow를 사용하고 있으며 해당 팝업을 사용하는 곳도 Compose가 아니기에 기존 구조를 그대로 사용하면서 내용물만 Compose로 만든 다음 AbstractComposeView로 wra..

안드로이드 gRPC 개념 및 사용법
개발/Android2022. 10. 12. 16:04안드로이드 gRPC 개념 및 사용법

gRPC란? gRPC는 Google에서 개발한 RPC(Remote Procedure Call) 시스템으로 TCP/IP + HTTP 2.0 프로토콜을 사용하며 IDL(Interface Definition Language)을 통해 protocol buffer로 통신합니다. gRPC에서는 클라이언트 애플리케이션이 마치 로컬 객체인 것 처럼 다른 서버의 함수를 직접 호출할 수 있습니다. 많은 RPC 시스템처럼 gRPC는 서비스 정의에 기반을 두고 있으며, 직접 파라이터와 리턴 타입을 사용하여 원격으로 호출할 함수를 지정합니다. 클라이언트 측에서는 서버와 동일한 함수를 제공하는 stub(일부 언어에서는 클라이언트)을 지니고 있습니다. 프로토콜 버퍼(Protocol Buffers) 기본적으로 gRPC는 구글에서 오..

MQTT 안드로이드 코틀린 클라이언트 + 서버 만들기
개발/Android2022. 9. 27. 13:00MQTT 안드로이드 코틀린 클라이언트 + 서버 만들기

MQTT란? MQTT(Message Queueing Telemetry Transport)는 2016년 국제 표준화된 발행(Publish)-구독(Subscribe) 기반의 메시지 송수신 프로토콜로 최소한의 전력과 패킷으로 통신합니다. TCP/IP 프로토콜 위에서 동작하지만 가벼우면서도 많은 통신 제약을 해결할 수 있기에 모바일과 IoT 같은 환경에서 어울려 사용하기 좋습니다. MQTT 구조도 또한 Topic 기반으로 발행/구독을 하기에 자신이 원하는 Topic을 Brocker을 통해 구독(Subscribe)하면 해당 Topic으로 발행(Publish)되는 메시지를 받을 수 있습니다. 이러한 아키텍처 덕에 IoT에서도 강한 이점을 보이며, Topic 분류 기준에 따라 같은 기능이라도 여러 방식으로 디자인을 ..

개발/Android2022. 7. 11. 02:11안드로이드12 대응 - PendingIntent 빌드 오류

Build Error Log 2022-02-25 13:43:50.714 3448-3498/com.autocrypt.mi.bf2u.barrierfree E/AndroidRuntime: FATAL EXCEPTION: pool-23-thread-1 Process: com.autocrypt.mi.bf2u.barrierfree, PID: 3448 java.lang.IllegalArgumentException: com.autocrypt.mi.bf2u.barrierfree: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent. Stron..

개발/Android2022. 7. 11. 02:03[Jetpack Compose] BasicTextField - clearFocus() 이슈

Error Log layoutcoordinate operations are only valid when isattached is true 시나리오 BasicTextField 생성 decorationBox안에 value(입력 값)이 empty이 아니면 innerTextField를 호출하지 않도록 함 키보드 엔터 누른 경우 search를 하고 키보드 숨김 및 focusManager로 clearFocus 호출 이때 text가 비어있는 상태에서 키보드 숨김 및 focus 해제 후 다시 BasicTextField를 클릭하면 앱 사망 분석 clearFocus() 함수의 문제인가? clearFocus() 함수를 호출하고 이후 호출을 하지 않더라도 앱이 사망 키보드가 내려간 상태에서 textField를 클릭하였기 때문..

image