안드로이드 개발 재개 from 2020 #2 구글플레이 등록

Posted by ironmask84
2021. 1. 23. 18:45 나는 프로그래머다!/Java & Android




2번째 안드로이드 개발 일기다..

가정이 생기고, 아이가 생기고,

이것저것 할일이 늘어나다보니,

뭐 하나 집중하기가 쉽지 않다...


그래도 요즘은 또 코로나 시대로 인해..

집 밖에 나갈일이 적다 보니,

집에서 할일들에 집중을 해야하는데...

아직 끝나지 않은 원하는 부서이동 및 나의 이직 도전?에

올해도 큰 산이 많이 남아있다.


안드로이드 개발의 목적은 앞서 얘기했듯,

IT개발의 감각 살리기 및 가능하다면 광고 수익도...

그리고 지금 업무에 계속 있게 된다면,

앱 하나 좋은거 만들어서 평가 좀 잘 받아보기..

그래야 진급에 가까워지기도 한다.


이번에는 25달러 주고 산 구글플레이 개발자 권한으로

앱을 등록해보기.

그냥 앱 만들어서 뚝딱 올리면 될 줄 알았더니,

생각보다 기입해야하는 항목이 많고,

요즘 코로나로 구글플레이 등록에도 기간이 길어지는

차질이 있는것 같다. 

앱을 업로드한지 거의 2주가 지나서야 활성화가 되었다는 것


   
 25달러 결제를 마친 후 환영메세지! 

  
 뭔가 혜택이 많은 듯 아닌듯 기능이 많나... 

  
 하나하나 익혀봐야할듯.. 그전에 제대로된 앱이나.. ㅎㅎ 



 ironmask 누군가 쓰고 있다... 


 여러분에게 행운을 가져다 주겠다는 로또.. 


 스토어 등록정보 설정에도 사진이 앱 사진이 몇장 필요해서 괜시리 번거로웠음.. 



 앱 테스트를 자동으로 해주겠다는 건지.. 아직은 기능이 없기에  



 컨텐츠 등급도 설정하고~~ 






 출시 시작을 해보자고!~ 


 전반적인 앱 출시 내역을 보여주는 화면들.. 


 전반적인 관리화면을 보여주는 대시보드... 드디어 활성화가 되었따!! 




 
이 댓글을 비밀 댓글로

안드로이드 개발 재개 from 2020 #1

Posted by ironmask84
2021. 1. 18. 18:16 나는 프로그래머다!/Java & Android




컴퓨터공학을 전공하면서 Java를 배웠고..

직장인이 되어 휴대폰 SW개발을 하면서.. C로 시작해서..

안드로이드 스마트폰이 유행하면서 다시 Java를 하다가..


이제는 프로그래밍과는 관련없는 업계의 IT직군? 으로 이직을 해있어서..

근 2년 동안은 겨우겨우 노력해서 2019년엔 자바로 프로그램 하나 개발해서

직장 내 자체 공모전에 출품하고..

2020년엔 안드로이드 앱 하나 해보자 해보자 하면서...

감각도 잃고, 의지도 좀 없어서 힘든 가운데 있지만...

11월 부터 계획을 세우고, 내가 좋아하는 도서관에서 책 3권 빌렸다.

항상 이렇게 뭔가 도전할 때는 시작할 때가 많이 설레인다.. ㅎㅎ


그리고 앞으로의 내 커리어와 직장 생활에 있어서

IT는 계속 되어야 하기에..

꾸역꾸역 안드로이드 개발 책을 펼쳐보고 있는 중이다..

이번 앱 개발 목표는 광고까지 심어서 구글플레이에 출품하여, 수익 도전해보기...


3년전만 해도 어느정도는 알았는데.. 아니 5년 전인가 ㅜㅜ

안드로이드 개발에 손땐지 5년쯤은 되었구나;;;

안드로이드 스튜디오가 막 나올 때쯤 이클립스를 계속 사용하다가,

개발 경험이 끊긴 것 같다..


그래서 이제 다시 살포시 해보려고..

안드로이드 스튜디오를 설치하고...

그 때 기억에도 안드로이드 스튜디오가 너무 기능이 많고, 무겁기도 했고..

그런데 익혀두면, 확실히 능률적인 부분도 많긴 할듯...


Do it! 안드로이드 앱 프로그래밍 책이 제법 설명이 잘되어 있는듯 하다.

따라 해보기가 수월함.. ㅎㅎㅎ

그리고, 처음으로 구글플레이에 앱을 등록해보기도 함.

우선, 개발자 등록을 play.google.com/console 에서 25달러 주고 해야함.

평생 앱 업로드가 가능하니까 25달러 쯤이야!





위 과정으로 개발 계정이 만들어지고!

다음 포스팅은,

앱 하나 만들어서 구글플레이에

업로드하는 과정을 보여주겠다!



 
이 댓글을 비밀 댓글로

안드로이드 기본개념 면접대비 정리

Posted by ironmask84
2019. 7. 15. 22:31 나는 프로그래머다!/Java & Android



안드로이드가 나온지도 10년이 지났다.

우리나라에 막 나타나기 시작한 것이 2009년 쯤이니..

아직도 스마트폰은 안드로이드가 우세다.

아이폰 OS를 제외하면 견줄 것이 없다.


구글의 무서움은 모바일폰에서 그치지 않는다.

LTE, WiFi, Bluetooth 등을 활용한 무선통신이 가능한 기기들

모두의 시장을 점유하기 위해, 즉 IoT 시장을 차지하기 위한

다양한 용도의 OS들을 만들어가고 있다.


어찌되었든 아직까지도 기본은 안드로이드로 시작한다.

안드로이드는 리눅스를 기반으로해서 C, C++, Java 등

다양한 언어를 활용해 구성되어있는 플랫폼이다.

WiFi, LCD, LTE 등 다양한 HW를 구동시키는 드라이버단,

그 위에 이를 컨트롤하는 Hal단,

그 위에 이를 컨트롤하는 Framework단

그 위에서 움직이는 다양한 App과 Service 들...


너무나 방대하기에 이 플랫폼을 활용하는 것도 

그때 그때 찾아보고 공부하지 않으면 힘이 든다.

구글은 이렇게 방대한 플랫폼을 오픈형으로 키웠고

이러한 생태계를 형성함으로써 

IT 시장의 점유율을 높인 무서운 정책을 펼친 회사다.


각설하고...

안드로이드를 활용한 취업시장은
아직 유효할 듯 하다는 것이 포인트!!

이러한 안드로이드를 조금 안다고 면접장에서 방귀를 끼려면

아래에 정리한 것들을 참고하시라.
어디서 본 정보를 취합하고 내 생각도 더한 자료 이다.


보충이 필요한 부분은 댓글로 언제나 환영이다.

Q0. 안드로이드의 실행환경에 대해서 간단하게 설명하시오.

안드로이드는 크게 4가지 실행환경으로 구성되어있습니다. 가장 하단부터 리눅스 커널, 라이브러리, 어플리케이션 프레임워크, 어플리케이션 순서입니다. 리눅스 커널은 OS로 안드로이드 스마트폰의 다양한 하드웨어(화면, 카메라, 블루투스, GPS, 메모리 등)를 관리합니다. 라이브러리는 안드로이드에 있는 다양한 기능(UI 처리, 미디어 프레임워크, 데이터베이스, 그래픽 처리, 웹 킷 등)을 소프트웨어적으로 구현해 놓은 환경 뿐만 아니라 안드로이드 앱을 구동해주는 dalvik 가상머신과 코어 라이브러리까지 포함하는 영역입니다. 어플리케이션 프레임워크는 사용자의 입력(액티비티, 윈도우, 컨텐츠, 뷰, 노티피케이션 등) 또는 특정한 이벤트에 따라 출력을 담당하는 환경을 말합니다. 마지막으로 실제로 동작하는 앱이 설치되는 환경인 어플리케이션이 있습니다.


Q1. 안드로이드는 다른 플랫폼에 비해 어떤 장점이 있는가?

첫째로 안드로이드를 구성하는 모든 소스가 오픈소스로 무료로 개방되어있어 비용적인 부담이 없습니다. 또한 전 세계의 수많은 개발자로부터 피드백을 받아 수정되기 때문에 안정성과 버그 수정이 빠릅니다. 그 밖에도 원한다면 소스를 다운 받아 수정해서 쓰기 편리합니다. 둘째로 자바를 주 언어로 사용하고 있기 때문에 많은 세계적으로 점유율이 높은 자바 개발자들이 쉽게 개발할 수 있습니다. 셋째로 리눅스 커널을 OS로 채택했기 때문에 다양한 하드웨어에 대한 드라이버 소스가 풍부합니다. 마지막으로 구글의 다양한 앱과 연동이 매우 편리하며 다른 플랫폼에 비해 앱간 연동에 너그러운편입니다.


Q2. 안드로이드 프로젝트 구성요소에 대해서 설명하시오.

libs : 프로젝트에서 사용하는 다양한 라이브러리 소스가 저장되는 공간입니다.

androidTest : 앱의 일부 코드를 테스트하기 위한 소스를 저장하는 공간입니다.

java : 자바 코드를 저장하는 공간입니다. 표준 자바와 동일하게 패키지를 이용한 하위 디렉토리 생성 방식을 사용합니다.

res : 리소스(이미지, xml 레이아웃, 메뉴, 값)를 저장하는 공간입니다.

AndroidManifest.xml : 앱에 대한 전체적인 정보를 담고있는 파일입니다. 앱의 구성요소와 실행 권한 정보가 정의되어있습니다.

project > build.gradle : 프로그래머가 직접 작성한 그래들 빌드 스크립트 파일입니다.

gradle > build.gradle : 앱에 대한 컴파일 버전정보, 의존성 프로젝트에 대한 정의가 되어있는 파일입니다.


Q3. 안드로이드에서 다국어 지원을 위해 해야할 작업에 대해서 설명하시오.

다국어 지원을 위해서는 value resource file을 따로 생성해주는 방식으로 사용합니다.

'values > 마우스 오른쪽 버튼 클릭 > value resource file > 리소스 파일 이름을 strings로 입력 > available qualifiers 탭에서 locale 선택 > language 탭에서 언어 선택 > specific region only에서 세부 국가 선택'

파일을 생성하면 디렉토리의 이름은 values-국가코드(예를 들어 values-kr) 형식으로 생성되며 내부에 strings.xml 파일이 생성됩니다. 해당 파일에 string의 name 값은 동일하게 유지한 후 해당 국가의 언어로 번역하여 추가하면됩니다.


Q4. 안드로이드 매니페스트(android manifest) 파일에 대해서 설명하시오.

안드로이드 매니페스트는 앱의 이름, 버전, 구성요소, 권한 등 앱의 실행에 있어서 필요한 각종 정보가 저장되어있는 파일입니다. 반드시 존재해야하는 xml 형식의 파일로 안드로이드 프로젝트의 최상위에 위치하고 있습니다.

가장 최상위는 manifest 태그가 위치하고 있습니다. manifest 태그에는 패키지명, 앱 버전 코드, 앱 버전 이름을 정의합니다.

application 태그에는 앱 아이콘, 앱 이름을 정의합니다.

activity 태그에는 액티비티의 클래스명과 액티비티 이름을 정의합니다. 하위에는 intent-filter 태그를 이용하여 액티비티에 대한 인텐트 작업시 필요한 action과 category를 정의합니다.

service, receiver, provider 태그에는 각각 서비스, 리시버, 프로바이더에 대한 내용을 정의합니다.

permission 태그에는 앱에서 필요한 권한에 내용을 정의합니다.

그 밖에 최소 안드로이드 SDK 버전을 지정하는 uses-sdk와 다른 패키지를 등록할 수 있는 uses-library 태그 등이 존재합니다.


Q5. 디스플레이(display), 윈도우(window), 서피스(surface), 뷰(view), 뷰 그룹(view group), 뷰 컨테이너(view container), 레이아웃(layout)에 대해서 설명하시오.

