Flutter Background Service 실행시키기 with drift, flutter_local_notifications
도토리 앱은 나의 하이킹 루트를 기록하는 것이 핵심 기능이다. 하지만 하이킹을 하는 몇 시간 내내 앱을 포그라운드에 켜 놓고 위치 정보를 수집할 수는 없기 때문에 필연적으로 이를 전담할 백그라운드 서비스를 만들어야 한다.
도토리 앱은 나의 하이킹 루트를 기록하는 것이 핵심 기능이다. 하지만 하이킹을 하는 몇 시간 내내 앱을 포그라운드에 켜 놓고 위치 정보를 수집할 수는 없기 때문에 필연적으로 이를 전담할 백그라운드 서비스를 만들어야 한다.
이 포스트는 코틀린 동시성 프로그래밍 도서의 내용을 토대로 작성되었습니다.
도토리 프로젝트를 본격적으로 시작하기 전의 사전작업들을 기록한다.
이 포스트는 아래 블로그를 참고한 포스트입니다.
본격적인 플러터 개발에 들어가기 전 이론무장한 내용을 정리한다. 주기적으로 반복해서 읽어보며 미흡한 내용을 보완해 나갈 것.
title: “크래시 리틱스 실험” categories: - Android — 파일, 라인넘버가 같으면 Exception의 클래스명이 다르더라도 같은 에러로 판정됨. 파일, 라인넘버가 같더라도 Exception이 발생하는 함수의 이름이 다르면 다른 에러로 판정...
getBindingAdapterPosition vs getAbsoluteAdapterPosition
RecyclerView에 설정하여 왼쪽으로 스와이프 기능을 구현하게 한 ItemTouchHelper이다.
프로그래밍 패러다임
효과적인 단위 테스트 빌드(코드랩 포함) 앱 테스트하기 android/testing-samples
안드로이드 플랫폼은 예로부터 완벽 구현이 어려운 MVC 아키텍처 모델을 탈피하려는 시도가 계속되고있다. MVP에서 MVVM과 MVI까지 많은 시도와 발전이 거듭되고 있고, 구글에서 공식적으로 안드로이드 플랫폼에서 MVVM를 응용한 아키텍처 모델을 장려하며 구현에 도움이 되는 수 많...
인증 vs 인가
공식문서
참고 URL 공식문서
apk파일은 jar파일과 호환이 되며 zip파일과도 비슷하다.
Java Reference와 GC - NAVER D2를 요약 정리함. 나만 볼려고
★사용법 링크
Delegation Property(위임 프로퍼티) : 객체의 프로퍼티에 접근(get/set)하는 과정을 다른 객체에게 위임하는 것을 의미 한다. get/set을 호출할 때 로그를 찍는 로직을 예시로 든다.
어떠한 클래스를 재정의 하고 싶은 경우 보통 해당 클래스를 상속 받아 재정의 하여 사용하곤 한다. 하지만 그 클래스가 open class가 아닌 경우는 재정의를 할 수가 없는데, 이 때는 상속을 대신해 델리게이트 패턴사용한다.
외부 모듈을 사용하는 키워드는 자바와 같이 import이다. 파일이름에 확장자는 붙이지 않는다. 경로는 절대경로, 현재 모듈을 기준으로 한 상대경로를 사용할 수 있다(현재경로는 ‘.’, 상위경로는 ‘..’로 표기) import calc // calc.py파일을 임포트...
// sys >>> sys.argv // 명령행에서 전달된 인수 조회 >>> sys.exit() // 스크립트 종료 >>> sys.path // 모듈이 저장된 위치 조회
// 콘솔 입력을 받는다 >>> a = input() // 프롬프트 입력을 받는다. >>> a = input('숫자를 입력하세요')
if문 : 들여쓰기, 괄호 안쓰는 것, :쓰는 것, else if가 아닌 elif인 것 주의할 것 if 조건문: 수행할 문장1 수행할 문장2 ... elif: 수행할 문장A 수행할 문장B ... else: 수행할 문장A ...
함수 정의, 사용의 예시 def add(a, b): return a + b
파일을 열고 쓰기 f = open(파일이름, 'w') // 파일을 생성하고 연다 // r : 읽기, w : 새로 쓰기, a : 내용 추가 f.close() // 파일을 닫는다. f.write(data) // 파일에 data를 쓴다
try ~ except ~ finally구문을 사용한다.
클래스 선언 class Calculator: def __init__(self, first, second): // 생성자 self.first = first self.second = second
>>> abs(32) // 절대값 반환 >>> all([1,2,3]) // Iterable의 모든 요소가 True면 True를 반환 >>> any([1,2,3]) // Iterable의 요소중 하나라도 True면 True...
Python에서 변수를 만들 때는 ‘=’연산자를 사용하며 자료형을 지정하지 않아도 된다. 그렇다고 자료형이 없는 건 아니다.
Bool은 True와 False값을 가진 자료형이다.
튜플은 리스트와는 다르게 값을 자유롭게 바꿀 수 없고, []대신 ()안에 넣거나 괄호자체를 생략하고 만든다.
Set에는 순서가 없고 중복을 허용하지 않는다. 따라서 인덱싱이 없다.
Distionary는 순서가 없고 맵과 같이 key와 value로 구성되어 있으며 다음과 같이 생성할 수 있다.
list는 다음과 같이 정의하고 생성할 수 있으며 자료형의 종류에 상관없이 뭐든지 막 섞어서 넣을 수 있다. >>> 리스트명 = [요소, 요소, 요소,...] >>> odd = [1,2,3,4,5] >>> odd = [1,2...
공식 문서 링크
공식 문서 링크
공식 문서 링크
공식 문서 링크
테이블 삭제 : DROP TABLE 테이블명
RxAndroid는 RxJava에 몇 가지 클래스를 추가해 안드로이드 앱에서 리액티브 구성요소를 쉽게 사용하게 만드는 라이브러리
★Rx의 4가지 개념 : Observable, Observer, Subscriber, Subject
변수, 상수 선언 Kotlin : var, val Swift : var, let
테이블뷰 : 리스트를 보여주는 뷰 테이블뷰 컨트롤러가 수평적 구조를, 네비게이션 컨트롤러가 수직적 구조를 관리하여 사용자의 선택도를 높인다. 구조 : 테이블뷰 컨트롤러 - 테이블뷰 - 섹션들 - 셀 - 콘텐츠뷰 테이블 뷰를 구성하는...
사용자에게 메시지 전달하기 UIAlertController 생성자에 제목, 메시지, preferredStyle(.alert, .actionSheet)을 써준다. UIAlertAction을 생성해 UIAle...
프로젝트를 처음 생성하면 프로젝트 설정의 General설정창을 볼 수 있음 주요 항목 Bundle Identifier : 안드로이드의 패키지명 Main Interface : 앱 실행시 처음 사용할 스토리보...
★Transition : 사전적 의미로 이행, 전의 등 상태의 변화를 뜻한다. Android에서 말하는 Transition은 액티비티나 뷰의 위치나 모양 등의 변화를 뜻하며 보통 Animation과 함께 이야기 된다.
※이 포스트는 https://www.vogella.com/tutorials/AndroidDatabinding/article.html#using-data-binding-in-android-applications를 참조하여 작성했습니다.
★상태 패턴 : 상태를 객체로 나타내고, 행동을 구현한다.
★싱글톤 패턴 : 객체를 메모리에 단 하나만 올리도록 할 때 사용된다.
★빌더 패턴 : 수많은 변수를 가진 또는 생성이 복잡한 인스턴스의 생성을 간략하게 만든다.
★브릿지 패턴 : 기능부분과 구현부분을 분리한다.
★어댑터 패턴 : 호환되지 않는 두 인터페이스를 연결한다.
★추상 팩토리 패턴 : 객체의 생성을 가상화 한다.
※이 포스트는 https://d2.naver.com/helloworld/831311를 참고해 작성하였습니다.
★TreeSet이 사용하는 Red-Black Tree는 이진 탐색 트리의 성능을 향상시킨 것이다. 하지만 RBTree는… 그냥 한번 구현해 보기에는 굉장히 복잡하고 어렵고 개빡치므로 이진 탐색 트리로 먼저 구현해 보고, 이후 Red Black Tree로 개선해 보도록 하자.
★TreeSet과 그 원리는 같으나 Node에 뭔가 하나가 더 딸려서 저장된다는 것이 조금 다르다. TreeSet은 key가 정렬 기준이고, 저장된 데이터였지만 TreeMap은 데이터 Object를 key로 정렬하는 것이다. 따라서 TreeMap은 <OBJECT, KEY>...
★Set은 원소의 집합을 관리한다. 기본적인 연산은 비슷하게 추가, 삭제, 검색이다. List와 다르게 Set에 들어온 데이터들에게 순서는 없으며, 중복된 데이터는 저장되지 않는다. 순서가 없기 때문에 위치 정보 index를 가지고 검색할 수는 없다.
★Red Black Tree란 이진 탐색 트리의 치우침 문제(?)를 해결하기 위해 insert와 delete의 알고리즘을 수정한 이진 탐색 트리의 일종이다. 레드 블랙 트리는 어느정도 균형이 잡혀있는데, 여기서 균형이 잡혀있다는 말은 자료가 한쪽으로 쏠리지 않도록 어느 깊이의 노드...
★Generic class : 다루는 클래스를 정해놓지 않고 사용하는 클래스, 컴파일 시에 클래스가 확정된다.
★한쪽 끝에서만 자료를 추가하고 뺄 수 있는 선형 자료구조. 늦게 들어간 자료가 먼저 나오는 후입선출 방식의 자료구조이다.
★스윕 라인 알고리즘 : 정렬된 순서대로 처리되는 이벤트의 집합으로 문제를 모델링 하는 방법이다. 예를 들어 특정일에 손님들이 한 음식점을 언제 방문했고 언제 떠났는지에 대한 정보를 모두 알고있다고 할 때, 동시에 존재하는 모든 손님들의 수의 최대값을 구하는 문제가 있다. 손님의 ...
★한쪽으로는 넣기만 하고, 반대쪽 끝으로는 빼기만 하는 자료구조. 선입선출 방식이다. 추상구조인 큐는 다양한 방식으로 구현할 수 있고, 자바에서는 LinkedList로 구현하고 있기에 나도 LinkedList로 Queue를 만들어 봤다. 배열로 만들기도 하는데 tail이 배열의 마...
★앞의 노드와 뒤의 노드를 레퍼런스로 연결하여 리스트를 만드는 방식이다. 연속된 공간인 배열에 저장하지 않고, 메모리 상의 위치에 상관없이 리스트를 구현한다.
★배열의 원소를 직접 비교해 정렬하는 것이 아니라, 또 다른 배열에 정렬할 배열의 수를 입력한다. 그 후 갯수만큼 출력한다.
★이진 탐색은 정렬된 배열에 특정한 요소가 존재하는지 찾는 탐색 방법이다. 처음에는 전체 배열의 가장 가운데 값이 우리가 찾는 값인지를 확인한다. 찾는 값이 맞다면 탐색을 끝내고 만약 우리가 찾는 값이 가운데 값보다 크면 가운데 값의 오른쪽 배열을, 작다면 왼쪽 배열을 다시 탐색한...
★ArrayList는 프로그램 실행 동안 배열의 길이를 가변적으로 사용할 수 있게 해주는 Collection 프레임워크의 List를 구현한 구현체 중 하나이다. 기본적으로 배열이지만, 배열의 길이가 꽉 차게 되면 더 큰 새 배열을 만들고 복사하거나 하는 작업을 정의해 두었다. 직접...
★재귀호출을 이용한 정렬방식.
★버블정렬 : n개의 원소를 서로 인접한 원소들끼리 비교하여 정렬하는 알고리즘이다. n번의 라운드를 돌며 최대 n번의 비교 및 정렬연산을 수행하므로 O(n^2)의 시간이 걸리며, k번의 라운드가 끝나면 맨 뒤에서 k번째까지의 원소가 정렬된 상태가 된다.
★아래 코드는 MIN부터 MAX까지의 자연수의 집합에서 가능한 모든 부분집합을 구하여 출력하는 알고리즘이다.
★아래 코드는 MIN부터 MAX까지의 자연수의 집합에서 가능한 모든 순열을 구하여 출력하는 알고리즘이다.
★프로그램에서 사용되는 n비트 정수는 내부적으로 n개의 비트로 이루어진 이진수형태로 저장된다. 예를들어 자바의 int형은 32비트로 이루어진 이진수의 형태이며 2^32개의 수를 표현할 수 있다.
★REST(Representational State Transfer) : HTTP프로토콜을 기반으로한 분산 시스템에서의 통신을 위한 아키텍쳐 스타일(규칙들의 집합) 중 하나. RESTful API란 이 아키텍쳐 스타일을 따르는 API라는 의미이다. 이 아키텍쳐 스타일을 따름으로써 ...
★Message : 스레드간 주고 받을 정보를 담은 객체이자 MessageQueue에 들어갈 작업의 단위
★Process : 기본적으로 한 앱의 컴포넌트들은 같은 프로세스에서 동작한다. 왠만해선 바꿀 일 없지만 매니페스트의 application태그나 각 컴포넌트의 태그에 android:process속성으로 프로세스명을 지정 가능하다.
★안드로이드의 4대 컴포넌트란 안드로이드 애플리케이션을 구성하는 4가지 구성요소(Activity, Service, Broadcast Receiver, Content Provider)를 말한다. 각각의 컴포넌트들은 독립적으로 각자의 기능을 수행하며 Intent를 이용해 정보를 교환한...
★백그라운드 작업을 일일이 워커 스레드로 구현하기 번거롭기 때문에 존재하는 헬퍼 클래스
★Activity Task : 액티비티를 묶은 단위, 액티비티 스택, 액티비티들의 집이자 유저관점에서의 앱. 최근 실행한 앱 화면의 내용 하나하나가 Activity Task이자 Activity Stack.
★액티비티는 다음의 생명주기를 따른다
★알고리즘의 수행시간은 대체로 반복문에 의해 지배된다. N번 수행되는 반복문이 2개 중첩되면 수행시간은 N^2이다. 상수 시간은 그다지 중요하지 않으며 N + 100과 같은 경우는 사실상 N과 같기 때문에 그냥 N으로 표기한다.
★문제의 답이 매우 큰 경우 그 답을 특정한 어떤 수로 나눈 나머지를 대신 출력하는 문제가 종종 있다. 이런 경우 써 먹을 수 있는 나머지 연산의 법칙이 있다
★발러틸로 발음하는 것 같다…
★Vector와 ArrayList는 기본적으로 같은 매커니즘을 사용한다. Vector는 JDK 1때 만들어 졌고, 그 당시에는 List개념이 없었기 때문에 Vector가 애용되어 왔다. Java 1.2에서 ArrayList와 LinkedList가 추가되었고 1.2부터 Vector는...
★이 포스트는 자바의 정석 3판 2권 14장 람다와 스트림을 참고, 요약하여 작성했습니다.
★JVM(Java Virtual Machine)은 Java Application을 클래스 로더를 통해 읽어들여 실행하는 가상머신이다. Java로 작성된 프로그램이 OS에 구애받지 않도록 중재하는 중재자 역할, 메모리 관리, Garbage Collection을 수행한다. java파일...
★Java Application은 c나 c++처럼 동적으로 할당한 메모리를 수동으로 해제하지 않는다. GC라는 매커니즘을 통해 자동으로 메모리 해제 프로세스를 수행하므로 수동으로 해서도 안된다.
이클립스에서 스프링 프로젝트를 만들어 설정하다보면 이유없이 프로젝트에 빨간 엑박이 떠 있을 때가 있다. 대부분의 경우에 java version이 일치하지 않아서 생기는 문제이니 이를 맞춰주면 쉽게 해결할 수 있는데 문제는 여기저기를 설정해줘야 하는 것이다. 여기서 정리를 한번 해보...
여기에서 adb를 설치한다. 압축을 풀고, 해당 위치에서 cmd창을 연다.
★어노테이션을 이용한 스프링 설정 스프링 설정 xml파일의 기능을 자바파일로도 변환할 수 있다. 이때 어노테이션을 사용한다.
★Mybatis 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. JDBC로 처리하는 코드나 매핑 등의 기능을 지원한다. xml과 어노테이션을 사용해 설정한다. pom.xml에 필요한 라이브러리를 설정한다. org.my...
★Spring MVC Project(using STS) sevlet-context.xml파일에 모든 spring설정(bean객체 등)을, web.xml파일에 서블릿 설정(컨트롤러 객체 등)을 pom.xml에 maven(dependency 등)설정을 넣는다. 매핑이 자동으로 ...
★웹 프로그래밍 설계모델
★스프링 컨테이너/bean객체 생명주기 new GenericXmlApplicationContext()를 호출하는 시점에 스프링 컨테이너가 생성된다. 스프링 컨테이너가 만들어지고 나면 bean객체들이 생성이 되고, 의존주입관계 역시 함께 형성이 된다.
★ 자동 의존 객체 주입 스프링 설정파일에서 constructor-arg나 property를 사용하지 않아도 스프링 컨테이너가 해당되는 타입의 객체를 자동으로 주입해주는 기능 @Autowired나 @Resource 어노테이션으로 쉽게 구현할 수 있다.
★DI(Dependency Injection, 의존성 주입) 객체 구동에 다른 객체가 필요하게끔 만드는 프로그래밍 방법. 기능이 다른 두 객체를 분리해서 구현하는 것이다. 예를들어 건전지와 장난감을 분리하는 것
★스프링 프로젝트의 구조 프로젝트폴더 / src / main / java(자바 코드들이 위치) 프로젝트폴더 / src / main / resources 프로젝트폴더 / pom.xml
★스프링은 자바기반 프레임워크이다.
★static이란 정적변수, 메소드를 만들기 위해 붙이는 키워드이다.
★InetAddress : IP주소 관리 클래스이다. InetAddress ia = InetAddress.getByName("url");
★java.util.Scanner클래스를 사용해 콘솔 키보드 입력을 받는다.
★Process : 메모리에 적재되어 CPU가 처리하고 있는 하나의 프로그램(현재 동작중인 프로그램), 여러개가 한번에 동작하면 멀티프로세스라고 한다. ★Thread : 하나의 프로세스 내에 존재하는 독립된 작업단위, main메소드가 시작하면 기본적으로 하나의 스레드로 동작하며 여...
★Object클래스는 모든 클래스의 최상위 클래스이다. 명시적으로 상속하지 않아도 이미 상속이 되어 있다.
★추상메소드만을 가진 클래스를 인터페이스라고 한다.
★상속: 코드의 재사용을 위해 한 클래스의 멤버를 그대로 물려받은 또다른 클래스를 선언하는 것. 이때 변수는 물론 함수도 그대로 물려받게 되는데 상속받는 클래스에서 이 함수를 재정의 할 수 있다. 이것을 오버라이딩이라고 한다. 오버로딩과는 다름
★File 클래스 : 파일을 참조하는 객체이다. 사용법은 메소드 이름보면 됌
★프로그램 컴파일시, 런타임시에 더이상 진행할 수 없는 예외가 발생하면 자바런처가 예외발생을 알린다.
★Collection 프레임워크 : 무한한 데이터들을 저장하기 위해 사용하는 정형화된 형식 클래스들의 모음, 다형성을 활용하면서 다양한 자료구조를 사용할 수 있도록 자바가 만들어 놓음
★추상메소드 : 메소드의 내용은 정의되지 않고, 메소드의 접근제한자, 리턴타입, 이름, 파라메터만 선언되어있는 메소드로 abstract키워드를 사용해 선언한다. public abstract int getCount(int[] arr);
Random random = new Random(); // 랜덤객체 생성 int n = random.nextInt(100); 정수 n의 범위는 0부터 99까지 100개
★출력하는 방법(콘솔, 표준 출력) System.out.print("100\n"); // 그냥 출력 System.out.print("" + 3.14 + '\n'); System.out.println("A"); // 출력 후 줄바꿈 System.out.println("Test St...
★java의 연산자 더하기 뺴기 나누기 곱하기는 돌고래도 알기때문에 생략 % : 나머지 <, >, <=, >=, ==(같다면) != : 다르다면 ++ –(증감) a++ : 나중에증가 시켜라 ++a : 먼저 증가 시켜라 &&(and) , ||(or)
★함수의 구조 접근제한자 리턴타입 메소드이름(파라메터타입 파라메터이름, ...) { doSomething(); return 리턴값; }
★이름규칙(중요) class : 대문자로 시작(합성어의 첫 글자는 대문자) HelloJava 메서드 : 소문자로 시작 (합성어의 첫 글자는 대문자) helloJava() 필드 : 소문자로 시작 (합성어의 첫 글자는 대문자) helloJava 상수 : 모두 대문자(...
★if문 if (조건문) { System.out.println("첫번째 조건에 ㅇㅋ"); } else if (조건문) { System.out.println("첫번째 조건에는 ㄴㄴ후 두번째 조건에는 ㅇㅋ"); } else { System.out.println("첫번째 조건에 ...
★클래스는 c언어의 구조체+메소드를 얹어놓은 것이다. 현실세계에 존재하는 객체들의 속성값과 기능을 추상화하는 역할을 한다.
★배열이란? 동일한 자료형으로 메모리에 연속으로 할당된 형태. 한번 만들어지면 길이를 변경할 수 없음. 배열의 각 요소는 0번부터 번호로 접근
★접근 제한자 : 관리를 편하게 하기위해 사용자의 접근을 제한한다. private : 해당 클래스 내부에만 공개 protected : 상속 클래스에서만 접근 가능 package : 패키지 내에서만 접근 가능(default) public : 모든 영역에서 접근 가능
★JQuery는 자바스크립트를 간소화 해서 사용하기 위한 것이다.
★구조체 : 배열이 같은 자료형의 변수들 여러개를 관리하기 위해 만드는 자료형이라면, 구조체는 서로 다른 자료형을 모아서 관리할 수 있도록 만든 ‘사용자 정의 자료형’ typedef struct Student { // 변수가 아니다!! -> 자료형 char name[20]...
★포인터 : C언어는 포인터 변수를 이용하여 컴퓨터의 메모리에 직접 접근하여 값을 대입하거나 변경할 수 있다. 잘 사용하면 유용한 도구가 되지만 실수할 경우 프로그램이 구동되지 않는 상태가 될 수 있다.
★입력값에 따라서 다른 결과값을 반환하는 코드의 집합 : 함수
★제어문 : 프로그램의 흐름을 제어한다 분기(if, switch~case) 반복(while, for, do~while) 기타(break, continue)
★표준 콘솔 출력 함수 : printf(서식문자를 포함한 문자열, 입력값…) 서식문자를 입력값으로 대체하여 전체 문자열을 출력한다
★자료형 : 데이터의 형태를 지정한다. 대입 혹은 연산시에 자료형이 일치해야 한다.
★글 쓰기 문법 Jekyll은 기본적으로 markdown문법을 지원하므로 현재 설정된 markdown언어가 곧 기반 문법이다 현재 나는 kramdown을 기반으로 작성중이다.
★이제 게시글을 만들어 보…기 전에 왼쪽에 카테고리를 나타내 줄 사이드 바가 하나 있었으면 좋겠다
★_config.yml
★준비 Visual Studio Code를 설치
★릴리즈 버전에 해당하는 커밋 버전은 달라져서는 안된다. 그러나 master branch가 가리키는 최신 commit은 유동적이어야 한다.
★원격 저장소에 저장하기
★Git hub는 원격저장소를 제공해주는 대표적인 서버이다.
★용도별로 다양한 갈래의 버전을 관리해야 할때 이 기능을 사용할 수 있다.
★git은 버전관리 시스템이고, gitbash로 다룰 수 있다. 기본적으로 리눅스와 커맨드가 비슷하다.