목록Programming (132)
외로운 Nova의 작업실
- 저장소 안드로이드 기기에 데이터를 저장하는 방법은 크게 3가지로 나뉩니다. 데이터베이스, 파일, 프리퍼런스를 이용하는 방법입니다. 모두 자주 사용하므로 각각의 특징과 구현 방법을 살펴보겠습니다. 이번장에서는 데이터베이스를 사용하는 방법입니다. - 데이터베이스 안드로이드폰에서 이용하는 데이터베이스 관리 시스템은 오픈소스로 만들어진 SQLite입니다. 외부앱에서는 접근할 수 없습니다. 코드에서는 SQL 질의문만 작성하면되고 실제 데이터는 SQLite가 관리해줍니다. - 질의문 작성하기 질의문을 어떻게 작성하는지 먼저 코드로 보겠습니다. val db = openOrCreateDatabase("age", Context.MODE_PRIVATE, null) //create table db.execSQL("cre..
- 주소록 앱 연동하기 주소록은 가장 많이 이용하는 안드로이드의 기본앱입니다. 핸드폰의 주소록 앱을 연동하여 주소록 목록을 띄우고 전화번호를 가져와보도록 하겠습니다. 프로바이더를 사용할때는 query의 uri가 굉장히 중요합니다. 먼저, 매니페스트 파일에 퍼미션을 설정해줍니다. 이제 사용자에게 퍼미션을 얻어내는 코드와 주소록의 프로바이더에게 쿼리를 보내고그 값에따라 데이터를 받아옵니다. 아래는 메인 액티비티.kt 파일입니다. class MainActivity : AppCompatActivity() { lateinit var path: String override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) v..
- 콘텐츠 프로바이더 콘텐츠 프로바이더는 앱끼리 데이터를 연동하는 컴포넌트입니다. 다른앱의 데이터를 사용할때 콘첸츠 프로바이더를 이용합니다. 이때 데이터는 대상 앱의 데이터베이스나 파일 또는 앱에 할당된 메모리에 있습니다. 콘텐츠 프로바이더를 이용하면 이런 저장소에 있는 데이터를 가져오거나 수정할 수 있습니다. - 콘텐츠 프로바이더 만들기 먼저 다른 앱들이 저의 앱의 저장소를 사용할 수 있도록 저의 앱에 콘텐츠 프로바이더를 만들어보도록 하겠습니다. 먼저 외부앱이 사용할 수 있는 함수들을 만들어줍니다. 아래는 MyContentProvider.kt 파일입니다. class MyContentProvider: ContentProvider() { override fun delete(uri: Uri, selectio..
- 잡 스케줄러 잡 스케줄러는 앱실행시 구동되는 백그라운드가 아닌 특정 상황에서 실행되는 백그라운드입니다. 예를들어 네트워크가 와이파이일때, 배터리가 충전상태일때등등에만 실행되게끔 만들 수 있는게 잡 스케줄러입니다. 또한 실행주기도 정할 수 있어 일정 주기마다 실행되게끔 할 수 있습니다. - 잡 스케줄러의 구성요소 잡 스케줄러의 구성요소는 아래와 같습니다. 잡 서비스 : 백그라운드는 어떻게 돌아가는지 설정합니다. 잡 인포 : 잡 스케줄러가 어떤 상황에서 돌아가는지 설정합니다. 잡 스케줄러 :시스템에 잡스케줄러를 등록합니다. - 잡 서비스 잡 서비스를 만드는 방법을 알아보겠습니다. 잡서비스는 개발자가 만드는 서비스이므로 매니페스트에 태그로 등록합니다. 또한 아래와 같이 퍼미션도 등록해줍니다. 그런다음 Jo..
- 백그라운드 제약 액티비티를 제외한 나머지 컴포넌트는 화면을 구현하는 용도가 아니라 백그라운드에서 작업을 처리할 목적으로 사용합니다. 그런데 예전에는 앱을 실행해 화면이 출력된적이 없는 상황에서도 백그라운드에서 작업을 처리할 수있었지만 안드로이드 8버전부터는 제약을 받습니다. 따라서 브로드캐스트 리시버나 서비스를 이용할때는 백그라운드 제약에 관해 잘 정리해둬야합니다. - 리시버의 백그라운드 제약 브로드캐스트 리시버는 암시적 인텐트로 실행할 수 없습니다. 위처럼 매니페스트 파일에 등록하고 아래처럼 다른 클라이언트 앱에서 코드를 실행하면 리시버는 받지못합니다. val intent = Intent("ACTION_RECEIVER") sendBroadcast(intent) 암시적 인텐트는 registerRece..
- IBinder 객체 바인딩 앞 장에서 살펴본것 처럼 서비스를 실행하는 함수를 2개 제공하는 이유는 서비스를 이용하는 상황을 2가지로 구분하기 위해서입니다. 다음 그림처럼 액티비티에서 startService()함수로 서비스를 실행했다고 가정해봅시다. 이처럼 백그라운드 작업은 필요하지만 액티비티와 데이터를 주고받을 일이없는 등 서로 관련이 없다면 startService()함수로 서비스를 실행하면 됩니다. 그런데 어떤 경우에는 서비스와 액티비티가 상호작용 해야할때가 있습니다. bindeService()는 이러한 목적으로 호출하는 함수입니다. - 실습 메인 액티비티.xml에 service라는 텍스트뷰를두고 원래는 service return 이라는 문자열이 이였다가 서비스쪽에 의해 문자열이 바뀌는 코드를 짜보..
- 서비스 서비스는 오래 걸리는 작업을 백그라운드에서 처리할 수 있게 해주는 컴포넌트입니다. 따라서 화면을 구현하지않고 서비스 역시 안드로이드의 컴포넌트이므로 생명주기를 시스템에서 관리합니다. - 서비스 생성과 실행 서비스 컴포넌트는 Service 클래스를 상속받아서 작성합니다. 다양한 생명주기 함수를 재정의할 수 있지만 onBind()는 필수 입니다. 아래는 생성 예시입니다. class Myservice: Service(){ override fun onBind(intent: Intent?): IBinder? { return null } } 서비스도 컴포넌트이므로 매니페스트에 등록해야합니다. 만일 암시적 인텐트로 하려면 intent-filter 태그를 등록해줍니다. 서비스를 실행할떄는 2가지 함수가 있는..
- 정규화 기능 다양한 URL은 정규화를 거쳐 하나의 URI를 표현하게됩니다. 예를들어 마지막 /가 없다면 /를 채워주고, 대문자를 모두 소문자로 변경해줍니다. 정규화과정중 유용한 기능은 raw한 tab키가 들어가면 없애준다는 것입니다. 이는 xss 필터링을 피할때 좋습니다. raw한 tab키를 얻으려면 파이썬을 이용합니다. 위와같이 입력하고 탭키를 얻어낼 수 있습니다. 밑에는 사용 예시입니다. Click me! //위 코드를 아래와 같이 변경할 수 있습니다. Click me! 단 정규화기능은 매개변수쪽에는 적용되지않습니다.
- HTML 인코딩 HTML의 속성과 태그부분에 사용할 수 있는 인코딩이 있습니다. 바로 아래와 같습니다. Symbol ASCII Decimal Code ASCII Hexadecimal Code HTML Decimal Code HTML Hexadecimal Code HTML Name Code Comments Character Type ^@ 0 0 � � - null character control ^A 1 1   - start of header control ^B 2 2   - start of text control ^C 3 3   - end of text control ^D 4 4   - end of transmission c..
- Unicode escape sequence 괄호를 제외한 문자들을 코드문자로 변경할 수 있습니다. 예시를보면 빠른 이해가 됩니다. 아래는 기본적인 alert()함수예제입니다. alert(1) 위 코드를 유니코드 문자를 사용해서 아래와 같이 사용할 수 있습니다. 유니코드 0061은 a입니다. \u0061lert(1) 아스키코드는 안되지만 유니코드는 가능합니다. - Computed member access 딕셔너리 객체에 접근할때 문자열을 연산할 수 있습니다. 아래는 기본적인 document객체입니다. document("cookie") 위 코드를 아래와 같이 변경할 수 있습니다. document["coo" + "kie"] 아래와 같이 문자열의 경우 아스키코드값도 집어넣을 수 있습니다. document['..