디스플레이 : 안드로이드 단말기가 가지고 있는 하드웨어 화면을 의미합니다.

윈도우 : 안드로이드에서 실행되는 앱이 그림(뷰)을 그릴 수 있는 영역을 의미합니다. 사용자로부터 입력(터치, 키) 이벤트를 받아 앱에 전달합니다.

서피스 : 윈도우에 그림(뷰)을 그릴 때 그림이 저장되는 메모리 버퍼를 의미합니다.

뷰 : 사용자 인터페이스를 구성하는 최상위 클래스를 말합니다. 윈도우의 서피스를 이용하여 화면에 어떤 모양으로 그림을 그릴지와 발생하는 이벤트를 어떻게 처리할 것인지에 대한 기능을 구현하고 있습니다. 뷰 중에서 일반적인 제어 역할을 하고 있는 것들을 위젯이라고 합니다.

뷰 그룹 : 여러개의 뷰를 포함하고 있는 뷰를 의미합니다.

뷰 컨테이너 : 다른 뷰를 포함할 수 있는 뷰를 의미합니다. 대표적으로 리스트 뷰(list view), 스크롤 뷰(scroll view), 그리드 뷰(grid view) 등이 있습니다.

레이아웃 : 뷰 그룹 중에서 내부에 뷰를 포함하고 있으면서 해당 뷰를 어떻게 윈도우에 배치할지 정의하는 관리자 역할을 하는 클래스 말합니다.


Q6. 인플레이션(inflation)이란 무엇인가?

xml 레이아웃 파일로 정의한 정보를 런타임에 setContentView 메소드가 호출됨에 따라 메모리 상에 객체로 만들어주는 과정을 말합니다. 이 과정에서 xml 레이아웃 파일에서 뷰에 id를 설정하고 해당 id가 R.java 파일에 주소 값으로 환원되며 findViewById 메소드와 id를 이용하여 코드 상으로 뷰 객체를 가져와 제어할 수 있습니다.


Q7. 안드로이드에서 색상을 지정하는 다양한 방식은 어떤 것들이 있는가?

#RGB, #ARGB, #RRGGBB, #AARRGGBB 총 4가지 방식이 있습니다. R은 붉은색, G는 초록색, B는 파란색의 정도를 나타내며 A는 알파 값 즉 투명도를 나타내는 수치입니다. 각각의 요소는 16진수(0부터 F까지)로 표현합니다.


Q8. 안드로이드의 크기를 표현하는 다양한 표현방법에 대해서 설명하시오.

픽셀(px) : 화면의 픽셀을 의미합니다.

밀도 독립적 픽셀(dp, dip) : 160dpi(160인치에 들어가있는 픽셀 수) 화면을 기준으로 한 픽셀을 의미합니다.

축척 독립적 픽셀(sp, sip) : 가변 글꼴을 기준으로 한 픽셀을 의미합니다. 글꼴의 설정에 따라 차이가 있습니다.

텍스트 크기(em) : 글꼴과 상관없이 동일한 텍스트 크기를 표시하기 위한 단위입니다.

그 외 인치(in), 밀리미터(mm)가 있습니다.


Q9. 안드로이드의 4대 컴포넌트(component)에 대해서 간단하게 설명하시오.

안드로이드의 4대 컴포넌트는 액티비티, 서비스, 브로드캐스트 리시버, 콘텐트 프로바이더입니다. 첫 번째로 액티비티는 안드로이드에서 화면을 관리하고 사용자가 발생시키는 다양한 이벤트를 처리하는 컴포넌트입니다. 두 번째로 서비스는 화면에서 보이지 않지만 특정한 기능을 백그라운드에서 수행하는 컴포넌트입니다. 세 번째로 브로드캐스트 리시버는 특정 안드로이드에서 발생하는 특정 브로드캐스트 메세지를 처리하기 위한 컴포넌트입니다. 네 번째로 콘텐트 프로바이더는 앱간 데이터의 공유를 위해 표준화된 인터페이스를 제공하는 컴포넌트입니다.


Q10. 안드로이드 MVC 모델은 어떻게 구성되어있는가?

안드로이드에서 뷰는 화면에 실제로 보이는 구성을 만드는 영역으로 View 클래스를 상속하는 클래스를 이용하여 구성할 수 있습니다. 다음으로 컨트롤러는 뷰와 모델을 서로 연결하며 제어하는 영역으로 액티비티, 서비스, 브로드캐스트 리시버, 프래그먼트로 구성됩니다. 마지막으로 모델은 앱의 다양한 데이터를 저장하는 역할로 SQLite를 이용한 DB, SharedPreference를 이용한 파일 시스템, 콘텐트 프로바이더가 있습니다.


Q11. 액티비티(activity)가 무엇인지와 액티비티 생명주기에 대해서 설명하시오.

안도르이드에서 화면을 관리하며 사용자가 발생시키는 다양한 이벤트를 처리하는 컴포넌트입니다.

부모 액티비티에서 새로운 자식 액티비티를 실행하고자 한다면 먼저 매니페스트 파일에 해당 자식 액티비티를 추가 해줘야합니다. 다음으로 부모 액티비티에서 startActivity 메소드에 인텐트를 파라미터로 넘겨 실행하거나 startActivities 메소드를 이용하여 여러개의 액티비티를 한꺼번에 실행할 수 있습니다.

액티비티의 실행과정은 첫 번째로 부모 액티비티에서 자식 액티비티를 생성 및 호출합니다. 두 번째로 액티비티 매니저 서비스가 해당 앱 프로세스에서 인텐트를 복사해온 후 매니페스트 파일에서 해당 인텐트에 명시되어있는 액티비티를 찾고 어떻게 실행시켜야할지 결정합니다. 세 번째로 찾아낸 액티비티를 실행하고 다시 해당 앱 프로세스에 인텐트를 복사하여 넘겨줍니다. 그 외 자식 액티비티 내의 onCreate 메소드에서 setContentView 메소드에 레이아웃의 아이디를 파라미터로 넘겨 해당 액티비티의 화면을 구성하게됩니다.

액티비티는 크게 3가지 상태가 존재합니다. 먼저 실행(running) 상태는 액티비티 스택의 최상위에 있으며 포커스를 가지고 있어 사용자에게 보이는 상태입니다. 다음으로 일시 중지(paused) 상태는 사용자에게 보이기는 하지만 다른 액티비티가 위에 있어 포커스를 받지 못하는 상태를 말합니다. 예를들어 대화상자가 위에 있어 일부가 가려져 있는 경우를 말합니다. 마지막으로 중지 (stopped) 상태는 다른 액티비티에 의해 완전히 가려져 보이지 않는 상태를 말합니다.

액티비티가 처음 만들어지면 onCreate 메소드가 호출되어 레이아웃을 구성합니다. 이후 onStart 메소드가 화면에 보이기 직전에 호출됩니다. 다음으로 onResume 메소드가 사용자 상호작용(화면이 포커스를 얻었을 때)하기 바로 전에 호출됩니다. 이 3가지 메소드가 호출되어 액티비티는 실행 상태를 갖게됩니다. 이후 포커스를 잃었을 때 onPause 메소드가 호출되고 일시 중지 상태가 됩니다. 일시 중지 상태에서 다시 포커스를 획득하면 onResume 메소드가 호출되거나 다른 액티비티에 의해서 완전히 화면이 가려졌는지 여부를 확인하여 가려져 보이지 않는 경우 onStop 메소드가 호출되어 중지 상태가됩니다. 정지 상태에서 다시 화면이 보이기 직전에 onRestart 메소드가 호출되고 onStart 메소드가 차례로 호출됩니다. 그 외 finish 메소드가 실행되어 해당 액티비티가 종료되기 직전에 onDestroy 메소드가 실행됩니다.

가끔은 일시 중지나 중지 상태에서 시스템이 메모리가 부족하다고 판단될 경우 onCreate 메소드부터 다시 해당 액티비티를 구동합니다. 이 경우 onStop, onResume 메소드 호출이 생략됩니다. 따라서 onSaveInstanceState, onRestoreInstanceState 메소드를 이용하여 액티비티가 갑자기 죽을 것을 대비해서 상태를 저장하고 복원하기 위한 작업을 정의해줄 수 있습니다.


Q12. 액티비티간 데이터 전달에서 임의의 클래스 객체를 바로 전달하지 못하는 이유는 무엇이고 전달하기 위해서는 어떤 처리가 필요한가?

액티비티간 전달할 수 있는 데이터의 type은 보통 기본형으로 정해져있습니다. 그 이유는 인텐트를 이용하여 액티비티의 데이터를 전달하는 과정에서 현재 실행중인 앱 프로세스가 시스템 프로세스로 실행중인 액티비티 매니저 서비스 프로세스에게 인텐트를 전달합니다. 이 경우 프로세스간 통신이기 때문에 인텐트에 있는 값들을 복사하여 넘기는 방식으로 처리되기 때문에 객체 주소를 바로 넘기지 못하는 문제가 발생합니다. 따라서 이 문제를 해결하기 위해 자신이 임의로 만든 클래스 객체를 전달하기 위해서는 Serilizable이나 Parcelable 인터페이스를 상속받아 객체를 직렬화하여 넘기는 방식을 사용해야합니다.


Q13. 부모 액티비티에서 자식 액티비티의 결과 값을 받아오기 위해 어떻게 해야하는가?

먼저 부모 액티비티에서 startActivityForResult 메소드를 이용하여 인텐트와 리퀘스트 코드를 파라미터로 넘깁니다. 이후 자식 액티비티에서 setResult 메소드에 결과 코드와 데이터를 파라미터로 넘깁니다. 다시 부모 액티비티에서 onActivityResult 메소드를 오버라이딩하여 자식 액티비티에서 보낸 결과 코드와 데이터를 받아 처리하는 코드를 작성할 수 있습니다. 이후 실행과정에서 자식 액티비티의 finish 메소드가 호출되면 부모 액티비티가 다시 화면에 나타나면서 onResume 메소드가 실행됩니다. 이때 onActivityResult 메소드가 작동하게 됩니다.


Q14. 안드로이드가 리소스(resource)를 접근하는 방식에 대해서 설명하시오.


Q15. 서비스(service)가 무엇인지와 서비스 생명주기에 대해서 설명하시오.

서비스는 백그라운드에서 실행되는 구성 요소입니다. 서비스는 사용자에게 보이는 화면이 존재하지 않으며, 정해지지 않은 시간 동안 운영됩니다. 각각의 서비스는 매니페스트 파일에 서비스 태그를 이용하여 선언해야합니다. 서비스는 Service 클래스를 상속받아 onStartCommand 또는 onBind 메소드를 재정의하여 구현할 수 있습니다.


서비스는 다른 구성 요소들처럼 메인 쓰레드에서 동작합니다. 따라서 CPU를 많이 사용하거나 대기 상태를 필요로 하는 경우 새로운 쓰레드를 이용하여 생성해야합니다. 또한 서비스의 객체는 단말에서 오직 1개만 생성되어 관리합니다.


먼저 서비스가 startService 메소드로 실행되는 경우 서비스가 생성될 때 onCreate 메소드가 실행됩니다. 이후 서비스가 실행을 시작할 때 onStartCommand 메소드가 호출되며 서비스의 상태가 실행중으로 변경됩니다. 이후 stopService 메소드가 실행되면 서비스가 종료되며 onDestroy 메소드를 호출하며 서비스의 상태가 종료로 변경됩니다.


다음으로 서비스가 bindService 메소드로 실행되는 경우 서비스가 생성될 때 onBind 메소드가 호출됩니다. 다음으로 unbindService 메소드가 호출되어 바인딩이 해제되면 onUnbind 메소드가 호출됩니다. 이후 완전히 종료될 때 onDestroy 메소드가 호출됩니다.


Q16. 브로드캐스트 리시버(broadcast receiver)가 무엇인가?


