안드로이드 192

[Android] Gradle VersionCatalog 알아보자

안드로이드 프로젝트 셋팅 Gradle VersionCatalog 알아보자 Version Catalog안드로디르 개발 프로젝트를 하면서 멀티 모듈을 사용할 때, build.gradle파일이 많이 생기고 각 파일에서 공통적으로 사용할 변수나 의존성 버전으로 인해 빌드 오류를 자주 겪는 경우가 생긴다.그래서 buildSrc 등을 이용하여 버전을 관리 했다.요즘엔 Version Catalog를 사용하여 버전 관릳를 많이 한다고 한다. Version Catalog란?버전을 bundle 형태로 묶어서 관리할 수 있고, 프로젝트에 여러 모듈이 있는 경우,라이브러리와 플러그인을 업그레이드 해야 할 때마다 이름과 버전을 개별 빌드 파일에 하드코딩 대신,Version Catalog를 생성 해놓으면 다른 모듈에서 스튜디오 ..

[Android] RecyclerView GridLayoutManager 헤더, 푸터, spanSizeLookup 작업

RecyclerView GridLayoutManager 헤더, 푸터, spanSizeLookup 작업작업중에헤더 푸터는 전체 칼럼으로 보여줘야하고, 그리드 영역은 span size 에 맞게 처리 해야하는 작업이 필요했습니다.아래 표와 같은 형태헤더그리드 영역   푸터 1. RecyclerView에 GridLayoutManager 설정val layoutManager = GridLayoutManager(context, 2) // 전체 칼럼 수를 2으로 설정layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { override fun getSpanSize(position: Int): Int { return wh..

안드로이드 2024.05.10

[Android] 코루틴 플로우(Coroutine Flow)에 대해 알아보자

Android 코루틴 플로우(Coroutine Flow)에 대해 알아보자 # flow { ... } public fun flow(@BuilderInterface block: suspend FlowCollector.() -> Unit) : Flow = SafeFlow(block) flow { // 플로우 블럭 } 하나의 소비자(Consumer)에게 값을 보냅니다. 생성된 이후에 누군가 소비하기 시작하면 데이터를 발행합니다. # 플로우 기초 플로우 기초 플로우 기초 플로우 기초 예제 45: 처음만나보는 플로우 Flow는 코틀린에서 쓸 수 있는 비동기 스트림입니다. import kotlin.random.Random import kotlinx.coroutines.* import kotlinx.coroutines..

[Android] Custom NotificationView(RemoteViews)에 대해 알아 보자

Android Custom NotificationView(RemoteViews)에 대해 알아 보자 Android custom NotificationView를 찾다가 RemoteViews라는게 있었습니다! notification 을 원하는 형태로 그릴 수 있었습니다! val acceptIntent = Intent(this, 원하는화면::class.java) val rejectIntent = Intent(this, 원하는화면::class.java) RemoteViews(packageName, R.layout.보여줄xml).let { val contents = "원하는 내용" it.setTextViewText(R.id.textview1, "내용") it.setTextViewText(R.id.textview2,..

안드로이드 2024.03.26

[Android] 안드로이드 잠금 화면, 슬립 깨우기

Android 잠금 화면, 슬립 깨우기 잠금화면을 해제할 액티비티의 onCreate 에 추가 하였습니다. private fun turnScreenOnAndKeyguardOff() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { setShowWhenLocked(true) setTurnScreenOn(true) window.addFlags( WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON or WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON ) } else { window.addFlags( WindowManager.LayoutParams.FLAG_SHOW_W..

안드로이드 2024.03.26

아키텍처는 왜 중요한가? (MVC, MVP, MVVM, Clean Architecture, ViewModel, 모듈) 알아 보자!

아키텍처는 왜 중요한가? (MVC, MVP, MVVM, Clean Architecture, ViewModel, 모듈) 알아 보자! 아키텍처는 왜 중요한가? 모바일의 특징을 고려 네트워크적 특징을 고려 사용자 이벤트 다른앱들의 실행. 전화 문자 등등 반응형 프로그래밍 (코루틴, RX Java 등) 이런것들의 동시에 일어난다. 빠른 배포가 필요 비지니스의 확장을 위해서 모듈화가 필요하고 확장에 유연해야한다. 실험적인 기능을 가설을 세우고 특정유저에게 보낸다 → 좋은 아키텍처가 뒷받침 Network Drivien UI → 비지니스 모델에 따라 지원해야할수도 있음 테스트를 위함 확장성이 좋은 앱, 모듈간의 커플링이 낮음 → 결국 테스트하기 좋은 앱 아키텍처는 답이 없음 (중요!) 앱에 실질적으로 도움이 되는것을..

안드로이드 2024.03.26

[Android] 루팅이란? 루팅 체크 방법

루팅(Rooting)이란? 모바일 기기에서 구동되는 안드로이드 운영 체제 상에서 최상위 권한(루트 권한)을 얻어 생산자 측에서 걸어놓은 제약을 해제하는 행위 Android 기기 루팅 되었는지 확인하는 방법 단계 1) 기기 루팅 시도 단계 2) Root Checker라는 무료 앱 설치 단계 3) 앱을 실행하고 'Verify Root Access' 버튼을 탭합니다. 단계 4) 앱은 기기를 성공적으로 루팅했는지 여부를 알려줍니다. 단계 5) 기기가 루팅된 경우 좋습니다. 그렇지 않은 경우 One Click Root를 설치하여 문제를 해결하십시오. 루트 검사기는 어떻게 작동합니까? Root Checker는 Android 스마트폰 또는 태블릿에서 루트 액세스 권한을 테스트하는 간단한 앱입니다. 이를 위해 Root..

안드로이드 2024.03.22

[Android] AudioFocus 관리, MediaPlayer, AudioManager

안드로이드 프레임워크에서 소리와 영상을 재생하기 위해 사용되는 클래스는 아래와 같습니다. # MediaPlayer 오디오 및 비디오 파일과 스트림 재생을 위해 쓰입니다. 소리와 영상을 재생하기 위한 기본 API입니다. # AudioManager 기기의 오디오 소스와 오디오 출력을 관리하는 클래스입니다. # Audio Focus 2개 이상의 앱이 audio를 하나의 stream으로 동시에 재생할 수 있다. 시스템들은 이것을 믹스한다. 이는 유저에게 소음이 될 수 있다. 이를 예방하기 위해 Audio Focus라는 개념을 도입. 하나의 앱만 audio focus를 가질 수 있다. 앱이 audio output을 하려면, audio focus를 요청해야 한다. focus를 획득하면 소리를 재생할 수 있다. 획득..

안드로이드 2024.03.20

Android 12이상 Notification & BroadCastReceiver, Service StartActivity문제

Android 12이상 Notification & BroadCastReceiver, Service StartActivity문제 안드로이드 OS버전 12이상에서 노티피케이션 받았을 때 푸시가 오지 않는 이슈가 발생하였다. 앱종료 되어있을 때 푸시받아서 ForegroundService도 실행해 줘야 하는데 OS버전 12이상에서 백그라운드 실행을 더 제한하여 실행이 되지 않았음. FCM의 priority를 서버에서 High로 받으니 푸시가 오는 것을 확인하였다. 또 다른 방법은 WorkManager로 마이그레이션 하라고 되어있는데 그렇게까진 하지 않았습니다. ForegroundService에서 notification 문제도 발생. remoteView로 커스텀뷰를 사용하고 BroadCastReceiver로 이벤..

[Android] CoroutineScope, CoroutineContext, CoroutineBuilder, suspend Function

#CoroutineScope 코루틴이 실행되는 범위로, 코루틴을 실행하고 싶은 Lifecycle에 따라 원하는 Scope를 생성하여 코루틴이 실행될 작업 범위를 지정할 수 있습니다. 사용자 지정 CoroutineScope: CoroutineScope(CorountineContext) ex) CoroutineScope(Dispatchers.Main) // Dispatchers.Main, Dispatchers.Default, Dispatchers.IO, Job()... // 메인 쓰레드에서 실행될 사용자 정의 Scope val scope = CoroutineScope(Dispatchers.Main) scope.launch { // 메인 쓰레드 작업 } // 백그라운드에서 실행될 사용자 정의 Scope Cor..