전체 글

전체 글

    [Kotiln] 실행아이콘이 없는, 런처가 없는 앱 만들기

    [Kotiln] 실행아이콘이 없는, 런처가 없는 앱 만들기

    시프트+시프트로 action search창으로 Edit Configurations 설정에 들어간다. 그리고 위와같이 설정하면, 런처가 없어도 실행가능. 실행시킬 앱의 Intent-filter action명 변경 실행부 변경 intent = Intent() intent.setPackage("com.example.fcmautopopup") intent.setAction("com.example.fcmautopopup") startActivity(intent) 하지만, 기존 실행한 앱은 사라지고 새 앱이 실행되었음. flag추가해 별도의 task로 실행하도록 수정 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) [고려할 사항] 권한을 획득하고 자연스러운 종료 → 권환획득 실패..

    [Kotlin] ContentResolver 기본 : 통화내역(Call log) 조회

    [Kotlin] ContentResolver 기본 : 통화내역(Call log) 조회

    1ContentResolver란? ContentProvider가 uri로 접근경로를 열어 제공하는 데이터들을 조회하는 Query입니다.쉽게 생각해서 content uri에 db가 존재하고, 그걸 조회하는 qeury를 작성해 contentResolver로 실행한다고 볼 수 있습니다. val resolver: ContentResolver = this.contentResolver val callLogUri = CallLog.Calls.CONTENT_URI var cursor: Cursor? try{ cursor = resolver.query(callLogUri, null, null, null, null) if (cursor != null) { var maxcount = 2 while (cursor.moveTo..

    AAC MVVM - (3)AAC ViewModel + ViewBinding

    AAC MVVM - (3)AAC ViewModel + ViewBinding

    역할 : View에 필요한 데이터를 담당하고, 비즈니스 로직을 담당해 데이터를 처리한다. 즉, View와 Model 사이에 위치한다고 볼 수 있다. 애초에 나온 이유는 view와 model간의 결합도를 낮추기 위함으로, ViewModel이 View를 참조하면 의미가 없어진다, 따라서, ViewModel은 View를 참조하면 않된다. 또한, view는 model이 아닌 viewmodel을 통해서만 data에 접근가능해야 한다. AAC ViewModel을 사용했을 때, MVVM 구현에 어떤 이득이? 수명주기를 고려할 수 있기 때문, class ChronometerViewModel : ViewModel(){ private var startTime: Long = 0 fun getStartTime(): Long ..

    AAC MVVM - (2)Data binding

    AAC MVVM - (2)Data binding

    앱단위 gradle 설정 //build.gradle android{ //... dataBinding{ enabled = true } } //... } databinding을 사용할 xml을 layout으로 감싸고 data태그 추가 //xml

    AAC MVVM - (1)Live Data

    AAC MVVM - (1)Live Data

    Activity = LifecycleOwner Activity는 내부에 Lifecycle을 갖고 있다. LiveData는 Data의 변경을 관찰할 수 있는 data holder 클래스이다. 일반적인 observable과는 다르게 생명주기를 인식하고 활성상태일때 업데이트 합니다. (active : started or resumed) Live data의 데이터가 변화하면, 등록된 observer객체에 변화를 알려주고 observer의 onChanged()메소드를 실행하게 된다. LifecycleOwner에 액티비티 또는 프래그먼트를 입력해 해당 생명주기를 따르게 된다. 장점 LifeCycle을 따르므로 따로 핸들링 안해도 UI와 DATA가 동기화를 알아서 해줌 생명주기 객체와 결합되어 메모리 누수가 없음 스..

    View binding 사용해보기

    View binding 사용해보기

    findbyviewid를 쓰지 않아도 되게 해줘서 코드가 매우 간결해집니다. app level gradle //build.gradle android{ //... viewBinding { enabled = true } } //... } replace Acitivity - onCreate : setContentView ActivityCallBinding binding = ActivityCallBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); binding.layour_resource_id //바로접근가능 위의 gradle을 설정하고 sync해주면 activity이름에 맞춰 binding된 객체가 준비됩니다. activity_ca..

    lateinit var와  lazy의 차이

    lateinit var와 lazy의 차이

    lateinit var var 변수에서만 사용합니다.null 값으로 초기화 할 수 없습니다.초기화 전에는 변수를 사용할 수 없습니다. Int, Long, Double, Float (primitive type) 에는 사용할 수 없습니다. 변수에 대한 setter/getter properties 정의가 불가능합니다. lazy val변수에만 사용합니다. 호출 시점에 by lazy 정의에 의해서 초기화를 진행합니다. 초기화를 위해서는 함수명이라도 한번 적어줘야 합니다. lazy을 사용하는 경우 기본 Synchronized로 동작합니다.

    [Kotlin] retrofit2 간단한 사용법

    [Kotlin] retrofit2 간단한 사용법

    app단위 build.gradle에 추가 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' 인터넷 사용 퍼미션 허용(https) http에 접근하려면 추가로 설정을 해주어야 합니다! DTO data class Contract( @SerializedName("pName") var name: String, @SerializedName("pPhoneNumber") var phoneNumber: String, @SerializedName("pImagePath") var imagePath: String, @SerializedName("pEmail") var ..

    [Kotlin] varag

    [Kotlin] varag

    매개변수로 여러개의 값을 받을 수 있습니다. fun main(args: Array){ print("hello kotlin!\n") val n1 = varArg(1) var n2 = varArg(1, 2, 3, 4, 5) var intArr = arrayOf(1, 2, 3, 4, 5) print(n1) print("\n") print(n2) } fun varArg(vararg num: Int) = num.sum() 단, 배열을 매개변수로 입력하려면 매개변수 앞에 *를 입력해야 합니다.

    RxJAVA - CompositeDisposable 간단 정리

    RxJAVA - CompositeDisposable 간단 정리

    CompositeDisposable add 또는 addAll로 disposable을 받고 한번에 해제할 수 있는 편리한 클래스. onStop 또는 onDestroy에 disposable.dispose()로 메모리 누수를 예방할 수 있다. disposable? Observable객체에서 발행할 아이템을 정의한 후 subscribe()로 스트림을 생성해 아이템을 발행했다. subscribe()를 호출한 후에 반환되는 객체가 disposable이다. 스트림을 생성하므로 구독이 필요하지 않다면 폐기하는것이 리소스 관리에 이로우며, dispose()를 통해 가능하다. 그러므로 onComplete()로 발행작업 완료여부를 명시적으로 observable이 호출한다면, dispose()로 리소스 반환을 할 필요가 없다..

    RxJAVA - Subject 간단 정리

    RxJAVA - Subject 간단 정리

    * 개인공부를 하며 정리한 내용이므로, 부정확하거나 사실과는 다른 내용이 있을수도 있습니다. 해당사항에 대해 의견을 주시면 겸허히 수정하도록 하겠습니다. Observable과 Observer Observable을 Observer가 받아서 '반응'합니다. Observable을 단독으로 쓰진 않고, Observer이자 Observable인 subject를 주로 사용합니다. Cold / Hot Observer Hot : 생성하자마자 바로 흘려보냄 구독자의 존재여부 상관 x 구독자를 선택적으로 고려 가능 구독 시점으로부터 발행하는 값을 받는게 기본 마우스, 키보드, 시스템 이벤트 등의 주로 사용 (멀티캐스팅도 포함) Cold : 요청하고 결과를 받아옴. 일반적인 옵저버 구독하지 않다면, 데이터를 흘리지도 않음...

    [Android] SHA-1 쉽게 찾는법

    [Android] SHA-1 쉽게 찾는법

    Firebase엔 sha-1키를 요구하는데요, 다른 방법들도 많지만 가장 쉽게 찾는방법을 공유해드립니다. control을 두번 입력해주시고요 gradle signingRepor를 입력하고 엔터를 입력해주시면 아래와같이 필요한 정보가 다 출력되게 됩니다. path찾아서 확인하거나 cli tool을 설치해서 찾는방법은 너무 번거롭고, 방법도 자주 바뀌다보니.. 전 이렇게 찾아서 쓰고 있습니다..ㅎㅎ; 그럼 이만!

    Kotlin 이란?

    Kotlin 이란?

    코틀린이란? Kotlin은 2011년 7월 JetBrains이 발표한 프로그래밍 언어로, JVM에서 동작합니다. 주로 Android application 개발에 이용되며, 최근 빌드 내용을 보면 kotlin multiplatform으로 ios application도 개발할 수 있어 보입니다. 철학 실용성 다른 프로그래밍 언어에서 성공적으로 검증된 해법과 기능에 의존합니다. 특정 프로그래밍 패러다임이나 스타일을 강제하지 않습니다. 생상성 향상을 위해 '좋은 도구'를 강조합니다. 간결성 Getter, Setter와같이 번거로운 코드들은 묵시적으로 제공합니다. 길거나 반복되는 코드를 라이브러리 함수로 대체할 수 있습니다. 최소화와 간결성은 다르므로, 연산자 오버로딩은 지원하되 신규연산자는 정의하진 못합니다. ..

    M1 맥북에 Flutter 2.0 설치 및 실행

    M1 맥북에 Flutter 2.0 설치 및 실행

    사전 준비 1. ios 환경 세팅 : Xcode, CocoaPods 2. aos 환경 세팅 : Android Studio + Command-line Tools 및 안드로이드 예뮬레이터 m1 프리뷰 버전 Command-line Tools 설치법 더보기 Preferences -> Appearance & Behavior -> Sysyem Setting -> Android SDK -> SDK Tools탭에서 Android SDK Command-line Tools(latest)체크 후 Apply 혹은 ok로 설치 플루터 설치 여기 에서 flutter_macos_2.2.3-stable.zip 설치 (* flutter-fo.dev에서 (failed)라고 표시된다면 여기에서 다운로드) 더보기 적당한 위치해 압축을 풀어..

    [MySQL] 방금 수행한 질의 대상 얻어오기

    [MySQL] 방금 수행한 질의 대상 얻어오기

    최근 ios 프로젝트 중에, 업로드한 이미지를 별도 테이블에 관리해야 했다. 하여, 다른 정보는 기존 테이블에 저장되고, 이미지는 방금 저장된 테이블의 no를 fk로 가져야 했다. SELECT LAST_INSERT_ID() 를 질의문으로 사용하면 된다. 반환값은 가장 최근에 성공한 질의의 가장 가까운 AI속성값이다. 보통은 PK로 사용하는 AI속성의 인조식별자는 첫번쟤 속성값으로 두기 때문에 쉽게 사용할 수 있다. 여기서 사용하는 id는 connection 별로 별도 생성이라고 하니 꼬일 염려도 없다. 단, 질의에 성공한 질의만 반환한다!

    Code=3840 "Invalid value around character

    Code=3840 "Invalid value around character

    상황 MySQL사용을 위해 xcode에서 jsp에 접근해야 했음 원인 해당 파일이 없을 경우에 위 에러 발생 해셜 jsp path에 오타를 수정해서 해결

    Sqlite3 - database is locked

    상태 insert한 값을 바로 사용해야 했던 상황입니다. insert 후 select로 rowid를 조회해 가장 최근에 추가된 값을 불러왔었습니다. 원인 쿼리를 연속실행하니 종료-실행시점이 겹쳐서 후속작업이 실행되지 않음 해결 sqlite3_finalize(OpaquePointer?)로 stmt를 초기화 시켜주거나 sqlite3_close(OpaquePointer?)로 db를 닫아준다.

    Android에서 SQLite 사용하기 (feat.ROOM)

    Android에서 SQLite 사용하기 (feat.ROOM)

    Android 공식 개발자 홈페이지에서도 SQLite대신 ROOM을 사용하는것을 적극 권장하고 있습니다. ROOM을 적극권장하는 내용은 아래와 같습니다 SQLite는 쿼리에 대한 에러를 컴파일시 확인할 수 없다. (ROOM은 확인 가능) SQLite는 스키마가 변경되면 수동으로 SQL쿼리를 업데이트 해야한다. (ROOM은 자동으로 해줌) SQLite는 java 데이터 객체를 변경하려면 많은 boilerplate코드를 사용해야 한다 (ROOM은 필요 없음) SQLite는 LiveData나 RxJava를 위해 Observation으로 생성해 동작할 수 없다 (ROOM은 할 수 있음) 물론 간단한 사용엔 이만한 DB가 없긴 합니다. ㅎ 그렇기에 SQLite을 먼저 포스팅 해보겠습니다. 1. SQLite를 사용..

    project.pbxproj 에러 처리 (Dictionary missing, Build input file cannot be found)

    project.pbxproj 에러 처리 (Dictionary missing, Build input file cannot be found)

    이번 팀프로젝트는 Ios 프로젝트였는데요, 시작부터 엄청나게 충돌이 일어나고 빌드가 안되고 파일을 못찾고... 난리도 아니였습니다. ios에 통달한 분이 계셔서 충돌을 해결해주고 구조적으로 충돌안나게끔 관리해주면 좋았겠지만... 없는데 어떻하겠습니까. ㅋㅋㅠ 이미 문제는 일어났고 처리법도 알아내서 포스팅 합니다. 0. 뭐하는 친구인가? 프로젝트의 설정이 적혀있는 파일입니다. 프로젝트 내부에서 생성된 파일들을 파일 유형에 따라 reference를 저장합니다. 파일 네비게이션에 있는 그룹과 파일의 reference를 가지고 있으며, 그룹으로 정렬되있는 정보도 저장하고 있고 그 외 특수한 경우도 저장하고 있습니다. 굳이 비슷한걸 따지자면... 안드로이드가 Activity를 추가하면 매니페스트에 추가가 되지요?..

    Kotlin의 옵셔널 처리

    Kotlin의 옵셔널 처리

    코틀린은 스위프트와 같이 null safe를 위해 ? 또는 !!를 지원한다. ? var inputedStr: String? = leadline()?.toUpperCase() 해석 : 입력값이 null이 아니라면 대문자로 바꿔 inputedStr에 저장하고, 입력값이 null이라면 inputedStr는 null 이다. ?: var inputedStr: String? = leadline()?.toUpperCase() ?: "none" 해석 : 입력값이 null이라면 우항은 "none"을 반환 * ?: 는 return,throw도 넣을 수 있다 ! val title: String = str!! 해석 : 강제로 null이 아님을 선언합니다. 그리고 NPE이 발생하더라도 해당 라인을 명확히 지목해 줍니다. let..