Q18. 인텐트(intent)와 인텐트 필터(intent filter)에 대해서 설명하시오.

Intent : 어떤 Activity에 데이터를 보낼 때 값들을 지정하기 위해 사용

인텐트필터 : AndroidManifest.xml에서 설정하는 암시적 인텐트 (받는 쪽에서 설정 함)

             즉, 인텐트를 보내는 앱에서는 받는 앱의 이름을 알 필요가 없다.


Q19. 어플리케이션(application)과 컨텍스트(context)에 대해서 설명하시오.

어플리케이션 앱 프로세스가 실행되면 가장 먼저 생성되는 객체로 하나의 어플리케이션 객체는 하나의 앱 프로세스와 대응됩니다. 앱이 백그라운드로 내려가도 앱 프로세스는 계속 살아있기 때문에 어플리케이션 객체도 살아있다고 할 수 있습니다.


컨텍스트는 안드로이드의 컴포넌트들이 동작하기 위해 필요한 정보를 담고 있는 객체를 말합니다. 각각의 컴포넌트들(액티비티, 서비스, 브로드캐스트 리시버 등)은 자신만의 컨텍스트를 가지고 있습니다. 컨텍스트 내에는 어플리케이션의 정보(패키지명 등), 컨텍스트가 실행되는데 필요한 정보(테마 등)를 얻거나 시스템 서비스(윈도우 매니저, 레이아웃 인플레이터 등)를 구동하는데 사용됩니다.


Q20. 노티피케이션(notification)은 무엇인가?

Q21. 안드로이드에서 로그(log)를 출력하는 방법과 종류를 설명하시오.

Q22. 스타일(style), 테마(theme)에 대해서 설명하시오.

Q23. 프레그먼트(fragment)가 와 프레그먼트 생명주기에 설명하시오.

프레그먼트는 액티비티의 일부분에만 배치되는 화면 및 동작을 조작하기 위한 객체입니다. 안드로이드 3.0(허니콤)에서 화면이 비교적 큰 태블릿의 등장으로 작은 단위의 화면의 생명주기 관리할 필요가 있어 추가되었습니다. 프레그먼트 매니저를 통해서 여러개의 프레그먼트를 조작할 수 있습니다. 레이아웃 xml 파일에서 다른 뷰들과 함께 배치될 수 있습니다.

액티비티가 생성되면 프레그먼트 매니저는 초기화(initializing) 상태가 됩니다. 프레그먼트가 매니저에 의해 추가되면 onAttach, onAttachFragment, onCreate 메소드가 차례로 실행됩니다. 다음으로 액티비티의 onCreate 메소드 호출 이후 매니저는 생성(created) 상태로 변경됩니다. 이때 onCreateView, onViewCreated, onActivityCreated 메소드가 차례로 호출됩니다. 다음으로 액티비티의 onStart 메소드가 호출되면 매니저는 시작(started) 상태로 onStart 메소드를 호출합니다. 이후 액티비티의 onResume 메소드가 호출되면 매니저 역시 재시작(resume) 상태로 변하며 onResume 메소드를 호출합니다. 그 외 액티비티가 화면에서 보이지 않을경우 호출되는 onStop 메소드 호출 이후 매니저는 중지(stop) 상태가 되며 액티비티의 onDestroy 메소드 호출 이후 매니저는 onDestroyView 메소드를 호출합니다.


Q24. 뷰 홀더 패턴(view holder pattern)에 대해서 설명하시오.

Q25. 나인패치(9patch)란 무엇인가?

Q26. 태스크(task)란 무엇인가?

예를들어 어떤 앱에서 앨범 앱을 실행하는 기능이 있다면 이 앱은 두개의 앱을 실행하는 형태가 되지만 사용자 입장에서는 하나의 앱에서 화면이 전환된다고 판단합니다. 이와 같은 사용자 입장에서 논리적인 화면 구성의 단위를 태스크라고 말합니다.


Q27. 안드로이드의 메모리 관리 방식에 대해서 설명하시오.

안드로이드는 액티비티, 서비스, 리시버, 프로바이더를 실행하기 위해 앱이 실행되는 과정에서 프로세스를 생성합니다. 실행중인 모든 앱은 컴포넌트가 모두 종료되어도 다음에 이 앱을 다시 실행할 가능성이 높기 때문에 프로세스를 바로 제거하지 않습니다. 바로 종료하지 않는 이유는 앱을 실행하기 위해 프로세스를 생성하는 과정에서 딜레이가 발생하는데 이 딜레이를 줄이기 위함입니다. 따라서 사용자에 의해 다시 앱이 실행되면 남아있던 프로세스가 존재하는 경우 바로 실행됩니다. 이 과정에서 쌓여있던 많은 프로세스로 인해 메모리가 부족해지는 경우 프로세스의 우선순위(사용빈도)에 따라 프로세스를 종료하여 메모리를 확보합니다.




 
이 댓글을 비밀 댓글로

[안드로이드-API] Layout Traversal

Posted by ironmask84
2016. 7. 8. 10:46 나는 프로그래머다!/Java & Android


Example.java

/* basic usage */

ViewGroup root = (ViewGroup) findViewById(android.R.id.content);

 

LayoutTraverser.build(new LayoutTraverser.Processor() {

  @Override

  public void process(View view) {

    // do stuff with the view

  }

}).traverse(root);


/* traverse multiple hierarchies using the same processing logic */

LayoutTraverser traverser = LayoutTraverser.build(new LayoutTraverser.Processor() {

  @Override

  public void process(View view) {

    // do stuff with the view

  }

});

 

traverser.traverse(root);

traverser.traverse(root2);

traverser.traverse(root3);



/* two static methods: finding views by tag and finding views of a specific type */

// all views tagged "coolView" under "root"

List<View> coolViews = Views.find(root, "coolView");

 

// all ImageView views under "root"

List<ImageView> imageViews = Views.find(root, ImageView.class);


LayoutTraverser.java
package com.androidwtf.android;
 
import android.view.View;
import android.view.ViewGroup;
 
public class LayoutTraverser {
  public interface Processor {
    void process(View view);
  }
 
  private final Processor processor;
 
  private LayoutTraverser(Processor processor) {
    this.processor = processor;
  }
 
  public static LayoutTraverser build(Processor processor) {
    return new LayoutTraverser(processor);
  }
 
  public void traverse(ViewGroup root) {
    final int childCount = root.getChildCount();
 
    for (int i = 0; i < childCount; ++i) {
      final View child = root.getChildAt(i);
      processor.process(child);
 
      if (child instanceof ViewGroup) {
        traverse((ViewGroup) child);
      }
    }
  }
}


Views.java

package com.androidwtf.android;

 

import android.view.View;

import android.view.ViewGroup;

 

import java.util.ArrayList;

import java.util.List;

 

final public class Views {

  private Views() {}

 

  public static List<View> find(ViewGroup root, Object tag) {

    FinderByTag finderByTag = new FinderByTag(tag);

    LayoutTraverser.build(finderByTag).traverse(root);

    return finderByTag.getViews();

  }

 

  public static <T extends View> List<T> find(ViewGroup root, Class<T> type) {

    FinderByType<T> finderByType = new FinderByType<T>(type);

    LayoutTraverser.build(finderByType).traverse(root);

    return finderByType.getViews();

  }

 

  private static class FinderByTag implements LayoutTraverser.Processor {

    private final Object searchTag;

    private final List<View> views = new ArrayList<View>();

 

    private FinderByTag(Object searchTag) {

      this.searchTag = searchTag;

    }

 

    @Override

    public void process(View view) {

      Object viewTag = view.getTag();

 

      if (viewTag != null && viewTag.equals(searchTag)) {

        views.add(view);

      }

    }

 

    private List<View> getViews() {

      return views;

    }

  }

 

  private static class FinderByType<T extends View> implements LayoutTraverser.Processor {

    private final Class<T> type;

    private final List<T> views;

 

    private FinderByType(Class<T> type) {

      this.type = type;

      views = new ArrayList<T>();

    }

 

    @Override

    @SuppressWarnings("unchecked")

    public void process(View view) {

      if (type.isInstance(view)) {

        views.add((T) view);

      }

    }

 

    public List<T> getViews() {

      return views;

    }

  }

}


출처 : https://gist.github.com/gelitenight/7999448

 
이 댓글을 비밀 댓글로

안드로이드 리소스 정책 #4 - 관리 및 방법 편

Posted by ironmask84
2016. 4. 28. 10:24 나는 프로그래머다!/Java & Android


앞서 안드로이드 플랫폼에서 리소스에 따른 정책에 대해 공유드렸습니다.

이번엔 그러한 정책에 따른 해상도별 관리를 어떻게 하는 것이 좋을지에 대해 공유 드립니다.


이번에도 이미 잘 정리해놓으신 분들의 글을 좀 퍼왔습니다. (http://arabiannight.tistory.com/entry/293 펌)

아직 앱 개발 초보라 모르는 것이 많아서 ㅠㅠ..


사실 안드로이드 플랫폼을 탑재한 모든 기기(모바일 폰, 태블릿 등등)에 대해 해상도를 최적으로 맞추기는 불가능한 수준입니다. 그래서 최대한 여러 해상도를 커버하기 위한 방법에 대해 생각해보면 아래와 같습니다.


[범용 해상도 맞추는 법]

1) 해상도별 폴더를 만들어라.

-> 안드로이드 단말만 수천개 이상, 현실적으로 불가능.

-> 타겟 단말을 지정해서 개발 해라. 


[범용 해상도를 최대한 고려한 작업 방법]

1) match_parent를 잘 활용 하라.

2) weight를 사용하라.

3) RelativeLayout을 사용 하라.

-> align, parent, below, above 등의 속성를 사용하라.

4) dp값을 활용하라.

5) 나인패치를 활용하라.

6) 통이미지라면 큰 이미지를 사용해서 작은 화면에 적용 하라.

7) Scrollview를 잘 활용하라.


나인패치 관련
개념 :  http://blog.naver.com/purplestudiogames/220605836258 참고

적용 :  http://bcho.tistory.com/1059 참고

 
이 댓글을 비밀 댓글로

안드로이드 리소스 정책 #3

Posted by ironmask84
2016. 4. 22. 16:46 나는 프로그래머다!/Java & Android


AndroidManifest.xml 파일에 속성 중에 리소스 identifier 와 비슷한 속성 설정이 있는데 아래와 같다.


android:configChanges 값이 아무것도 없을 때는 단말을 돌려서 단말 표시 모드가 portrait mode -> landscape mode 가 되면 위에서 설명된 것과 같이 기본 동작은 Activity 가 destroy 되었다가 다시 시작합니다.

android:configChanges = "orientation" 이 설정되면, portrait mode -> landscape mode 가 되어도, Activity는 destroy 되지 않습니다. 대신에 Activity에 override 된 onConfigurationChanged() 함수가 호출되며, 여기서 환경변화 ( config changes ) 에 대한 처리를 해줍니다.


이거 그냥 Activity 가 재시작되도록 둬도 될 것 같은데.. 왜, 언제 사용해요?


 가장 흔하게 접할 수 있는 경우가 위에서 예를 든 orientation changes 경우입니다.

마찬가지로 흔하게 접할 수 있는 것이 keyboardHidden 입니다.
keyboardHidden 은 hardware keyboard가 보이냐 안 보이냐에 따라서 발생하는 변화입니다.

가장 대표적인 hardware keyboard를 갖춘 device인 옵티머스 Q를 보면, 슬라이드 형식으로 QWERTY 자판을 꺼냈다 숨겼다 할 수 있죠.
이 때 변화가 없어도 되는데 쓸데 없이 Activity 가 파괴되고 생성되면 안 되겠죠? 그래서 QWERTY 자판이 있을 경우는 거의 대부분 이 attribute 설정이 필요하게 됩니다.

그 외에도 configChanges 가 발생했을 때 단순한 Activity의 재시작 이외에 추가적 작업을 해 줄 때에도 사용됩니다.



