인증 및 초기설정, 지도 띄우기

ICS 이하 단말기 지원하기 : SupportMapFragment

http://developer.android.com에 있는 Testing 관련 글을 번역한 블로그


http://huewu.blog.me/110089695301

1. AndroidManifest.xml  파일의 manifest 엘리먼트 안에 아래와 같이 추가해준다.


<instrumentation android:name="android.test.InstrumentationTestRunner"

android:targetPackage="[앱 페키지 명]"

android:label="Test(임의 수정 가능)" />


2.    application 엘리먼트 바로 안에 다음과 같이 추가해준다.


<uses-library android:name="android.test.runner" />


SurfaceView 사용법 

1. SurfaceView를 상속 받고, 

2. SurfaceHolder.Callback을 구현하여준 후에, 

3. SurfaceView의 그리기 작업을 핸들링 해줄, Thread를 구현한다.


SurfaceView 사용목적?

책을 보며 공부하는 중에, 여러 이미지를 연속으로 바꾸면서 애니메이션 효과를 만드는 예제가 나왔다. 이 예제에선 화면을 디스플레이하는 뷰로써 SurfaceView를 사용했다. 그런데 왜 굳이 SurfaceView를 사용했는지 전혀 나와있지 않아서 찾아왔다. (책이 좀 별로인 듯...)


가장 큰 이유는 성능이었다. 윈도우에서 DirectX라는 것을 써서 게임을 만드는 것 처럼 안드로이드에선  카메라, 비디오, 3D, OpenGL 같은 종류에 대해 Surface를 사용하며 그 Surface를 일반적인 윈도우 구성요소인 View에서 사용할수 있게 만들어주는 것이 SurfaceView라고 한다.


참조

http://www.androidpub.com/13353

루퍼란?

  • 쓰레드에서 핸들러는 메시지큐에서 메시지를 읽어서 메인 쓰레드로 메시지를 전달하는 역할을 한다. 이 때 핸들러는 루퍼를 통해 메시지큐에서 메시지를 읽는다. 루퍼는 말 그대로 무한 루프 방식을 이용해 메시지 큐에 들어오는 메시지를 지속적으로 보면서 하나씩 처리한다. 메인 쓰레드는 UI 객체들을 처리하기 위해 메시지큐와 루퍼를 내부적으로 처리한다.
  • 그러나 별도의 쓰레드를 새로 만들었을 때는 해당 쓰레드에 루퍼가 존재하지 않기 때문에 다른 쓰레드에서 메시지를 전달받아 순차적으로 처리하고 싶다면 루퍼를 만들어야 한다.

루퍼는 아래와 같이 prepare와 loop 메소드를 통해 동작한다.

class ProcessThread extends Thread {
    ...
    public void run() {
        Looper.prepare();
        Looper.loop();
    }
    ...
}


ListView는 화면에 보여줄 하나의 아이템에 해당하는 뷰를 ArrayAdapter의 getView 메소드에서 만들어낸다. getView에서 View를 생성하고, 데이터를 입혀서 반환하는 방식이다.


getView 메소드를 재정의하는 몇 가지 방식이 있는데, 어떻게 하느냐에 따라 성능의 차이가 있다.


1. 무식한 방법

  • 매 position마다 View를 생성한다.


2. 개선된 방법

  • 안드로이드에서는 선택위젯이 스크롤될 때 View를 재활용하는 메커니즘을 가지고 있어 한 번 만들어진 뷰가 화면 상에 그대로 다시 보일 수 있도록 되어 있다. getView 메소드의 convertView 인자가 null이 아니면 재활용하는 방법이다.


3. 더 개선된 방법

  • 2번 방법도 개선의 여지가 있는데, 바로 findViewById라는 메소드이다. 어떤 뷰에서 입력한 id에 해당하는 View를 리턴해 주는 메소드인데, 이 메소드는 layout에서 계층구조가 심해질수록 더 오래걸릴 것이다. 그래서 findViewById 메소드까지 최소한으로 사용하도록 개선하면 더 좋은 성능을 기대할 수 있다.
  • 이를 홀더 패턴을 사용하여 구현할 수 있다. View를 생성하는 시점에 홀더에 View에 대한 정보를 저장하고 setTag메소드를 사용하여 해당 View에 홀더를 지정한다. 이후 View를 재활용하는 시점에서 findViewById메소드를 사용하지 않고 getTag메소드를 통해 해당 View에 대한 정보를 가져온다.

자세한 내용은 여기

안드로이드에서는 단말의 해상도에 상관없이 크기를 지정하는 경우가 많다. 그런데 안드로이드에서는 이미지 원본이 있을 때 이 이미지가 보이는 영역이 이미지 원본의 크기와 다르면 자동으로 늘려주기 때문에 이미지에 왜곡이 발생할 수 있다.


이러한 문제를 나인패치를 사용하여 해결할 수 있다.


나인패치는 기본적으로 1픽셀의 검정색 선으로써 영역을 지정한다. 영역은 scalable area와 fill area가 있는데 LEFT&TOP이 scalable area가 되며, RIGHT&BOTTOM이 fill area가 된다.


이미지가 늘어날 때 scalable area만 늘어남으로써 왜곡을 최소화하며, 내용은 fill area에 채워진다.


나인패치로 만들어진 이미지는 파일 이름을 XXX.9.png처럼 파일 확장자 앞에 '.9'를 붙여주어야 한다.


참고 사이트

안드로이드에서는 실행되는 어플리케이션의 상태를 시스템에서 직접 관리한다. 이는 대부분의 휴대단말용 OS에서 사용하는 방법으로 독립적인 어플리케이션이 시스템에 의해 관리되지 않을 경우 실행된 어플리케이션이 메모리를 과도하게 점유하거나 화면을 보여주는 권한을 과도하게 가지게 됨으로써 전화기의 원래 기능인 전화 수발신 기능 자체를 사용하지 못하게 될 수도 있기 때문이다.


안드로이드 어플리케이션을 구성하는 구성요소 중 하나인 액티비티(Activity)도 효율적인 메모리 관리를 위해 액티비티가 생성되고 소멸되는 조건인 생명주기(Lifecycle)을 가지고 있다.


액티비티의 상태는 크게 활성, 일시정지, 정지의 3가지로 나눌 수 있다.


활성

  • 화면 상에 액티비티가 보이면서 실핻되어 있는 상태. 액티비티 스택의 최상위에 있으며 포커스를 갖고 있음

일시정지

  • 사용자에게 보이기는 하지만 다른 액티비티가 위에 있어 포커스를 받지 못하는 상태. 대화상자가 위에 있어 일부가 가려저 있는 경우에 해당함.

정지

  • 다른 액티비티에 의해 완전히 가려져 보이지 않는 상태

자세한 내용은 여기


앱을 만들다 보면 인텐트를 통해 단순히 String, int, boolean 같은 기본 타입 뿐 아니고 커스텀 클래스나 오브젝트를 다른 컴포넌트에 전달해 줘야 할 경우가 많다. 그 경우 단순히 그냥 인텐트에 putExtra() 로는  넣어줄 수가 없다.안드로이드에서는 그런 경우를 위해 자바의 Serialization 개념과 유사한 Parcelable이라는 클래스가 있다.

 

자세한 내용은 여기

메니페스트 파일, 너는 누구냐?

+ Recent posts