android

Fragment에서 권한 요청하기 (2021)

Activity Result를 받아오는 API가 변경되면서 Fragment.requestPermissions도 deprecated 되었다. registerForActivityResult를 호출하고 ActivityResultContracts.RequestPermission을 인자로 전달해야한다. 복수의 권한이 필요한 경우는 Contract를 RequestMultiplePermissions로 바꿔서 사용한다. 하지만 사진/동영상 촬영, 연락처 선택 등 일반적인 케이스는 기본적으로 제공하는 Contract를 활용하는 것으로 커버할 수 있다.

[Kotlin] for-loop with no additional object allocation

In Kotlin, we can use functions such as forEach, forEachIndexed, and map to iterate items in collection. It’s convenient to use, but it comes with cost; those functions create additional objects like Iterator. For most cases, it wouldn’t be a serious problem to have some temporary objects. However, when overriding onDraw method of View class, …

[Kotlin] for-loop with no additional object allocation Read More »

Deprecated or Experimental

안드로이드 API는 큰 흐름상으로는 바람직하게 가고는 있지만 여전히 불만인 부분은 마음놓고 쓰기가 어렵다는 점이다. 어느 정도 안정화되고 손에 익었다 싶으면 deprecated되고 또 새로운 게 나오는데 새로운 걸 쓰려면 모험을 해야한다. 예전 API를 계속 쓰자니 찝찝하고, 새로운 걸 쓰자니 불안하고. 이런 스트레스를 항상 안고 개발해야하는 게 좀 불만이다.

[Kotlin] 객체 할당 없는 for loop

Kotlin에서는 배열이나 컬렉션을 다룰 때 forEach, forEachIndexed, map 등을 통해 내부 항목들을 접근해서 연산을 수행할 수 있다. 이러한 함수들은 인덱스를 직접 관리할 필요가 없어서 편리하긴 하지만, Range나 Iterator같은 부가적인 객체를 생성한다는 단점이 있다. 대부분의 경우에는 객체 한두개 정도 추가 할당하는 것이 큰 문제가 되지 않겠지만, 안드로이드에서 View 클래스의 onDraw 메서드를 오버라이드할 때에는 메서드 내에서 새로운 …

[Kotlin] 객체 할당 없는 for loop Read More »

Check App Standby Bucket using ADB command

A new power management feature called App Standby Bucket has beed added in Android 9(Pie).(https://developer.android.com/about/versions/pie/power) App Standby Bucket allows Android system to categorize priorities of apps in 5 buckets as follows; Active Working set Frequent Rare Never Apps go into one of those buckets according to how actively they are used. An important thing to …

Check App Standby Bucket using ADB command Read More »

ADB로 App Standby Bucket 확인하기

안드로이드 9부터는 App Standby Bucket이라는 전원 관리 기능이 추가되었다.(https://developer.android.com/about/versions/pie/power) App Standby Bucket이란 안드로이드 시스템이 앱을 처리하는 우선순위를 아래와 같이 크게 다섯 가지로 분류하는 기능이다. Active Working set Frequent Rare Never 사용자가 앱을 얼마나 자주 사용하는지에 따라 각 버킷으로 이동하게 되며 정확한 기준은 (어뷰징을 생각한다면 당연히) 알려져있지 않다. 한 가지 주의할 부분은 앱이 어느 버킷에 있느냐에 …

ADB로 App Standby Bucket 확인하기 Read More »

때로는 과감히 소스를 까보자

대략 3년 전쯤, 잠시 내 손을 떠났던 프로젝트의 코드를 수정하는 동료가 기존에 (아마도) RadioButton으로 구현했던 Tab 버튼영역 UI를 TabLayout을 사용해 구현하는 방식으로 바꾸면서 각 탭 버튼들의 폭이 디바이스에 따라 다르게 그려지는 현상이 나타난다며 도움을 요청해왔다. 화면 디자인상 Tab은 통짜 이미지를 슬라이스해서 버튼을 만들고, 항상 가로를 가득 채우도록 확대/축소 되는 식이어서 정확히 지정된 폭으로 그려지지 않으면 …

때로는 과감히 소스를 까보자 Read More »

Android에서 Base64 URL safe encode

Base64로 인코딩된 문자열을 URL에 담아서보내는 경우가 있다. 이 때 URL에서 사용되는 +, / 문자를 -, _로 치환시키는 등의 처리를 하게 되는데 이런 방식이 Base64 URL Encoding이다. Java에서는 Java 8부터 API로 제공된다. https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html java.util.Base64 클래스 getUrlEncoder() 메서드를 호출해서 Base64.Encoder 객체를 가져오는 방법으로 사용한다. 안드로이드에서는 API 26부터 지원된다. https://developer.android.com/reference/java/util/Base64.html 그렇다면 min sdk 버전이 26 미만이면 외부 라이브러리를 …

Android에서 Base64 URL safe encode Read More »

RadioGroup의 생소한 동작

  RadioGroup에서 처음 check를 호출하면 onCheckedChanged가 두 번 연속 호출되는 현상이 나타남. 동일 현상에 대한 SO 답변 소스코드를 보면 그렇게 동작하도록 되어있다고 함 http://www.grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/widget/RadioGroup.java#RadioGroup.check%28int%29 실제로 따라가보니 리스너가 두 번 호출되는 플로우를 타고 있다. 의도대로 동작하게 하려면 RadioGroup이 아니라 RadioButton의 setchecked를 쓰라고 한다. V에서 click 이벤트 발생 -> P에서 처리 -> P가 V를 업데이트 (click 한 …

RadioGroup의 생소한 동작 Read More »

Associate Android Developer 응시 후기

Update 2017-03-25: 합격 통보 받았다. 합격 후기 Update 2017-03-21: 조금 전에 리뷰가 통과되었다는 메일을 받았다. 이제 exit interview만 남았다. 3월 14일에 구글 개발자 블로그에 Associate Android Developer 인증 프로그램에 관한 포스트가 올라왔다. 작년에 소개 영상을 보기는 했는데 그동안 완전히 잊고 있다가 이 포스트를 보고 생각이 났다. 사실 이쪽 업계 종사자들은 대체로 자격증을 포함한 각종 능력평가를 …

Associate Android Developer 응시 후기 Read More »