일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- List
- GeometryReader
- 상단 탭바
- DataBinding
- SwiftUI
- ios
- notifychanged
- Swift Package Manager
- scrolling tab
- UIViewControllerTransitioningDelegate
- detect url
- pod install
- 스크롤 탭
- development language
- base64 변환
- convert base64
- ViewBuilder
- DevelopmentRegion
- Android
- swift
- 개발자 면접
- oberve url
- transformation.map
- Tuist
- UIPresentationController
- url 추적
- 기존 앱
- url 관찰
- swift #swift keychain #keychain 사용법
- Side Menu
- Today
- Total
목록안드로이드 (39)
버그 잡이
알람 설정시간 < 현재 시간 알람 앱에서 내가 선택한 시간이 현재 시간보다 이전시간이면 다음날로 알람 설정이 되는 것을 볼 수 있다. "이 로직은 어떻게 짜는 것일까?" "DAY_OF_YEAR" : 365일 중 오늘의 몇번째 날인지 알려준다. 다음날로 알람 설정을 하기 위해서는 기본적으로 다음과 같은 로직이 떠오를 것이다. if(알람 설정시간 < 현재 시간){ 현재 날짜 += 1 } 그런데 이렇게 했을 경우 문제는 월 마지막 날인 경우 32일에 알람이 설정된다. 이를 막기 위해서는 월마다 예외처리를 해줘야하는데 월 마지막날은 또 각기 다르기 때문에 예외처리 하기에 복잡하다. DAY_OF_YEAR을 활용하면 위의 문제를 해결할 수 있다. 366일 되는 경우만 예외처리를 해주면 되기 때문이다. if(알람 설..
나는 지금 알람앱을 만들고 있다. 알람이 시작되면 음악을 재생시켜야 하는데 '어떤 Service를 사용하는 것이 좋을까?' 결론부터 이야기하자면 아래와 같다. startService() & foregroundService 내가 만들 서비스는 음악이 재생되는 서비스이고 세부 요구사항을 살펴보자 요구사항#1 : 음악 재생상태와 버튼 상태를 동기화시킬 필요가 없다. -> UI에 영향을 줄 필요가 없다. 요구사항#2 : 1분 이상 지속되어야 한다. 서비스의 종류 서비스는 위 그림처럼 크게 두가지 방법으로 나눠서 사용한다. *startService() - 백그라운드에서 실행되고, 한번 시작된 서비스는 stopService를 호출할때까지 계속 실행된다. - 하지만 작업 결과를 호출자에게 반환하지 않기 때문에, 호출..
recyclerView에서의 클릭 리스너 구현은 매번 까먹는다. 이 기회에 정리해보자. 1. 추상메서드 - 클릭시 caller에게 클릭되었다는 사실을 알려줄 종(bell)이 바로 이 추상메서드이다. val onItemClickListener : ((Int)->Unit)? = null - 람다식으로 구현했다. int 타입 하나를 매개변수로 받고 반환값이 없는 람다 함수이다. *Unit은 java의 void와 같은 개념이다(return 값이 없음) 2. Item 클릭시 추상메서드 전달 - 이제 추상메서드를 사용해보자. - item 클릭시 추상 메서드를 실행함으로써 이벤트를 처리한다. - position만 넘겨주고 구체적인 동작은 Caller인 Activity에서 정의한다. item.setOnClickList..
내가 AlarmManager를 활용해서 만들고 싶은 앱은 notification을 띄우는 알람이 아니고 우리가 아침마다 쓰는 알람앱이다. 1. AlarmManager 기본 사용법 기본적인 흐름은 아래의 세단계이다. 1) AlarmManager 객체를 만들고 2) PendingIntent를 만들고 3) AlarmManager를 셋팅한다. (이와 관련해서 안드로이드 공식 문서에 코드와 세부 셋팅까지 친절하게 잘 나와있다.) https://developer.android.com/training/scheduling/alarms 2. Doze 모드 대응 안드로이드 앱은 화면이 꺼진 경우 배터리 최적화를 위해서 도즈가 진행된다. 이로 인해 각종 기능들이 제한을 받을 수 있다. 알람 매니저도 이에 해당한다. 기존의 ..
Room에서 다음과 같이 선언하면 그냥 쓸 수 있을 줄 알았다. @ColumnInfo(name = "word_list") var wordList: List ?= null 하지만 다음과 같이 선언하고 build를 시작하면 error가 뜬다. 에러내용은 "typerConverter를 사용할 것을 고려해봐라" 이다. 그래서 TypeConverter에 관해 찾아보니 다음 글을 찾을 수 있었다. https://stackoverflow.com/questions/44986626/android-room-database-how-to-handle-arraylist-in-an-entity 방법은 아래와 같다. 1. Converter 클래스를 만든다. - 해당 data 클래스와 같은 파일에 만들던 다른 곳에 만들던 상관없다...
* 나는 한줄을 초과해서 입력시 우측으로 계속 작성되면 좌우 스크롤이 가능한 상태를 만들고 싶었다. 찾아보니 이를 가능하게 하는 singleLine 이라는 속성이 있는데 deprecated되었다. 이를 대체할 방법으로 inputtype을 설정하면 내가 원하던 대로 우측으로 계속 생성된다.(+maxLine, line 속성이 먹히질 않는다.) '왜 그럴까?' 내 뇌피셜이지만 구글이 inputType으로 edittext 속성을 단순화 하려고 하는 것 같다. 사실 여러줄 입력할 속성은 줄 글인 경우를 제외하면 크게 없으니까 그런 경우 inputType="textMultiline" 을 쓰고 나머지는 한줄 입력이 대부분이니 취향에 맞게 inputType에서 골라쓰라는 것 같다. * 조사하면서 알게된 EditText..
Kotlin + Retrofit + Moshi 을 활용한 네트워크 통신 연습으로 Tistory API를 활용한 블로그 글 정보 json을 받아보기로 했다. 그런데.... 짜임새가 아주 거지같다. {"tistory":{"status":"200","item":{"url":"https:\/\/jinsangjin.tistory.com","secondaryUrl":"","page":"1","count":"10","totalCount":"42","posts":[{"id":"43","title":"(AAC \uc751\uc6a9) LiveData+Room+RecyclerView #DiffUtil","postUrl":"https:\/\/jinsangjin.tistory.com\/43","visibility":"20",..
내가 만들었던 앱 중에서 핸드폰 센서를 이용해서 벌레를 잡는 게임이 있다. 벌레는 4가지 종류가 랜덤으로 선택 되어 나타나고 열심히 흔들어서 카운트가 10까지 세지면 벌레가 잡히는 게임이다. 여기에는 문제가 있는데 화면이 가로/세로 전환이 될때 벌레 이미지와 카운트가 초기화 된다는 것이다. 이번에 배운 ViewModel과 LiveData를 활용해서 이 문제를 해결해보자. GetBugActivity에서 사용되는 메소드는 다음과 같다. - selectBug() : bugImg 랜덤 선택 - getBugImg() : bugImg 받아서 업데이트 - showAlert() : 카운트가 10이 될 경우 다이얼로그 띄워주기 - countUp() : 흔들림 감지될때마다 카운트 올리기 +SenSonEventListene..