전체 글

개발기록 / 공부한 내용을 정리하는 블로그
· Kotlin/Util
개인정보나 암호와 같은 민감한 Text들을 * 처리 이메일 끝 3자리 *** 표시 ex) abc@email.com -> ***@email.com fun getEmailMasking(email: String): String { val result = StringBuffer() val REGEX_EMAIL = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$" val pattern = Pattern.compile(REGEX_EMAIL, Pattern.CASE_INSENSITIVE) if (!pattern.matcher(email).matches()) { //이메일 형식이 맞지 않았을 때 r..
Android Jetpack 아키텍처의 구성 요소 중 하나로 안드로이드의 백그라운드 작업을 처리하는 방법이다. 앱이 종료되거나 기가가 다시 시작되어도 실행 예정인 지연 가능한 비동기 작업을 쉽게 예약할 수 있게 해준다. 하나의 코드로 API Level 마다 비슷한 동작을 보장한다. WorkerManager 구성요소 Worker 백그라운드에서 수행될 테스크를 의미 추상 클래스인 Worker를 상속한 클래스를 구현하고 Override 되는 doWork() 메소드 안에 동작할 테스크를 구현해야 한다. WorkRequest WorkManager에 수행할 테스크를 요청할 때 사용되는 클래스 수행할 Worker를 등록해야 하고, 한번만 실행할 것인지 주기적으로 실행할 것인지 설정할 수 있다. OneTimeWorkR..
작업 진행 중 View를 다시 구성하거나 그릴 때 invalidate()와 requestLayout()을 사용하는데 이 둘의 차이점이 궁금해서 찾아보았다. View의 생명주기를 알아야 하는데 invalidate()는 draw를 다시 하도록 요청하고 requestLayout()은 measure를 통한 사이즈 체크부터 다시 시작한다. 단순한 변경 사항을 보여주기 위하여 다시 그리는 경우에는 invalidate()를 사용하고 사이즈가 바뀌어 뷰간의 경계에도 영향을 준다면 requestLayout()을 호출해야 한다.
앱들을 사용하다 보면 스크롤할 때나 상단에 검색 툴바, 하단의 바가 사라질 때가 있고 나타날 때가 있다. 이러한 효과를 사용해보기 위함도 있고 코드본을 가지고 있기 위해 구현해 보았다. CoordinatorLayout 먼저 숨김처리 효과를 구현하기 위해 CoordinatorLayout을 사용해야 한다. CoordinatorLayout의 Behavior를 통해 자식 뷰들 간에 상호작용을 제공한다. 이 Layout을 이용하면 자식 뷰들을 드래그하여 움직이는 것도 가능하고 패널을 스와이프 해 지우기 또는 애니메이션 적용 등 다양한 기능을 활용할 수 있다고 한다. AppBarLayout LinearLayout을 상속한 스크롤 제스처에 몇 가지 동작을 할 수 있다. 이 레이아웃은 자식으로 ToolBar를 지니고 ..
프로젝트를 진행하다가 안드로이드의 개발자옵션처럼 빌드번호를 여러 번 클릭해 개발자옵션을 켜는 것과 비슷하게 클릭 횟수를 Count 해서 특정 코드를 실행하는 Listener가 필요했다. 배치되어 있는 버튼에 사용하였으면 바로 Activity나 Fragment에서 처리가 가능하겠지만 RecyclerView의 Item을 클릭 시 처리를 해야 했기 때문에 Click Listener를 Item에 따로 지정해주는 방식으로 작성했다. Kotlin을 주로 사용하였지만 이번 프로젝트는 Java로 진행하여 시간이 날 때 코틀린으로 작성할 것이다. 일단 따로 Item에 지정해줄 ClickListener를 만들었다. public abstract class OnClickCountListener implements View.O..
· Kotlin/Util
특정 주소에 네트워크 연결상태를 확인하기 위해서 ping을 사용한다. Kotlin val networkThread = Thread { try { val runTime = Runtime.getRuntime() val cmd = "ping -c 1 -W 2 $ip" //ip는 test 하고 싶은 주소 String 을 넣어주면 된다. val proc = runTime.exec(cmd) proc.waitFor() //여기서 반환되는 ping 테스트의 결과 값은 0, 1, 2 중 하나이다. // 0 : 성공, 1 : fail, 2 : error val result = proc.exitValue() when (result) { 0 -> Log.d("FragmentSelfCheck", ip.toString() + "..
WakeLock은 PowerManger 클래스의 메소드이며 앱이 항상 켜져있음을 나타내는 메커니즘 안드로이드 기능 WakeLock을 사용하기 위해서는 안드로이드 권한을 얻어야 한다. AndroidManifest.xml 매니페스트에 WAKE_LOCK 권한을 추가한다. WakeLock을 사용하기 위해 PowerManager와 WakeLock객체를 선언해야한다. var powerManager: PowerManager? = null var wakeLock: WakeLock? = null 다른 Flag도 있지만 일단 필요한 것만 적었다. wakeLock = powerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK , "com.example.jetpacksemi..
Navigation 네비게이션은 Application 자체의 화면 구성을 쉽게 구현하고 화면의 흐름을 시각적으로 보여줄 수 있는 구성 요소이다. 기존 Activity or Fragment들 간 데이터 전달 or 화면 이동과 같이 이동되어야 하는 code 구현을 심플하고 안정적으로 처리한다. 개발자가 정의한 UI Graph를 기반으로 화면을 쉽게 전환하고, 유지보수가 매우 쉬워진다 NavGraph(탐색 그래프) 모든 탐색 관련 정보가 하나의 중심 위치에 모여 있는 XML 리소스. Destinations과 이들을 연결하는 Actions들을 시각화해서 볼 수 있다. Destinations이란 Navigation을 이용해 이동하는 앱의 목적지를 의미 NavHost 탐색 그래프에서 대상을 표시하는 빈 컨테이너. ..
Android 뿐만 아니라 프로그래밍에서 널리 사용되는 기법으로 다양한 이점이 있다. 코드의 재사용성 리펙토링 용이성 테스트 용이성 Class에서 다른 Class를 참조하는 방법은 크게 3가지가 있다. 1. Class 에서 필요한 종속 Class 를 인스턴스화 하는 방법 위와 같은 방법은 Car와 Engine이 밀접하게 연결되어 있기 때문에 문제가 발생할 수 있다. 만약 Engine을 상속받은 GasEngine, ElectricEngine Class가 있을 때 쉽게 대체할 수 없다. Engine이라는 한 가지 유형을 사용하기 때문에 수정하면 연관된 코드를 수정해야 할 가능성이 있다. Test를 더욱 어렵게 한다. Engine을 FakeEngine으로 바꿔서 Test 하려면 Engine과 연관된 코드를 수..
bumjae
Android Technote