안드로이드 앱개발

    액티비티 상태저장의 중요성

    안드로이드 공식문서 중 페이지에 이런 말이있다. 결과를 얻기 위해 활동을 시작할 때, 메모리 부족으로 인해 프로세스와 활동이 소멸될 수 있습니다(특히, 카메라 사용과 같이 메모리를 많이 사용하는 작업의 경우 소멸 확률이 매우 높음). 이것을 그냥 넘어가면 카메라로 사진을 찍은 뒤 제출하면 앱이 종료된다는 CS를 종종 만나게될 수 있다. 처음엔 원인을 몰라 코드를 살펴보고 테스트도 여러번해보았지만 앱이 종료되는 경우를 재현할 수 없었다. 결론은 사용자의 핸드폰이 메모리 부족상태였던 것이다. 때문에 카메라앱에서 MainActivity로 돌아왔지만 MainActivity는 메모리 부족으로 이미 소멸된 상태였기 때문에 재생성되게된다. 이 과정에서 상태저장 처리를 해놓지 않았다면 MainActivity는 적절한 ..

    딥링크 구현시 intentfilter 설정 주의사항

    기존에 data 태그를 이렇게 설정되어있어 manta 스킴의 url은 모두 지원했지만 추가로 이렇게 data를 설정하면 1. manta://www.naver.com 2. https://www.naver.com 네이버 네이버 메인에서 다양한 정보와 유용한 컨텐츠를 만나 보세요 www.naver.com 이렇게 두가지 경우만을 지원한다. 즉, manta 스킴을 모두 실행하는게 아니라 저 두가지만 지원할 수 있게된다. 따라서 인텐트 필터를 나눠야한다.

    이미지 피커 라이브러리 <뭉치피커> 개발기

    회사의 앱이 TedBottomPicker라는 라이브러리를 사용하고 있었다. 하지만 안드로이드11이 나오면서 Scoped storage 대응이 필요해졌고, 자잘한 버그가 있었기에 이참에 이미지피커 라이브러리를 만들기로 했다. 결과물은 여기에서 볼 수 있다. 디자이너가 붙지 않았기에 UI는 그저 TedBottomPicker와 동일하게 만들었다. 만들면서 중요하게 생각한 것은 두가지였다. 1. Scoped Storage 대응 2. onActivityResult 함수 대신 Activity Result Api의 registerForActivityResult 를 사용하기 PhotoExt.kt 파일을 보자. 1. 카메라로 사진을 찍은 후 사진을 저장할 경로 얻기 사진을 저장할 경로를 얻을때, Android 11부터 ..

    딥링크, 앱링크, 디퍼드 딥링크, 다이나믹링크와 광고의 연결

    딥링크, 앱링크, 디퍼드 딥링크, 다이나믹링크와 광고의 연결

    1. 딥링크 딥링크는 웹에서의 링크처럼, 링크를 클릭시 앱으로 이동하는 링크를 말한다. 딥링크는 앱의 매니페스트에 인텐트 필터를 설정하는 것으로 구현할 수 있다. 이렇게 하면 https 스키마에 호스트가 manta.com인 링크로 이 앱을 열 수 있다. 즉, https://manta.com 이라는 링크를 열 경우, 앱이 핸드폰에 설치되어있으면 앱이 열린다. 하지만 https://manta.com 은 브라우저 앱도 열 수 있다. 브라우저앱은 https 스키마를 가진 링크를 열 수 있기 때문이다. 때문에 실제로 https://manta.com 을 클릭할 경우 앱 선택기에 내 앱과 브라우저 앱 중 하나를 선택하라는 선택 다이어로그가 뜬다. 2. 앱링크 만약 내가 그 다이어로그를 띄우고 싶지 않고, 바로 내 앱..

    안드로이드 라이브러리 만들때 유의사항

    1. 아이콘, 앱 이름 등을 삭제하는 것이 좋다. 만약 라이브러리를 사용하는 앱의 아이콘 이름과 라이브러리에 있는 아이콘 파일의 이름이 같다면 앱 아이콘이 라이브러리의 것으로 덮여씌워질 수 있다. 앱 이름도 마찬가지다. 이는 매니페스트 병합 규칙 마커를 사용한다고 해도 마찬가지다. 마찬가지의 이유로 라이브러리에서 사용하는 컬러, 테마 같은 리소스 이름은 고유해야한다. 패키지 이름의 일부를 이름에 적어넣도록 하자. 2. 매니페스트 병합을 신경쓰자 라이브러리를 쓴다는 것은 앱이 하나 이상의 매니페스트파일을 가지게 됨을 의미한다. 따라서 매니페스트 병합에 관한 규칙을 숙지할 필요가 있다. 그렇지 않으면 라이브브러리의 매니페스트 속성이 앱의 매니페스트 속성을 덮어씌워버릴 수가 있다. 다중 manifest 파일 ..

    사내 카페 주문앱 개발기(1): 클린아키텍쳐

    사내 카페 주문앱 개발기(1): 클린아키텍쳐

    최근 이직한 회사에서 사내 카페 주문앱을 만들게 되었다. 이름은 댕댕이 바리스타 사용자앱. 경력을 시작하고 나서 처음으로 밑바닥부터 만드는 신규 프로젝트를 맡게된 것이다. 일단 구조를 짜자. 사내보안상 코드를 공개 할 수 없어 내 깃허브에 있는 비슷한 구조의 프로젝트를 가져와보았다. 전체코드는 여기서 볼 수 있다. 이렇게 클린아키텍쳐로 짰다. 클린아키텍쳐에서는 앱의 계층을 Presentation, domain, data로 나눈다. Presentation은 Activity, Fragment 같은 UI를 담당하고 domain은 앱의 유스케이스를 정의하고 data는 외부환경으로부터 데이터를 얻는다. 나누는 이유는 한가지 변경사항이 모든 곳에 영향을 끼치지 않도록 하기 위해서이다. 예를들어 서버와 API 통신을..

    레거시 코드 리팩토링과 코틀린 마이그레이션

    레거시 코드 리팩토링과 코틀린 마이그레이션

    회사에서 자바로 된 웹앱을 코틀린으로 마이그레이션을 하는 업무를 맡았다. 자바에서 코틀린으로 마이그레이션하는건 어려운 일은 아니였지만, 문제는 앱이 오래전에 그것도 외주로 만들어져서 코드가 엉망이였다. 간단하게 설명하자면 메인액티비티에 웹뷰를 6개나 둔 다음, 그 메인액티비티의 인스턴스를 static으로 만들고 여기저기서 참조에 쓰는 구조였다. 자바스크립트 인터페이스를 모아둔 클래스인 JsHandler 와 뷰에 대한 참조를 모아둔 클래스 ViewHandler(당시에는 뷰바인딩이나 데이터바인딩이 없었다), 명령어를 int 타입으로 입력받아 명령어에 따른 처리를 하는 actionHandler 클래스 등이 있었는데 이 모든 클래스는 메인액티비티에 멤버로 있고, 다른 모든 클래스는 메인액티비티의 인스턴스를 통해..

    Service

    서비스는 시작된 어플리케이션과 같은 프로세스, 기본 스레드에서 실행된다. 하지만 서비스는 어플리케이션과는 별개의 앱처럼 동작한다. 즉, 사용자가 앱을 꺼도 서비스는 동작한다. 때문에 서비스를 멈춰주는건 프로그래머의 몫이다. 별개의 앱처럼 동작하면서도 앱의 구성요소들을 사용할 수 있는게 특징이다. 참고로 stopService는 서비스 중지를 요청할 뿐이지, 바로 멈추지는 않는다. 때문에 서비스를 사용하는 앱이나 컴포넌트가 여러개일때 A에서 stopService() -> B에서 startService() -> 서비스 중지 이렇게 되면 B의 startService요청은 묵살되기 때문에 (예상한건 A에서 stopService() -> B에서 startService() 였다) stopSelf(startId) 서비..