그럼 configChanges에 들어갈 수 있는 값들은 뭐가 있나요?


먼저 configChanges에는 여러가지 값들을 '|' ( or ) 구분자를 통해서 함께 입력 가능합니다.

 ValueDescription 
 "mcc"  SIM 이 Detect 되고 MCC 가 Update 될 경우. ( IMSI Mobile Country Code가 변했을 때 ) 
 "mnc" SIM 이 Detect 되고 MNC 가 Update 될 경우. ( IMSI Mobile Network Code가 변했을 때 ) 
 "locale" User 가 새로운 Language 를 선택했을 때 ( Locale 이 변경될 때 ) 
 "touchscreen" Touch Screen Hardware 가 바뀌었을 때 ( 보통은 절대 일어나지 않는 Case 임 ) 
 "keyboard" User 가 External Keyboard를 꽂았을 때를 비롯하여 Keyboard 의 Type 변경시. 
 "keyboardHidden" User 가 Hardware Keyboard를 보이고 감추는 등의 Keyboard의 Accessibility가 변경되었을 때 
 "navigation" Navigation Type ( 트랙볼 / DPad ) 가 변경되었을 때 ( 보통 절대 일어나지 않는 Case ) 
 "orientation" User가 Device 를 돌리는 등의 행위로 Screen 의 Orientation 이 변경되었을 경우.
 "screenLayout"  Screen의 Layout이 변했을 때, 다른 Display 가 Activate 되었을 경우 Layout이 변한 경우
 "fontScale" User 가 새로운 Font Size 를 선택했을 때. 
 "uiMode"  User 가 Device 를 Desk 나 Car Dock 등에 비치하여 Interface Mode 를 바꾸었을 때.


펌 : http://aroundck.tistory.com/36

 
이 댓글을 비밀 댓글로

안드로이드 리소스 정책 #2

Posted by ironmask84
2016. 4. 19. 14:09 나는 프로그래머다!/Java & Android




 Providing Resource

프로그래머는 어플리케이션의 테마를 독립적으로 유지하기위해서, 
이미지나 스트링같이 자신이 만든 코드를 통해서 어플리케이션 리소스를 외부에 보여주게 됩니다.

또한 '특정 기기 환경(specific device configurations)'을 위한 대체 리소스도 만들어야 합니다.
이 리소스들은 주제별로 그룹지어서 각각의 특성에 맞게 이름붙여진 디렉토리에 만듭니다.

실행 시, 안드로이드는 '현재 기기 환경(current configuration)'을 기반으로 적절한 리소스를 찾아 사용합니다.
스크린 사이즈에 의존되어진 UI Layout이라던가, 언어 설정에 의존된 글자 등을 예로 들수있습니다.

참고 자료 : Resource Tytpes
(주제, 특성별로 그룹지어진 Resource Type에 대한 자료입니다.)

접기

여기서 말하는 특정 기기 환경 
: 프로그래머가 미리 몇가지 특정 환경에 맞추어 제공할 리소스들이 적용될 환경

여기서 말하는 현재 기기 환경
: 프로그래머가 개발한 어플리케이션이 실행 될 기기의 환경

프로그래머가 특정환경에 맞추어진 리소스들을 제공했을때,  
예를들자면, hdpi 에 사용될 리소스들(res/drawable-hdpi 에 저장되어야 하는)을 제공했고,
사용자(어플리케이션을 사용하는)의 기기가 480*800 해상도(hdpi)를 지원하는 기기라면,
그 설정에 맞추어 res/drawable-hdpi 에 있는 리소스를 알아서 가져다 쓴다는 것입니다.
만약 res/drawable-hdpi 에 리소스가 없다면, default로 주어지는 resource를 가져다 사용하거나,
다른 특정 기기 환경에 있는 리소스를 가져다 자신의 기기에 맞게 이미지 변환 등을 통해서 사용합니다.





 Providing Alternative Resource - 대체 리소스 제공

거의 모든 안드로이드 어플리케이션은 특정 기기를 위한 대체 리소스를 지원합니다.
프로그래머는 다른 여러 screen densitiy와 여러 언어를 대체할 수 있는 drawable resource를 만들어야 합니다.

실행 시, 안드로이드는 현재 기기의 설정을 찾아서 각 어플리케이션에 적절한 리소스(resource)를 load합니다.



그렇기 때문에 대체될 리소스들에는 '특정 기기 설정'에 대해 명시해줘야 합니다.

접기

특정 기기 설정.. 이라는 표현을 쓰기는 했는데,
간단하게 생각해보면 해상도나 기타 여러가지 것들을 의미합니다.
안드로이드 디바이스는 디바이스마다 해상도나 언어설정 등이 다르기 때문에 그런것들을 의미합니다.

기본적으로 이 포스트에서 알아보려는 것은 다양한 디바이스에 따라서 안드로이드가 어떻게 리소스들을 
어떻게 매칭시켜주는지에 대한것입니다. 

접기




예를 들면, 아래와 같이 resource를 제공 할 수 있습니다.
아래의 리소스들은 default로 사용되는 resource와, 
hdpi(특정 기기의 설정(이하 - 특정 기기의 환경) : 해상도)에 사용되는 대체 리소스입니다.

- default 리소스와 hdpi 대체 리소스 -


기본적으로는 특정설정에 대한 대체 리소스 디렉토리는 아래와 같이 사용합니다.

1. res/ 디렉토리 하위로 디렉토리를 만듭니다.

2. 디렉토리 이름은 <resources_name>-<config_qualifier> 의 형태로 합니다.

3. <qualifier>는 각각의 리소스들이 사용될 개별적인 환경을 명시한 것입니다.
    qualifier에 대해서는 아래의 table 2를 참고하세요.
참고자료 -  Android Developers Providing Resource : table 2

4. 프로그래머는 여러 특정설정에 대해서 추가할 수 있습니다.(디렉토리 만드는 것)
   이때는 각 설정마다 dash(-)로 연결해줍니다.

5. 각각의 대체 리소스는 위에서 특정설정에 따라만든 디렉토리에 저장합니다.

6. 이 리소스 파일은 default 로 만들었던 리소스 파일과 이름이 정확히 일치해야 합니다.(바로 위의 그림 참고)





 Qualifier name rules - Qualifier 이름 규칙

Qualifier의 이름을 만들때는 위의 참고자료로 주어졌던 table 2 를 참고합니다.

예를들어서 기본적으로 안드로이드 프로젝트를 실행했을때 주어진 Qualifier 들이 있습니다.

res/drawable-hdpi/ : hdpi
res/drawable-mdpi/ : mdpi
res/drawable-ldpi/ : ldpi

이런 특정설정들처럼 추가적으로 특정설정에 대해서 대체 리소스들을 만들어 둘 수 있습니다.
위의 각 Qualifier(hdpi, mdpi, ldpi)는 해상도를 나타냅니다. 해상도에 대해서는 아래의 그림을 참고합니다.




하나 하나 씩 특정설정에 대한 대체리소스를 만들때는 
drawable-hdpi 라고만 써도 무방합니다.
하지만 더욱 특화시켜서 만들려고 한다면 여러개의 Qualifier를 복합해서 사용할 수 있습니다.

아래는 복합적인 사용에서의 옳은 Qualifier name과 잘못된 Qualifier name 입니다.
  • Wrong: drawable-hdpi-port/
  • Correct: drawable-port-hdpi/

둘 모두 qualifier는 정확히 사용했지만, 하나는 옳고 하나는 틀렸습니다.

그 이유는, 안드로이드는 위의 table 2 의 리스트를 위에서 부터 순서대로 확인하며 리소스를 찾기때문입니다.
(MCC, MNC 부터 SystemVersion 까지 순서대로)

위의 port(Screen Orientation)와 hdpi(Screen pixel density - dpi) 중에서는 Screen orientation 이 위에 있기때문에
drawable-hdpi-prot/ 라고 만들면 잘못된것입니다. 반드시 table 2의 순서를 지켜야 합니다.

마찬가지로 화면 방향에 따른 레이아웃을 지정하려면 아래처럼 디렉토리를 만들면 됩니다.

layout-land : 가로 레이아웃에 사용되는 리소스가 저장될 디렉토리
layout-port : 세로 레이아웃에 사용되는 리소스가 저장될 디렉토리





 Creating alias resources -  alias 리소스 만들기

아래는 alias resource를 만들어 사용한 예입니다.
(이 방법은 하나의 resource를 두고 여러 resource처럼 만들어 사용할수 있게 해줍니다.)



Drawable

<bitmap> 엘리먼트를 사용해서 이미 존재하는 drawable에 대해 alias resource를 만드는 예입니다.
1
2
3
<?xml version="1.0" encoding="utf-8"?>
    android:src="@drawable/icon_ca" />

icon_ca 라는 bitmap(또는 이미지)가 drawable 디렉토리 어디엔가 존재한다고 했을 때, 위와 같이 만들 수 있습니다.
그리고 위의 xml 파일의 이름을 icon_alias.xml 이라고 대체 리소스 디렉토리에 저장을 합니다.

이렇게 한 경우 R.drawable.icon_alias 으로 사용하게 됩니다.

R.drawable.icon_alias을 사용했지만, 
실제로는 R.drawable.icon_ca(res/drawable에 있는) 리소스를 사용하는 것입니다.



Layout

<merge>엘리먼트를 부모 엘리먼트로 가지는 <include> 엘리먼트를 사용해서,
이미 존재하는 layout에 대해서 alias resource를 만드는 예입니다.
1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<merge>
    <include layout="@layout/main_ltr"/>
</merge>

main_ltr 이라는 layout이 이미 res/layout 에 존재한다고 했을 때, 위와 같이 만들 수 있습니다.
그리고 위의 파일을 main.xml 이라고 저장합니다.

이렇게 한 경우 R.layout.main 으로 사용하게 됩니다.

Drawable에서와 마찬가지로 R.layout.main 으로 접근해서 사용하지만, 
실제로는 R.layout.main_ltr 을 사용하는것입니다.



String

ID(name)을 다르게 함으로써 alias resource를 만드는 예입니다.
1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello</string>
    <string name="hi">@string/hello</string>
</resources>

이렇게 한 경우, R.string.hello 로 사용해도 되지만, R.string.hi 를 사용할수있게됩니다.

Layout 부터 String 까지의 내용을 보시면 아시겠지만,
이 방법은 실제 있는 리소스를 가지고 다른 방법으로 사용할 수 있게 해줍니다. 참고자료 링크




아래는 color에 대한 예입니다. 다른 예들을 보려면 위의 other simple values 링크를 따라가시면 됩니다.
1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="yellow">#f00</color>
    <color name="highlight">@color/red</color>
</resources>

이렇게 해 두면
R.color.yellow, R.color.highlight 로 사용할 수 있게 됩니다.
색상을 매번 직접 지정(android:textColor="#000" 과 같이 직접 지정하는 것)하지 않고, 
alias를 통해 사용할 수 있게됩니다.




 How Android Finds the Best-matching Resource
(안드로이드는 어떻게 가장적합한 리소스를 찾아서 매칭하는가?)


아래 표는 어플리케이션이 가지고 있는(프로그래머가 제공해준, 어플이 제공해줄수 있는) 이미지 resource들과,
실제 디바이스(기기)의 환경입니다.

 images device configuration
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
Locale = en-GB 
Screen orientation = port 
Screen pixel density = hdpi 
Touchscreen type = notouch 
Primary text input method = 12key 



실제로 안드로이드는 아래의 플로우 차트를 통해 리소스를 찾아내고 매칭합니다.


 
 1번. 기기 환경과 모순되는 것들 제거하기
  Locale이 en-GB로 설정되어있기 때문에
  drawable-fr-rCA/ 디렉토리를 제거합니다.

drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/

 2번. MCC, MNC, Language, 
      그리고 나머지 순으로 Qualifier 확인하기



 3번. 분기. 
     (qualifier 중 포함되어있는 디렉토리 찾기)
 
        매칭되었으면 4번으로,
        매칭되지 않았으면 2번으로 돌아가기


 4번. 포함되어있지 않은 Qualifier 제거하기
  lanuage qualifier 가 포함되어있지 않은 디렉토리 제거  
 
drawable/
drawable-en/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/


 5번. 하나의 디렉토리로 매칭될때까지 계속하기
  계속해서 2번, 3번, 4번의 스텝을 반복하게 되면,
  결국에는 drawable-en-port 만 남게됩니다.

drawable-en/
drawable-en-port/
drawable-en-notouch-12key/ 



이번 포스팅에서는 Providing Resource에 대해서 알아보았습니다.
아무래도 정말 다양한 안드로이드 기기들에 맞출 수 있도록 하기 위해서 존재하는 것일테지요.
실제로 providing resource를 잘만 활용 한다면,
여러 기기에서 같은 UI(해상도에 따라 조금씩은 다르겠지만)를 제공할 수 있을 겁니다.

  
  참고자료
    - Android Developer Reference : Providing Resource
  
  연관자료
    - Resourc types
    - Android Developer Reference : Resource Types
    - Android Developer Reference : More Resource Types 


퍼옴 : http://croute.me/323

 
이 댓글을 비밀 댓글로

안드로이드 리소스 정책 #1

Posted by ironmask84
2016. 4. 19. 14:01 나는 프로그래머다!/Java & Android



원글 : http://developer.android.com/guide/topics/resources/providing-resources.html

 

응용 프로그램 리소스를 독립적으로 유지하기 위해, 코드에서 이미지와 문자열과 같은 리소스를 구체화해야 한다. 또한 특별한 이름이 붙여진 리소스 디렉토리들 내에서 그것들을 그룹화하여, 특정한 디바이스 구성(Configuration)을 위해 대안적인 리소스들을 제공해야한다. 안드로이드는 실행시간에 현재 구성에 바탕을 둔 적합한 리소스를 사용한다. 예를 들어 화면 크기에 따라 다른 UI 레이아웃을 사용하거나 셋팅된 언어에 따라 다른 문자열이 제공되기를 기대할 수 있다.

 

일단 응용 프로그램 리소스를 구체화하면, 프로젝트의 R 클래스 내에 만들어진 리소스 ID들을 사용하여 리소스에 접근이 가능하다. 응용 프로그램에서 리소스를 사용하는 방법은 Accessing Resources에서 확인할 수 있다. 이 문서는 어떻게 안드로이드 프로젝트 내의 리소스들을 그룹화 하고 특정 디바이스 구성을 위한 대안적인 리소스들을 제공하는지 보여준다.

 

리소스 유형 그룹화

 

프로젝트의 /res 디렉토리의 특정 하위 디렉토리에 각 타입의 리소스를 배치해야 한다.

 

MyProject/
    src/
        MyActivity.java  
    res/
        drawable/  
            icon.png  
        layout/  
            main.xml
            info.xml
        values/  
            strings.xml
 

 

이 예에서 볼 수 있듯이, 하나의 이미지 리소스(icon.png), 두 개의 레이아웃 리소스(main.xml, info.xml), 하나의 스트링 리소스 파일들(strings.xml) 등 /res 디렉토리는 (하위 디렉토리들 안에) 모든 리소스를 포함한다. 리소스 디렉토리 이름은 중요하며 표 1에 설명되어 있다.  

 

표 1. 프로젝트 res/ 디렉토리 내에 지원되는 리소스 디렉토리

 

 

 animator/

property animations을 정의하는 XML 파일

 anim/

트윈 애니메이션을 정의하는 XML 파일. (프로퍼티 애니메이션 또한 이 디렉토리에 저장할 수 있다. 그러나 animator/ 디렉토리는 두 타입 중에 프로퍼티 애니메이션이 우선권이 있다.

 color/

색상 리스트를 정의하는 XML 파일들. Color State List Resource 을 참조한다.

 drawable/

아래와 같은 드로어블 리소스의 하위 타입들로 컴파일 되는 비트맵 파일.(.png, .9.png, .jpg, .gif)이나 XML 파일들

- 비트맵 파일

- 나인패치(크기가 재조정되는 비트맵)

- 상태 리스트

- Shapes

- 애니메이션 드로어블

- 외의 드로어블

Drawable Resources을 참조한다.

 layout/

사용자 인터페이스 레이아웃을 정의하는 XML 파일. Layout Resource을 참조한다.

 menu/

옵션 메뉴, 컨텍스트 메뉴, 서브 메뉴와 같은 어플리케이션 메뉴를 정의하는 XML 파일. Menu Resource를 참조한다.

 raw/

원시형태로 저장하는 임의의 파일. 원시 InputStream으로 이 리소스 파일들을 열기 위해서는 R.raw.filename과 같은 리소스 ID와 함께 Resources.openRawResource()를 호출한다.

 

그러나, 원본 파일 이름과 파일 구조에 접근해야하는 경우, (res/raw/ 대신에) assets/ 디렉토리에 리소스를 저장할 수 있다. assets/ 내의 파일들은 리소스 ID가 주어지지 않으며, 오직 AssetManager를 사용해서 읽을 수 있다.

 values/

문자열이나 정수와 색상 같은 간단한 값을 포함하는 XML 파일

 

다른 res/ 하위 디렉토리에 있는 XML 리소스 파일들은 XML 파일 이름에 기반하여 단일한 리소스를 정의하는데 반해, values/ 디렉토리에 있는 파일들은 다수의 리소스들을 기술한다. 이 디렉토리 내에 있는 파일의 경우, <resources> 요소의 각 자식들은 하나의 자원을 정의한다. 예를 들어,  <string>는 R.string 자원을 만들고 <color> 요소는 R.color 자원을 만든다.

 

각 자원은 자체 XML 요소로 정의되어 있기 때문에, 원하는 대로 파일 이름을 지정하고 하나의 파일에 여러 자원 유형을 배치할 수 있다. 그러나 명확성을 위해서, 다른 파일에 고유한 자원 유형을 배치할 수 있다. 다음은, 디렉토리에 만들 수 있는 자원의 파일 이름에 대한 몇가지 규칙이다.

 

- 배열 리소스는 arrays.xml (typed arrays)

- 색상 값은 colors.xml

- 크기, 치수 값은 dimens.xml

- 문자열 값은 strings.xml

- 스타일은 styles.xml

 

String Resources, Style Resource와 More Resource Types을 참조한다. 

 xml

Resources.getXML() 호출에 의해 런타임에 읽을 수 있는 임의의 XML 파일. searchable configuration와 같이 다양한 XML 구성 파일들은 여기에 저장해야 한다.

 

주의 : /res 디렉토리 내에 직접적으로 리소스 파일을 저장하지 않도록 한다. 이는 컴파일 에러의 원인이 된다.

 

리소스 타입들에 대한 더 많은 정보는, Resource Types 문서를 참조한다.

 

표 1에 정의된 하위 디렉토리들 내에 저장한 리소스들은 당신의 "디폴트" 리소스들이다. 즉 이 리소스들은 응용 프로그램의 기본 디자인과 컨텐츠를 정의한다. 그러나 다른 타입의 안드로이드 디바이스들은 다른 타입의 리소스들을 요구할지 모른다. 예를 들어 디바이스가 일반적인 화면보다 더 큰 화면을 졌다면, 추가 화면 공간을 용한 다른 레이아웃 리소스들을 제공해야 한다. 또 디바이스가 다른 언어로 셋팅되어있다면, 사용자 인터페이스에서 텍스트를 번역한 다른 스트링 리소스들을 제공해야 한다. 다른 디바이스 구성에 대해 다른 리소스들을 제공하기 위해, 디폴트 리소스뿐 아니라 대안적인 리소스들을 제공할 필요가 있다.

 

 

 

대안적인 리소스 제공

 

거의 모든 응용 프로그램은 특정 디바이스 구성을 지원하기 위해 대안적인 리소스들을 제공해야한다. 예를 들어, 다른 화면 밀도를 위해 대안적인 드로어블 리소스와 다른 언어를 위한 대안적인 스트링 리소스를 포함해야 한다. 실행 시간에 안드로이드는 현재 디바이스 구성을 발견하고 적합한 리소스들을 로드한다.

 

그림 1. 각각 다른 레이아웃 리소스를 사용하는 두 개의 다른 디바이스들 

 

리소스 셋에 대해 

 

1. <resources-name>-<config_qualifier> 내에 명명되어진 res/ 내에 새로운 디렉토리를 만들어라. 

ㅁ <resources_name>은 (표 1에 정의된)디폴트 리소스들에 대응하는 디렉토리 명이다. 

ㅁ <qualifier>는 (표 2에 정의된) 리소스가 사용되는 개인 컨피규레이션을 지정한 이름이다. 

대쉬로 각각 분리해서 <qualifier>를 하나 이상 추가할 수 있다. 

주의 : 다수의 한정자를 덧붙일 때, 표 2에 목록으로 만들어진 동일한 차수 내에서 그것들을 배치해야 한다. 한정자가 틀리게 지시받으면, 리소스들은 무시된다. 

2. 이 새로운 디렉토리 내에 각각의 대안 리소스들을 저장하라. 리소스 파일들은 디폴트 리소스 파일들과 정확히 동일한 이름을 지정해야 한다. 

 

예를 들어, 여기 디폴트 리소스와 대안 리소스가 있다: 

res/
    drawable/   
        icon.png
        background.png    
    drawable-hdpi/  
        icon.png
        background.png
 

 

hdpi 한정자는 고밀도 스크린을 가진 디바이스에 대한 디렉토리 내의 리소스들을 나타낸다. 각 드로어블 디렉토리들 내의 이미지들은 특정한 스크린 밀도를 위해 크기에 따라 분류된다. 그러나 파일 이들들은 정확하게 동일하다. 이 방법으로, icon.png나 background.png 이미지를 참조하는데 사용하는 리소스 ID는 항상 동일하다. 그러나 리소스 디렉토리 이름 내에 한정자로 디바이스 구성 정보를 비교하며 안드로이드는 현재 디바이스와 가장 잘 맞는 리소스 버전을 선택한다. 

 

안드로이드는 몇몇의 구성 한정자를 제공하고 당신은 대쉬로 각 한정자를 분리시킴으로써 하나의 디렉토리 이름에 다수의 한정자를 추가할 수 있다. 표 2는 유효한 구성 한정자를 우선 순위 차례대로 목록으로 보여준다. 리소스 디렉토리에 대해 다수의 한정자를를 사용한다면, 그것들이 표에 리스트된 순서대로 디레곹리 이름에 그것들을 추가해야 한다. 


퍼옴 : http://blog.naver.com/PostView.nhn?blogId=mad_ai&logNo=130165607607

 
이 댓글을 비밀 댓글로

Eclipse 에서 Tap을 Space로 변경하기

Posted by ironmask84
2016. 3. 31. 09:13 나는 프로그래머다!/Java & Android


보통 안드로이드 프로젝트를 개발할 때는 git이란 형상관리도구를 사용합니다.


git에 소스를 반영할 때는 여러 사람이 반영하게 되므로, 보통 Code Rule을 몇 가지 정해놓고 반영하도록 하는데요..

그 중에 에러를 최소화하기 위해 tab 대신에 space로 반영하도록 하는 사항이 있습니다.


코드 가독성을 위해 tab으로 들여쓰기를 보통 사용하는데,

Eclipse에서 이 tab을 누르거나, 자동 들여쓰기 기능을 할 때, Space로 바꿔주는 기능이 있습니다.


아래 2가지 방법 중 1번으로 안될 경우, 2번까지 적용하시면 됩니다.

1. Window -> Preferences -> General -> Editors ->Text Editors ->Insert spaces for tabs 체크, 

                                                           -> Displayed tab width를 4로 설정


2. Window-> Preferences -> Java -> Code Style -> Formatter
  [
Edit] 버튼을 누르고 < Indentation > 텝에서 Tab policy을 Space only 로 변경, Profile 이름을 적당히 변경


 
이 댓글을 비밀 댓글로

PreferenceActivity 와 Fragment

Posted by ironmask84
2016. 3. 10. 16:23 나는 프로그래머다!/Java & Android


http://blog.naver.com/xinfra/80172458285

http://mainia.tistory.com/2006

http://blog.naver.com/rlawlss/80140113577

http://nekomimi.tistory.com/483

http://mainia.tistory.com/2052

http://taehoonkoo.tistory.com/132

 
이 댓글을 비밀 댓글로

BroadcastReceiver 간단 정리

Posted by ironmask84
2016. 2. 1. 15:20 나는 프로그래머다!/Java & Android


안드로이드에는 BroadcastReceiver 라는 Callback 이벤트를 처리해주는 컴포넌트가 제공됩니다.


쉽게말해서, A라는 앱을 만들었는데, 

문자가 왔을 때 어떤 데이터를 받고 싶다던가 배터리가 50% 이하가 되었을 때 뭔가 변화를 주고 싶다고 한다면

SMS 앱이나 배터리체크 앱에서 어떤 이벤트를 데이터와 함께 날리게 되고,

A에서는 그 이벤트와 데이터를 받아서 원하는 기능을 처리하도록 할 수 있다는 것입니다.


위에서 언급한 이벤트처리를 복잡하지 않고 쉽게 처리해주는 녀석이 BroadcastReceiver 라는 컴포넌트 인 것입니다.


아래에 2가지 방법에 대한 예시를 올립니다.


1. BroadcastReceiver 클래스를 상속  (AppWidgetProvider 도 가능, 아마 BroadcastReceiver를 가지고 있겠지..)

   onReceive() 를 Override해서 기능 정의

   androidManifest.xml에 등록되어 있어야 함.

 androidManifest 이용해서 등록하면, 명시적으로 해제해줄 수는 없다. (unRegisterReceiver 불가능)
    (
onReceive() 메소드가 완료되면 가비지 컬렉션 대상이 되서 해지될지도... 언제 될지는 모름...)


   ex) <receiver android:name=".favorite.MissedCallWidget" >

            <intent-filter>

                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />

                <action android:name="lge.intent.action.MISSED_CALLS" />

            </intent-filter>


            <meta-data

                android:name="android.appwidget.provider"

                android:resource="@xml/missed_call_widget_info" />



