일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 서비스 vs 쓰레드
- 안드로이드 레트로핏 crud
- rxjava cold observable
- 클래스
- 안드로이드 os 구조
- 안드로이드 레트로핏 사용법
- jvm이란
- 플러터 설치 2022
- 서비스 쓰레드 차이
- 스택 자바 코드
- ar vr 차이
- 안드로이드 유닛 테스트
- 안드로이드 유닛 테스트 예시
- 2022 플러터 설치
- 안드로이드 라이선스 종류
- android ar 개발
- rxjava disposable
- 스택 큐 차이
- rxjava hot observable
- 안드로이드 라이선스
- 멤버변수
- Rxjava Observable
- 2022 플러터 안드로이드 스튜디오
- android retrofit login
- 자바 다형성
- 안드로이드 유닛테스트란
- 객체
- 큐 자바 코드
- jvm 작동 원리
- ANR이란
- Today
- Total
목록분류 전체보기 (1072)
나만을 위한 블로그
로그캣 통한 예외 로깅 로그를 보고 예외를 추적하는 기본 도구다. 예외가 발생하면 시스템은 예외 타입, 메시지, 예외가 발생한 코드 라인을 포함해 자세한 스택 트레이스를 로그캣에 기록한다. 키워드를 써서 로그캣 로그를 필터링해 예외에 집중할 수 있다. try-catch를 사용한 예외 처리 이걸 쓰면 예외를 제어된 방식으로 처리하고 코드의 중요 부분에서 앱 크래시를 방지할 수 있다. 전역 예외 핸들러 전용 Thread.setDefaultUncaughtExceptionHandler를 써서 전역 예외 핸들러를 설정하면 앱 전체에서 처리되지 않은 예외를 잡을 때 도움이 된다. 중앙 집중식 에러 보고 or 로깅에 유용하다. class MyApplication : Application() { override ..
쓰레드를 관리하고 비동기 통신 처리를 위해 함께 작동하는 컴포넌트다. 백그라운드 쓰레드에서 작업을 수행하면서 UI 업데이트를 위해 메인 쓰레드와 상호작용하기 위한 필수 컴포넌트다. Looper 쓰레드를 살아있게 유지해서 메시지 or 작업 큐를 순차 처리하는 안드로이드 쓰레딩 모델의 일부. 메인 쓰레드, 다른 워커 쓰레드에서 핵심 역할을 한다.메시지 큐를 지속 모니터링하고 메시지나 작업을 적절한 핸들러에 가져와 디스패치하기 위해 사용한다. 메인 쓰레드엔 기본으로 루퍼가 있지만 워커 쓰레드는 명시적으로 준비해야 한다.Looper.prepare()로 쓰레드에 루퍼를 연결하고 Looper.loop()를 써서 루프를 시작한다. val thread = Thread { Looper.prepare() // 스레드..
안드로이드 6(api 23)부터 앱은 설치 시 자동으로 권한을 얻는 대신 런타임에 위험 권한을 명시적으로 요청해야 한다.이 방식은 유저가 필요할 때만 권한을 허용하게 해서 개인정보 보호를 강화한다. 권한 선언, 확인 권한 요청 전에 앱은 매니페스트에 해당 권한을 선언해야 한다. 런타임 시에는 유저가 해당 권한이 필요한 기능과 상호작용할 때만 권한을 요청해야 한다.유저에게 요청하기 전에 ContextCompat.checkSelfPermission()을 써서 권한이 이미 부여됐는지 확인하는 게 중요하다. 권한이 부여된 경우 해당 동작은 계속 진행할 수 있으며 그게 아니면 앱은 유저 권한을 올바르게 요청해야 한다. 권한 요청 권장되는 방법은 권한 처리를 단순화하는 ActivityResultLauncher AP..
안드로이드에서 정수 키를 객체 값에 매핑하는 자료구조. 해시맵과 유사하다. 정수 키 사용에 최적화돼 있어서 정수 기반 키를 쓸 때 일반적인 Map 또는 해시맵보다 메모리 효율성이 높은 대안이다. 메모리 효율성 : 해시맵은 키밸류 매핑에 해시테이블을 지원하지만 SparseArray는 자동 박싱(원시 int를 Integer로 바꾸는 것)을 피하고 Entry 객체 등 추가 자료구조에 의존하지 않는다 -> 메모리 사용량이 줄어듬성능 : 매우 큰 데이터 셋에선 해시맵보다 느리지만 메모리 최적화 때문에 중간 크기 데이터 셋에선 더 나은 성능을 제공null 키 없음 : 키로 원시 정수만을 취급해서 null 키를 허용하지 않는다 사용법은 안드로이드에서 Map을 쓸 때와 유사하다. import android.util.S..
안드로이드의 시스템 서비스. 기기에서 실행 중인 액티비티, Task, 프로세스 정보를 제공 및 관리한다.안드로이드 프레임워크의 일부로 개발자가 앱 생명주기, 메모리 사용량, Task 관리 관련 측면을 상호작용하고 제어할 수 있게 한다. 주요 기능 Task, 액티비티 정보 : 실행 중인 Task, 액티비티, 이것들의 스택 상태의 세부정보를 가져올 수 있다. 개발자가 앱 동작을 모니터링하고 시스템 리소스 사용량을 파악할 수 있게 한다메모리 관리 : 시스템 전체의 메모리 사용량 정보를 제공하고 앱 별 메모리 소비량, 시스템 전체 메모리 상태를 포함한다. 앱 성능을 최적화하고 low memory 상황을 처리할 수 있다앱 프로세스 관리 : 실행 중인 앱 프로세스, 서비스 세부 정보를 쿼리할 수 있다. 앱 상태 감..

※ 이 글의 코드는 예시 코드기 때문에 실제로 사용하려면 반드시 리팩토링한다 다운로드 매니저는 장기간 실행되는 HTTP 다운로드를 처리하는 시스템 서비스다. 백그라운드에서 파일을 다운로드하고 실패 후 or 연결 변경, 시스템 재부팅 시 다운로드를 재시도한다.보통 앱 내에서 PDF나 영상, 음악 등의 파일을 다운로드하려고 하면 시계가 표시되는 부분에 다운로드 이미지가 표시되면서 유저에게 다운로드중임을 알리고 다운로드가 완료되면 다운로드 이미지가 한 번 깜박이면서 다운로드 완료를 알린다. 갤럭시를 사용한다면 굳이 설명할 필요도 없이 다 아는 플로우다. 아이폰 쓴다고요? 그럼 아쉬운거죠 각설하고 전체 코드부터 확인한다. package com.example.regacyviewexample.presentation..

오늘 날짜를 기준으로 안드로이드 16의 베타 4.1이 사용 가능하다. 미국 시간 기준으로 이미 06.11에 출시된 상태다. 내부 암호명은 바클라바라는 이름이다. 언젠간 한국에도 상륙할 안드로이드 16이니 어떤 점이 변경되는지 확인해 본다. 먼저 디벨로퍼 기준 16 이상을 타겟팅하는 앱에서 신경써야 할 사항들을 확인해 본다. 사용자 환경, UI 더 넓은 화면 선택 해제 기능 지원중단 targetSdk를 안드로이드 15(api 35)로 지정한 앱에선 전체 화면이 적용됐지만 앱 내에서 windowOptOutEdgeToEdgeEnforcement를 true로 설정해서 선택 해제할 수 있었다.이제 이 속성이 지원 중단, 사용 중지되면서 개발자가 전체 화면을 선택 해제할 수 없다. 안드로이드 15, 16 타겟팅 ..
구성 변경 시 기본 동작 액티비티 파괴, 재생성 : 시스템이 현재 액티비티의 onPause, onStop, onDestroy를 호출하고 액티비티가 새로운 구성으로 onCreate를 호출해 재생성된다리소스 재로드 : 시스템은 새 구성에 따라 레이아웃, 드로어블 등을 다시 불러와서 앱이 화면 방향, 테마 등 변경사항에 적응할 수 있게 한다데이터 손실 방지 : 재생성 시 데이터 손실을 막기 위해 onSaveInstance, onRestoreInstanceState나 뷰모델을 써서 인스턴스 상태를 저장, 복원할 수 있다 액티비티 재생성 피하기 액티비티 재시작 없이 구성 변경을 처리하려면 매니페스트의 android:configChanges 속성을 쓸 수 있다. 이것은 구성 변경을 프로그래밍 방식으로 처리하는 책임..
어떤 경우 프래그먼트는 다른 프래그먼트나 호스트 액티비티 간 1회성 값을 보내야 한다. QR 코드 스캔 프래그먼트가 그 예시다.보내는 프래그먼트에서 받는 프래그먼트로 데이터를 보내려면 아래처럼 할 수 있다. 받는 프래그먼트에 result 리스너 설정보내는 프래그먼트에서 requestKey를 써서 결과 전송 받는 프래그먼트에서 result 리스너 설정 받는 프래그먼트에선 setFragmentResultListener()를 써서 리스너를 등록해야 하고, 이 리스너가 STARTED 상태일 때 결과를 받게 해야 한다. class FragmentA : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(..
액티비티 간 데이터 전달 가장 일반적인 메커니즘은 인텐트다. 데이터는 키밸류 쌍으로 인텐트에 추가되며 받는 액티비티는 getIntent로 그 데이터를 가져온다. // 보내는 액티비티val intent = Intent(this, SecondActivity::class.java).apply { putExtra("USER_NAME", "John Doe") putExtra("USER_AGE", 25)}startActivity(intent)// 받는 액티비티class SecondActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceSta..