전체 글

Scaffold란?- Scaffold는 TopBar, BottomBar, FAB 등 전용 슬롯을 가지고 화면의 뼈대를 만들어주는 컴포저블이다.@Composablefun Scaffold( modifier: Modifier = Modifier, topBar: @Composable () -> Unit = {}, bottomBar: @Composable () -> Unit = {}, snackbarHost: @Composable () -> Unit = {}, floatingActionButton: @Composable () -> Unit = {}, floatingActionButtonPosition: FabPosition = FabPosition.End, containerC..
- 서비스 기능 중에 Custom Tabs로 자사 서버에서 제공해 준 url을 열고, 앱링크로 데이터를 수신받아 다시 앱을 열어주는 로직이 있었는데, 디바이스 기본 브라우저가 파이어폭스면 이 앱링크가 동작하지 않는 문제가 있었다. - 찾아보니.. 파이어폭스 자체 앱 말고 사이드 브라우저 통해서는 앱링크를 지원하지 않는 것으로 보인다....;https://connect.mozilla.org/t5/ideas/firefox-for-android-deep-link/idi-p/23741 Firefox for android - deep linkHello! I use firefox very long time - from version 6 or ssomething like this, i very love this br..
- BottomSheetBehavior에 콜백을 등록하는 setBottomSheetCallback 메서드가 deprecated 되었길래 대응했다. - addBottomSheetCallback 및 removeBottomSheetCallback으로 대응 가능하다.https://stackoverflow.com/questions/59343490/setbottomsheetcallback-is-deprecated setBottomSheetCallback is deprecatedwhile developing an app for object detection using ml kit firebise, i've implemented my bottom sheet but it's not working,so the camera..
- 안드로이드에서는 Background Task 수행이 메모리, 배터리 등의 자원 문제로 제한적이다. - 기본적으로 안드로이드는 리눅스 커널 기반 운영 체제인데, 리눅스와는 달리 디스크 스왑 파티션이 없다. - 스왑 파티션 (Swap Space)이 무엇이냐? 램이 가득 찼을 때 사용되는 곳으로 메모리 상의 비활성화 데이터를 스왑 파티션으로 이동시킨다. - 하지만 그렇다고 스왑 파티션 자체가 램의 용량을 늘린다고는 할 수 없다. 액세스 타임이 느린 HDD 레벨에 존재하기 때문이다.- 안드로이드는 기본적으로 이 Swap Space가 없기 때문에 시스템이 메모리를 많이 잡아먹는 프로세스에 대해 백그라운드 동작을 하지 못하도록 강제 종료하고 여유 메모리를 확보한다. - 모든 프로세스는 액티비티 매니저가 부여한 ..
- 데이터를 로컬이나 서버로부터 가져오는 접근자인 데이터 소스 - 기존 프로젝트에서 급하게 먼저 출시하느라 DataStore에 값을 저장하고 가져오는 로직이 object로 단순하게 구성되어 있었다.object SettingsDataStore { private val Context.dataStore by preferencesDataStore(name = "settings") private val LAST_TRAIN_KEY = booleanPreferencesKey("last_train_enabled") private val DEST_ID = stringPreferencesKey("destination_id") private val DEST_NAME = stringPreferencesK..
- 백그라운드 작업을 예약하고 수행하기 위한 Jetpack 요소인 WorkManager를 클린 아키텍처 + Hilt 구조 프로젝트에 사용해 봤다.HiltWorker 구성- 먼저 WorkManager에 대한 gradle 의존성을 추가하되, Hilt worker에 대해서도 같이 추가해주어야 한다.implementation("androidx.hilt:hilt-work:1.2.0")implementation(libs.androidx.work.runtime.ktx)- Hilt와 Worker 간 브리지 역할을 해주는 설정이다. - Worker를 구성해 준다.@HiltWorkerclass JibroWorker @AssistedInject constructor( @Assisted context: Context, ..
- 코틀린 개발자라면 정말 매일 사용하는 Scope Function. - 그 목적과 의미를 알고 사용하면 더 낭비를 줄일 수 있다. 블로그에 정리된 내용이 없어 보이길래.. 남겨봄.Scope Function객체의 Context내에서 코드의 블록을 실행하는 것이 유일한 목적인 함수.코드의 기능을 정리하고 표현하여 가독성을 높인다.Apply객체 확장 함수, 객체의 초기화에 사용하며, this 생략 가능 val person = Person().apply { firstName = "Lee" lastName = "Park" }Also객체를 파라미터를 통해 전달 (기본 파라미터 : it)해당 파라미터는 Lambda의 입력 값으로 지정//1~100까지의 함수를 랜덤으로 추출하여 그 값을..
- 최근 개인 제작 앱을 구글 플레이 스토어에 등록 심사를 요청했는데, ACCESS_FINE_LOCATION 권한에 대한 허가가 필요한 이유를 사용자에게 구체적으로 제공해야 한다고 하여 거절당했다. - 가볍게 Toast로 위치 권한이 필요합니다. 정도로는 납득시킬 수 없고, 적절한 기능 예시와 함께 사용자에게 권한 허가를 요청해야했다. - 먼저 해당 권한에 대한 기능 관련 화면 스크린숏을 3장 정도 수집했다. 그리고 drawable에 추가. - 나는 수평 슬라이드 페이징을 통해 예시 화면을 보여주고자 했다. - 대충 슬라이드 페이징 - 제목 - 설명 - Yes or No 버튼을 수직으로 배치하고자 Column을 최상단에 약간의 padding을 넣어 선언했다.Column( modifier = Modi..
- 서비스의 기존 로직에 UI 로직과 DB 접근, 네트워크 로직을 복잡하게 모두 차지하고 있는 Manager 클래스가 있었다. - 작업 시에 혼동이 오고 유지보수다 어렵다 보니 에러 발생 시 찾기가 쉽지 않았고, 스레드에 대한 문제도 빈번하게 발생하고 있었다. - 어느 정도 간단한 DB 접근은 문제없다 해도 데이터가 많다면 ANR이 발생.. 이를 위해 비동기 처리가 누락된 부분을 탐색했지만 매니저 클래스를 나눠버리는 게 나을 것으로 확인되었다.- 아예 MVVM 패턴을 적용하도록 했다. 내부의 DB 쿼리 작업들이 명시된 ~DAO 클래스들은 내부적으로 AppContext를 사용하고 있는데, 이 의존성을 전부 해결하려면 상당한 시간이 걸려.. 일단은 당장 ANR 문제를 해결하기 위해 Hilt 없이 MVVM 패..
· Knowledge/IT
- 구체적인 클래스 타입을 알지 못하더라도 해당 클래스의 메서드, 변수 등에 접근할 수 있는 기능이다. - 작성 시점에는 알 수 없지만 실행 중에는 가져와 실행해야 하는 경우 필요하다. 이벤트 버스처럼.val cls = obj::class.javaval m = cls.getDeclaredMethod("doSomething", String::class.java)m.isAccessible = truem.invoke(obj, "hello") - getDeclaredMethod로 이름이 "doSomething"인 메서드를 찾아 실행 중에 호출하는 예시 코드다. - 이벤트 버스 라이브러리에서도 @Subscribe 어노테이션 메서드를 리플렉션으로 찾는 로직을 확인할 수 있다.for (Method method : m..
SeungYong.Lee
Win-Dev