2. Actvity, Service, ContentProvider에 registerReceiver() 내에서 등록한다. 

   * onDestory() 에서 this.registerReceiver() 해줬던것을 해제가능 (메모리 누수 방지 효과도 있음)


ex) 이미 있는 action이 아니라, 새로 만든 custom action을 이용한 예시

public static final String ACTION_KEY_CODE = "com.ironmask.home.KEYCODE_ALERT";

private BroadcastReceiver mKeyCodeReceiver = null;


onCreate() 

{ .........

MyregisterReceiver();

  .........

}


onDestory()

{ ...........

    this.unRegisterReceiver(mKeyCodeReceiver);


MyregisterReceiver() {

if (mKeyCodeReceiver != null)

return;


        IntentFilter filter = new IntentFilter();

        filter.addAction(ACTION_KEY_CODE);


this.mKeyCodeReceiver = new BroadcastReceiver() {

       @Override

       public void onReceive(Context context, Intent keyintent) {

           String action = keyintent.getAction();


           if (ACTION_KEY_CODE.equals(action)) {

...

};

this.registerReceiver(this.mKeyCodeReceiver, filter);

}


미리 Broadcast를 제공하는 App에서 아래와 같이 수행해 놓으면, 위 Receiver가 동작!! 

(SMS, Call 등 이미 기본 안드로이드 App에서 제공되는 것들도 많다.)

Intent keyCodeAlert = new Intent("com.ironmask.home.KEYCODE_ALERT"); 

keyCodeAlert.putExtra("key_code", keyCode);


mContext.sendBroadcast(keyCodeAlert);


--> 위의 예시가 맞는지 다시 확인 필요...


즉, 2번 예시의 경우도, com.ironmask.home.KEYCODE_ALERT이라는 액션을 가진 Activity 내에서 
위의 과정이 있어야 한다...


 
이 댓글을 비밀 댓글로

안드로이드 View 클래스 관련 깨알같은 스펙정보

Posted by ironmask84
2016. 1. 21. 16:47 나는 프로그래머다!/Java & Android


setContentView() : 화면에 무엇을 보여줄지를 결정하는 함수(메소드)

R.layout.activity_main : 화면에 보여줄 대상이 되는 화면의 설정파일(xml)을 지정하는 구문

@string/hell_world  : activity_xxx.xml파일을 작성 할때 values/strings.xml 파일에 id가 hello_world로 설정된 문자열을 지정하는 구문 - android:text="@string/hello_world"

@+id/button01 : activity_xxx.xml파일 안에 있는 태그의 id를 지정하는 방식. 구성요소들을 화면상에 배치하기 위해 layout_below등의 값으로 지정할때 사용

findViewById() : xml에서 정의한 태그의 id를 이용해 코드에서 객체를 참조하는 방식

Intent : 어떤 기능을 실행할 지를 지정하기 위해 사용

Toast : 화면에 잠깐 보였다가 사라지는 풍선 메시지 사용을 위한 객체


 크기를 지정 할때 사용되는 단위들

 단 위

 단위 표현

 설 명

 px

 필셀

 화면 필셀

 dp or dip

 밀도 독립적 픽셀(density independent pixel)

 160dip 화면을 기준으로 한 픽셀

예) 1이치당 160개의 점이 있는 디스플레이 화면에서 1dp는 1px와 같음, 1인치당 320개의 점이 있는 디스플레이 화면에서 1dp는 2px와 같음

 sp or sip

 축척 독립적 픽셀(scale independent pixel)

 가변 글꼴을 기준으로 한 픽셀로 dp와 유사하나 글꼴의 설정에 따라 달라짐

 텍스트 표현시 폰트 크기대로 뷰를 표시할때 일반적으로 사용.

 in

 인치

 1인치로 된 물리적 길이

 mm

 밀리미터

 1밀리미터로 된 물리적 길이

 em

 텍스트 크기

 글꼴과 상관없이 동일한 텍스트 크기 표시

!!! 실제 앱의 화면을 구성 할 때는 'dp'단위를 주로 사용한다고 한다. 안드로이드 단말은 다양한 화면 크기와 해상도를 가지고 있는데 'dp'단위를 사용하면 단말의 해상도에 따라 비율로 픽셀값이 계산되므로 대부분의 화면에서 비슷한 크기로 보이도록 만들 수 있기 때문이다.


Color Format : ARGB( A: Alpha, R: Red, G : Green, B : Blue) - 

Alpha값 : 투명도 조절에 사용  - FF(불투명) -> 88(반투명) -> 00(투명)

textColor 속성 : 텍스트뷰에서 표시하는 문자열의 색상 속성 - ARGB 값으로 지정 - #88FF00FF

textSize 속성 : 텍스트뷰에서 표시하는 문자열의 크기 속성 - 12dp or 12sp or 12px

textStyle 속성 : 텍스트뷰에서 표시하는 문자열의 스타일 속성 - normal, bold, italic, bolditalic

typeFace 속성 : 텍스트뷰에서 표시하는 문자열의 폰트 설정 속성 - normal, sans, serif, monospace

singleLine 속성 : 텍스트뷰에서 표시하는 문자열이 한줄로 표시되도록 설정하는 속성.


배경 이미지 지정 : android:background="@drawable/pretty"

               res/drawable-hdpi 폴더에 pretty.png 파일을 위치시킨다. 폴더명의 hdpi 부분은 기기별 dpi에 따라 다른 해상도의 이미지를 지정해주기 위함인가?


orientation : 뷰를 추가하는 방향을 설정하는 속성 ( LinearLayout에만 적용되는 속성 )

gravity : 뷰의 정렬 방향을 설정하는 속성

padding : 뷰의 여유공간을 설정하는 속성

weight : 뷰가 차지하는 공간의 가중치 값을 설정하는 속성


레이아웃 종류 

@string/hell_world  : activity_xxx.xml파일을 작성 할때 values/strings.xml 파일에 id가 hello_world로 설정된 문자열을 지정하는 구문 - android:text="@string/hello_world"

 레이아웃 이름

 설 명

 LinearLayout

 - 박스(Box) 모델( 특정 방향으로 뷰들을 나열하듯 배치 )

 - 사각형 영역들을 이용해 화면을 구성하는 방법

 - 표준 자바의 BoxLayout과 유사

 RelativeLayout

 - 규칙(Rule) 기반 모델

 - 부모 컨테이너나 다른 뷰와의 상대적 위치를 이용해 화면을 구성하는 방법

 FrameLayout

 - 기본 단위 모델

 - 하나의 뷰만 보여주는 방법

 - 가장 단순하지만 여러 개의 뷰를 추가하는 경우 중첩시킬 수 있으므로 뷰를 중첩한 후 각 뷰를 전환하여 보여주는 방식으로 사용할 때 유용함.

 TableLayout

 - 격자(Grid) 모델

 - 격자 모양의 배열을 이용하여 화면을 구성하는 방법

 - HTML에서 많이 사용하는 정렬 방식과 유사하여 실용적임

 ScrollView

 - 스크롤이 가능한 컨테이너

 - 뷰 또는 뷰그룹이 들어갈 수 있으며 화면 영역을 넘어갈 때 스크롤 기능 제공

 



앱의 실행시 보여지는 첫번째 화면을 바꾸려면 아래의 AndroidManifest.xml 파일에서 볼드폰트로 표시된 부분을 타겟 액티비티 이름으로 변경해주면 된다.

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"?
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".NewActivity"></activity>
        <activity android:name=".LinearLayoutActivity"></activity>
        <activity android:name=".SampleLayoutCodeActivity"></activity>
        <activity android:name=".RelativeLayoutActivity"></activity>
    </application>


layout_width, layout_height 속성값

match_parent : 부모컨테이너와 같은 크기로 보이기(여유공간 모두 사용),  프로요(2.2) 버전 이전에는 fill_parent로 사용되었음.

wrap_content : 뷰에 표시할 내용물의 크기에 따라 뷰의 크기가 결정됨.

수치값 : dp등의 수치값으로 지정할 수 있음.


layout_gravity : 부모 컨테이너의 공간에서 뷰가 표시될 위치를 지정할 때 사용되는 속성.

gravity : 뷰가 표현해야 할 내용을 뷰의 공간 내에서의 정렬을 설정하는 속성.

gravity 속성값들

 정렬 속성값

 설 명

 top

 위쪽 끝에 배치

 bottom

 아래쪽 끝에 배치

 left

 왼쪽 끝에 배치

 right

 오른쪽 끝에 배치

 center_vertical

 수직방향의 중앙에 배치

 center_horizontal

 수평방향의 중앙에 배치

 fill_vertical

 수직 방향으로 여유공간만큼 확대하여 채우기

 fill_horizontal

 수평 방향으로 여유공간만큼 확대하여 채우기

 center

 수직/수평 방향의 중앙에 배치

 fill

 수직,수평 방향의 여유공간만큼 확대

 clip_vertical

 - 대상 객체의 상하 길이가 여유공간보다 클 경우에 남는 부분을 잘라내기

 - top|clip_vertical로 설정한 경우 아래쪽에 남는 부분 잘라내기

 - bottom|clip_vertical 로 설정한 경우 위쪽에 남는 부분을 잘라내기

 - center_vertical|clip_vertical 로 설정한 경우 위쪽과 아래쪽에 남는 부분 잘라내기

 clip_horizontal

 - 대상 객체의 좌우 길이가 여유 공간보다 클 경우에 남는 부분을 잘라내기

 - right|clip_horizontal 로 설정한 경우 왼쪽에 남는 부분 잘라내기

 - left|clip_horizontal 로 설정한 경우 오른쪽에 남는 부분 잘라내기

 - center_horizontal|clip_horizontal 로 설정한 경우 왼쪽과 오른쪽에 남는 부분 잘라내기

 



baselineAligned : layout_gravity나 gravity 속성만으로 정렬에 어려움이 있을 경우를 위해 지원되는 속성이며 레이아웃에 추가되는 뷰들의 텍스트들의 아랫줄 맞추기 한다.

                         android:baselineAligned="true"


상대 레이아웃에서 부모 컨테이너와의 상대적 위치를 이용해 뷰를 배치할 수 있는 속성들 

 속성

 설명

 layout_alignParentTop

 부모 컨테이너의 위쪽과 뷰의 위쪽을 맞춤

 layout_alignParentBottom

 부모 컨테이너의 아래쪽과 뷰의 아래쪽을 맞춤

 layout_alignParentLeft

 부모 컨테이너의 왼쪽 끝과 뷰의 왼쪽 끝을 맞춤

 layout_alignParentRight

 부모 컨테이너의 오른쪽 끝과 뷰의 오른쪽 끝을 맞춤

 layout_centerHorizontal

 부모 컨테이너의 수평 방향 중앙에 배치함

 layout_centerVertical

 부모 컨테이너의 수직 방향 중앙에 배치함

 layout_centerInParent

 부모 컨테이너의 수평과 수직 방향 중앙에 배치함

 


상대 레이아웃에서 다른 뷰와의 상대적 위치를 이용하는 속성들

 속성

 설명

 layout_above

 지정한 뷰의 위쪽에 배치함

 layout_below

 지정한 뷰의 아래쪽에 배치함

 layout_toLeftOf

 지정한 뷰의 왼쪽에 배치함

 layout_toRightOf

 지정한 뷰의 오른쪽에 배치함

 layout_alignTop

 지정한 뷰의 위쪽과 맞춤

 layout_alignBottom

 지정한 뷰의 아래쪽과 맞춤

 layout_alignLeft

 지정한 뷰의 왼쪽과 맞춤

 layout_alignRight

 지정한 뷰의 오른쪽과 맞춤

 layout_alignBaseline

 지정한 뷰와 내용물의 아래쪽 기준선(baseline)을 맞춤 

 

EditText InputType 속성값들 

 속성 값 EditText에 입력 가능한 값  설명 
 none  모든 문자, 모든 기호 ,숫자  다른 톡징이 없는 기본 EditText. 입력 폼안에 줄 바꿈이 가능하다.
 text  none과 같으나 줄바꿈이 불가능.
 textCapCharacters  모든 입력된 영문이 대문자로 입력이 된다.
 textCapWords  단어의 첫번째 영문이 대문자로 입력된다.
 textCapSentences  문장의 첫번째 영문이 대문자로 입력.
 textAutoCorrect  입력된 단어를 올바른 단어로 수정할 수 있다.
 textAutoComplete  단어를 입력중에 완성된 단어를 표시 할 수 있다. 
 textMultiLine  입력 폼에 줄 바꿈이 가능하나 따로 설정하지 않으면 단일 줄의 텍스트로 제한됨.
 textImeMultiLine  여러줄의 텍스트 입력가능. 키보드에 줄바꿈 키가 표시됨.
 textNoSuggestions  입력할때 사전에 등록되어있는 어떤 단어도 표시하지 않는다.
 textUri  URI를 입력.
 textEmailAddress  이메일 주소를 입력.
 textEmailSubject  이메일의 제목을 입력.
 textShortMessage  짧은 메시지를 입력.
 textLongMessage  긴 메시지를 입력.
 textPersonName  사람 이름을 입력.
 textPostalAddress  주소의 우편번호를 입력.
 textPassword  비밀번호를 입력. 입력된 문자는 (*)로 표시.
 textVisiblePassword  비밀번호를 입력. 입력된 문자가 보인다.
 textWebEditText  텍스트를 입력. 웹 양식으로 제공된다.
 textFilter  다른 텍스트를 필터링 하기 위한 문자를 입력.
 textPhonetic  발음되는 발음문자를 입력.
 textWebEmailAddress  이메일 주소를 입력. 웹 양식으로 제공.
 textWebPassword  비밀번호를 입력. 웹 양식으로 제공.
 number  숫자  숫자를 입력 받는다.
 numberSigned  숫자  부호가 있는 숫자를 입력.
 numberDecimal  .(점) 기호, 숫자  소숫점이 있는 소수를 입력 받는다.
 numberPassword  숫자  숫자로 된 패스워드를 입력.
 phone  - 기호, 숫자  전화번호를 입력 받는다.
 datetime  -, : 기호, 숫자  날짜와 시간을 입력. 날짜는 -, 시간은 :로 구분.
 date  - 기호, 숫자  날짜를 입력.
 time  : 기호, 숫자   시간을 입력.



ImageVew의 Scaltype 속성

1. matrix(원본 그대로)
2. center(가운데 정렬)
3. centerCrop(비율을 유지하며 가운데를 중심으로 자른다.)
4. centerInside(비율을 유지하며 줄어듬)
5. fitStart(왼쪽 위 정렬/ 비율유지)
6. fitCenter(centerInside와 동일)
7. fitEnd(왼쪽 아래 정렬 / 비율유지)
8. fitXY(늘이기 ImageView를 비율에 상관없이 다 채웁니다.)

속성값 java 설명
matrix setScaleType(ImageView.ScaleType.MATRIX) 원본 크기 그대로 보여줌 (왼쪽 상단 정렬)
Center setScaleType(ImageView.ScaleType.CENTER) 원본 크기 그대로 보여줌 (가운데정렬)
centerCrop setScaleType(ImageView.ScaleType.CENTER_CROP) View 영역에 공백이 있으면 채워서 보여줌(비율유지)
centerInside setScaleType(ImageView.ScaleType.CENTER_INSIDE) View 영역을 벗어나면 맞춰서 보여줌(비율유지)
fitStart setScaleType(ImageView.ScaleType.FIT_START) View 영역에 맞게 보여줌 (왼쪽상단 정렬비율유지)
fitCenter setScaleType(ImageView.ScaleType.FIT_CENTER) View 영역에 맞게 보여줌 (가운데정렬비율유지)
fitEnd setScaleType(ImageView.ScaleType.FIT_END) View 영역에 맞게 보여줌 (왼쪽하단 정렬비율유지)
fitXY setScaleType(ImageView.ScaleType.FIT_XY) View 영역을 가득 채워서 보여줌(비율유지 안함)


TextView & EditText 기능들

EditText 의 selectAllOnFocus 속성 : 아래와 같이 이 값을 true로 설정하면 포커스를 받을때 문자열 전체가 선택된다.

                                 android:selectAllOnFocus="true"

EditText 의 cursorVisible 속성 : 이 속성 값을 false로 설정하면 커서가 보이지 않게 된다.

getSelectionStart() : 선택된 문자열의 시작 위치 얻기

getSelectionEnd() : 선택된 문자열의 끝 위치 얻기

setSelection() : 문자열중에서 선택영역을 지정하기

extendSelection() : 선택영역 확장하기

selectAll() : 전체 문자열 선택하기


자동링크 : autoLink - 이 속성은 문자열에 들어 있는 링크 정보를 자동으로 찾아 링크 색상으로 표시하고 클릭하면 필요한 기능을 수행하도록 한다.

                              이메일, 전화번호, 웹링크등..


줄 간격 조정

lineSpacingMultiplier 속성 : 줄 간격을 배수로 설정 - 1.0보다 작으면 기본 설정값보다 더 좁게 보인다.

lineSpacingExtra 속성 : 여유값으로 설정 - 줄 간격 설정에 주로 사용되며 빼곡한 문자열의 가독성을 높이기 위한 것이다.


대소문자 표시

capitalize 속성 : 대문자나 소문자로 바꾸어 표시하는 기능이며, characters, words, sentences 값을 사용 할 수 있고 이는 1문자, 단어, 문장 단위로

                       맨 앞 글자를 대문자로 표시해 준다.


줄임 표

- TextView의 텍스트가 한줄로 되어 있는데 범위를 넘어가는 경우에 뒷부분은 '...'로 표시된다.

ellipsize 속성 : 범위를 넘어가는 텍스트에 대해 어디를 잘라서 표시할 것인지 설정하는 속성이다.

                 default 값 : none - 뒷부분을 자른다.

                 start, middle, end : 각각 앞부분, 중간부분, 뒷부분을 잘라서 보여준다.

singleLine 속성 : 텍스트 뷰를 한줄로 표시한다.


힌트 표시

hint 속성 : EditText에 어떤 내용을 입력하라고 안내문구를 표시하고자 할때 사용한다. 입력값이 없을때만 표시된다.

textColorHint 속성 : hint 문구의 색상을 지정한다.


편집 제한

editable 속성 : EditText에 입력되어 있는 문자열을 편집하지 못하게 하고 싶다면 이 속성값을 false로 한다. 기본값은 true.


EditText의 입력 문자열 변경 처리

getText() : 입렫된 문자열을 얻기 위해 Editable 객체를 얻는다. toString()메소드로 일반 String타입의 문자열을 얻을수 있다.

TextChangedListener() : 입력 될때마다 문자열을 확인하고 싶을때 사용한다.

addTextChangedListener() : 텍스트가 변경될 때마다 발생하는 이벤트를 처리할 수 있는 TextWatcher객체를 설정 할 수 있다.

TextWatcher 인터페이스의 메소스들

      public void beforeTextChanged(CharSequence s, int start, int count, int after)

      public void afterTextChanged(Editable s)

      public void onTextChanged(CharSequence s, int start, int before, int count)


출처 : http://blog.naver.com/dalmagru?Redirect=Log&logNo=220257843965

 
이 댓글을 비밀 댓글로

안드로이드 App Flag_Activity 란?

Posted by ironmask84
2016. 1. 21. 11:27 나는 프로그래머다!/Java & Android


안드로이드 App을 개발에서 Activity는 필수적인 클래스입니다.

Activity를 상속받아서, Form 하나의 UI부 및 제어부를 구성합니다.


디폴트로 제공하는 유용한 CallBack 함수들도 (oncreate, onstart, ondestroy... 등) 유용합니다.


이 Activity를 구성해서 만들어보면, 어떻게 다른 Activity 혹은 다른 App의 Activity로 이동할 수 있을까?

하고 생각하게 되는데, 이를 처리해주는 것이 "Intent" 라는 클래스 입니다.

(안드로이드 App에 대해 어느정도 공부를 하신 분들은 Acticity, Intent, Service, BroadcastReceiver 클래스에 익숙하실 것입니다.)


자, 그럼 "Intent"를 통해서 "Activity"라는 Form을 왔다갔다 이동한다는 것은 알겠는데,
계속해서 왔다갔다 이동을 하게 되면, 이 Form들이 Stack에 어떻게 쌓이게 될까??

이에 대해서 알아보려고 합니다.


잘 정리된 블로그의 내용이 있어서 퍼왔습니다.. ^^;;


<안드로이드는 굉장히 유용한 FLAG_ACTIVITY 들을 제공합니다.>

일반적인 경우, 안드로이드 용 어플리케이션을 작성하게 되면 여러가지 Activity 들을 생성하게 됩니다. 
이때, 가장 골치가 아픈 일 중 하나는 바로 Activity 와 Activity 간의 Flow 를 설계하고 이를 적절하게 구현하는 일입니다. 
(특히 안드로이드를 사용해보지도 않은 UX 팀과 함께 일하게 되는 경우라면 더욱 그러합니다...)

 기본적으로 안드로이드 플랫폼 상에서 Activity 는 또 다른 Activity 를 시작할 수 있고, 각각의 Activity 는 차곡 차곡 Task 라고 
불리우는 Activity Stack 에 쌓이게 됩니다. 사용자는 일반적으로 Back 버튼을 이용해서 현재 화면상에 보이는 Activity 를 
종료 시키고, 바로 직전에 사용된 Activity 로 돌아갈 수 있습니다. 안드로이드 펍의 회색님의 말을 빌리자면, 
인터넷 브라우저를 통해 웹페이지를 검색하는 것과 유사한 방식입니다. 

 하지만 이러한 방법만으로는 효과적인 UX Flow 를 구축하는데 어려움이있습니다. 
다행히, 구글에서는 Activity 를 호출할 때 사용되는 Intent 에 적절한 플래그 값을 설정해서 Activity Stack 을 제어할 수 있는 방법을 
제공해 줍니다. 이 플래그들은  FLAG_ACTIVITY 라는 접두어를 갖고 있는데, 종류가 다양해 헷갈리는 수도 있는데, 
개인적으로 제가 가장 요긴하게 사용하고 있는 FLAG_ACTIVITY 네 가지를 소개해 봅니다. 

 먼저 FLAG_ACTIVITY_SINGLE_TOP 입니다. 우선 간단하게 그림으로 표현해 보았습니다. 
A 와 B  두 가지 Activity 가 있는 데, A 라는 Activity 는 B 를 
B 라는 Activity 는 다시 자기 자신인 B 를 호출 하는 경우라고 가정해 보겠습니다. 
< FLAG_ACTIVITY_SINGLE_TOP >

 호출하는 Activity B 가 이미 Task 의 가장 앞에 위치하는 경우, 또 하나의 B 를 생성하는 대신, 기존에 존재하는 B Activity 가 
재활용됩니다. 이 때 B 가 재활용된다는 것을 개발자가 알아채고 새롭게 전달되는 Intent 를 사용할 수 있도록 B Activity 의 
onPause() / onNewIntent() / onResume() 가 순차적으로 호출됩니다. 별 생각없이 동일한 Activity 를 여러번 생성하는 것은 
메모리 사용량과 Activity 시작 속도 양쪽 모두에 악영향을 끼칠 수 있습니다. (특히 이미지가 덕지덕지 붙어 있는 Activity 라면). 
이런 경우 FLAG_ACTIVITY_SINGLE_TOP 를 적절하게 활용하면 제법 큰 효과를 볼 수 있습니다.

 두 번째는, FLAG_ACTIVITY_NO_HISTORY 플래그입니다. 우선 간단하게 그림으로 표현해 보았습니다. A 와 B  두 가지 Activity 가 있는 데, A 라는 Activity 는 B 를 B 라는 Activity 는 A 를 호출한 후 에 (A->B->A) 사용자가 Back 키를 누르는 경우를 가정해 보겠습니다.
<FLAG_ACTIVITY_NO_HISTORY>

 말 그대로, FLAG_ACTIVITY_NO_HISTORY 로 설정된 Intent 로 시작된 Activity B 는 Task 에 그 흔적을 남기지 않게 됩니다. 
B 에서 또다른 A 를 시작한 후, Back 을 누르면 일반적인 경우 이전에 실행되었던 B 가 나타나지만, NO_HISTORY 를 사용하는 경우 
맨 처음에 실행 되었던 A 가 화면에 표시됩니다. 몇 가지 주의할 점이 있습니다. 우선 NO_HISTORY 를 사용하게 되면 Task 에 
해당 Intent 의 정보가 기록되지 않기 때문에, A->B 인 상황 (그림에서 두 번째 단계...) 에서 홈키등을 눌러 다른 Task 로 전환된 후, 
다시 본 Task 로 돌아오게 되면, A Activity 가 화면에 표시됩니다. 또한, B Activity 의 onDestroy() 가 호출되는 시점이 조금 애매합니다.
일반적인 예상과는 달리, B 에서 또다른 A Activity 를 호출하는 세 번째 단계에서는 onStop 까지만 호출되고, 
이 후에 새롭게 호출된 A Activity 가 사라지는 순간 (네 번째 단계) 에서야 onDestroy() 가 호출 됩니다.

 FLAG_ACTIVITY_NO_HISTORY 는 여러가지로 쓸모가 있는데, 특히 특정한 이벤트에 대한 알람등을 위해 
다이얼로그 형태로 화면에 표시되는 Activity 들에 적용하기에 편리합니다. (대게의 경우 팝업은 해당 시점에 한번만 보여주면 되니까.)

 다음으로 굉장히 유용한 플래그 두 가지를 동시에 설명해보고자 합니다.FLAG_ACTIVITY_REORDER_TO_FRONT 와 FLAG_ACTIVITY_CLEAR_TOP플래그입니다. 
우선 간략하게 그림으로 살펴 보겠습니다. A Activity 에서 B Activity 를 
그리고 B 에서 A 를 호출하는 상황을 가정해보았습니다. (A->B->A)


 FLAG_ACTIVITY_REORDER_TO_FRONT 는 매우 특이하게도 Task 의 순서 자체를 뒤바꿔 줍니다. 이 플래그를 사용하면, 
런치하고자 하는 Activity 가 이미 Task 상에 존재하는 경우 해당 Activity 를 새롭게 생성하는 대신, 
아래쪽에 위치한 Activity 의 순서를 Task 의 가장 위로 끌어올려줍니다. 따라서 A->B->A 의 순서로 Activity 호출이 일어날때, 
새로운 A 가 생성되는 대신 아래쪽에 위치한 A 가 위로 올라와 최종적으로 B->A 의 형태로 Task 가 구성되게 됩니다. 
어떤 Activity 에서 특정 Activity 로 점프하는 형식의 Flow 를 구성해야하는 경우 요긴하게 사용될 수도 있지만
Task 의 순서를 뒤섞는 다는 점에서 사용에 주의를 기울일 필요가 있습니다.  
(별 생각없이 남발하게 되면 Back 키가를 누를 때 엉뚱한 Activity 가 표시되어 사용자들이 굉장히 혼란스러워 하는 경우가 있습니다.) 

 마지막으로 소개해 드릴 플래그는 바로 FLAG_ACTIVITY_CLEAR_TOP 입니다. 
제가 개인적으로 가장 사랑스럽게 생각하는 녀석입니다.
이 플래그가 사용되는 경우  런치하고자 하는 Activity 가 이미 Task 상에 존재하는 경우,
 해당 Activity 위에 존재하는 다른 Activity 를 모두 종료시켜 줍니다. 
따라서 A->B->A 로 호출이 일어나는 경우, B Activity 가 종료 되고, A Activity 만 Task 에 남게 됩니다.
 (A->B->C->A 인 경우에도 마찬가지로 B와 C 가 종료되고 A 만 남게 됩니다.)

  이 Flag 는 특정 어플리케이션의 대쉬보드 (혹은 홈) Activity 를 호출할 때 굉장히 유용하게 사용될 수 있습니다. 
즉 하나의 어플리케이션이 하나 혹은 두 가지의 주요한 Activity 와 
그 외 특정 값을 선택하는등 단순한 일을 수행하기 위한 여러 개의 Sub-Activity 로 구성되어 있다면, 
주요 Activity 를 호출하는데 이 Flag 를 사용함으로서 어플리케이션의 홈버튼등을 손쉽게 구현할 수 있습니다. 
또 이 Flag 는 FLAG_ACTIVITY_REORDER_TO_FRONT 와는 달린 Task 의 순서를 뒤섞지 않음으로 
사용자에게도 큰 혼란을 주지 않습니다. (사용을 적극 권장합니다.)

 한 가지 주의해야할 점은 A->B->A 형태로 Activity 를 호출 하고자 할 때, 
단순히 FLAG_ACTIVITY_CLEAR_TOP 만을 사용하게 되면, 기존에 생성되었던 A Activity 가 종료된 후 (onDestroy() 가 호출됨) 
새롭게 A 가 생성 (onCreate()) 됩니다. 만일 기존에 사용된 A Activity 가 계속 사용되기를 원한다면, 
SINGLE_TOP 플래그와 함께 사용해야 합니다.

 휴... 생각보다 내용이 길어졌네요. 대부분 SDK 문서를 읽어보면 잘 나와있는 내용이라 새로운 내용은 없습니다만... 
문서 읽기를 게을리한 덕분에 한창을 고생했던 기억이 떠올라 (특히 CLEAR_TOP) 
유용하게 사용한 Flag 를 정리하는 겸 작성해 보았습니다~



 
이 댓글을 비밀 댓글로

Failed to allocate memory: 8 에뮬레이터 실행시 에러 대처 방안

Posted by ironmask84
2012. 4. 26. 15:31 나는 프로그래머다!


AVD(에뮬레이터) 4.X 띄우다 보면 아래와 같은 에러가 나는 경우가 있습니다.

Failed to allocate memory: 8
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.




메모리 문제 때문에 발생하는 것인데요.

이클립스 설정 파일인 eclipse.ini 파일에서 잡는 메모리 영역보다 작게 잡아주면,

해결이 됩니다. 

즉, eclipse.ini 파일에서 xmx 메모리를 512로 잡았으면,
아래 그림의Device Ram Size를 512 이하로 잡아주시면 됩니다.





 
이 댓글을 비밀 댓글로
  1. 프로필사진
    • ㅁㄴㅇ
    • 2012.12.13 12:44
    이렇게 하면 안드로이드 가상머신이 엄청 느려집니다

옵티머스 LTE 구입 후기!!

Posted by ironmask84
2012. 4. 23. 23:01 취미생활/안드로이드 탐방


옵티머스 마하를 쓴지.. 1년 3개월 정도만에..

옵티머스 LTE로 바꾸기로 했다!! ㅎㅎ

옵티머스 뷰가 가장 최신 모델이긴 했지만..
가로 길이가 커서 한 손에 딱 들어오지 않는 부분이 맘에 들지 않았다..
게다가 옵티머스 LTE가 출시된지 6개월 정도가 지났고, 가격이 꽤 많이 떨어져 있었다..
할부원금 198,000 에 구입했다! (USIM 무료, 3개월 62요금제 의무, HDTV 3개월 무료)

그 동안 3G를 사용하면서.. 너무 답답했었는데..
LTE로 바꾸니, 정말 시원시원한 느낌이다.. ㅎㅎ

사실 2년 다 안채우고, 바꾸게 된 가장 큰 이유도 느린 데이터 속도가 가장 큰 이유다.
그리고 옵티머스 마하는 내장메모리가 너무 적게 탑재된 탔에..
App을 많이 설치하지 않았는데도, 금방 용량 부족현상이... (정말 답답했음.. ㅠㅠ)

옵티머스 LTE는 디스플레이도 IPS로 아주 선명하고,
마하랑 비교해서 칩셋도 좋은데다, 안드로이드 포팅도 최적화가 비교적 잘되어 있어서 속도도 빠르고,
U+가 LTE망에 사활을 걸어서.. 전국망 설치에 속도도 가장 잘 나오는 망을 선점해서,
더욱 나의 U+용 옵티머스 LTE(LG-LU6200) 가 빛이 더하는 것 같다. ^^

이제는 좀 안드로이드 탐방을 주제로 한 이 카테고리에 글을 많이 올리고, 활동을 늘려야 겠다.
너무 오랜만에 글을 올린 것 같고, 폰 개발자로써 안드로이드에 관심을 많이 가져야 될 것 같다.


여담으로, 얼마전에 나도 드디어 피쳐폰 개발을 마치고, 스마트폰 개발에 합류하게 되었다.
앞으로 LG가 더욱 멋진 스마트폰을 만드는데 한 몫할 것을 다짐해본다..

 

 

 

 

 

 

'취미생활 > 안드로이드 탐방' 카테고리의 다른 글

옵티머스LTE ICS 업그레이드!  (0) 2012.06.25
옵티머스 LTE 구입 후기!!  (0) 2012.04.23
옵티머스 패드!! 구입하다..  (0) 2012.04.23
LG U+ 100 apps 공모전  (0) 2011.04.12
옵티머스 마하 구입하다!  (0) 2011.01.17
 
이 댓글을 비밀 댓글로