본문 바로가기
Android/안드로이드 프로그래밍 Next Step

안드로이드 프로그래밍 Next Step - 1.3 안드로이드 버전

by 몽슬몽슬 2019. 3. 23.

안드로이드 버전


1. 호환성모드


targetSdkVersion

- 앱 실행시 버전체크를 통해 호환성 모드 실행 여부를 결정하는 기준

- 해당 API 버전까지는 실행하는데 문제가 없다는 것을 보장함 (해당 버전까지 호환성모드를 사용하지 않음)

- 지정하지 않을 경우 디폴트는 minSdkVersion과 동일


minSdkVersion

- 해당 앱을 실행하기위해 요구되는 최소 API 버전


compileSdkVersion

- 컴파일시 사용하는 android.jar 파일의 버전

- 일반적으로 compileSdkVersion >= targetSdkVersion 

- 디폴트 값이 없으므로 반드시 지정해야한다.



2. Support 패키지의 ~Compat 클래스

런타임시 버전 체크를 통해 가능한 한 최신 버전의 기능을 활용하거나, 기존 메서드로 대체하는 코드를 미리 구현해놓은 클래스이다. 

  • ViewCompat
  • ActivityCompat
  • WindowCompat
  • NotificationCompat
  • AsyncTaskCompat
  • SharedPreferenceCompat.EditorCompat 등


public class ViewCompat {
public static final int OVER_SCROLL_ALWAYS = 0;
public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1;
public static final int OVER_SCROLL_NEVER = 2;

......

/*
* 버전별 클래스에서 구현할 인터페이스 정의
*/
interface ViewCompatImpl {
public boolean canScrollHorizontally(View v, int direction);
public boolean canScrollVertically(View v, int direction);
public int getOverScrollMode(View v);
public void setOverScrollMode(View v, int mode);
}

/*
* API 상위 버전 클래스가 하위 버전 ViewCompat 클래스를 상속한다. 
*/
static class BaseViewCompatImpl implements ViewCompatImpl {
public boolean canScrollHorizontally(View v, int direction){
return false;
}
public boolean canScrollVertically(View v, int direction){
return false;
}
public int getOverScrollMode(View v){
return OVER_SCROLL_NEVER;
}
public void setOverScrollMode(View v, int mode){
// Do Nothing. API 존재하지 않음
}
}

static class EclairMr1ViewCompatImpl extends BaseViewCompatImpl {
......
}

static class GBViewCompatImpl extends EclairMr1ViewCompatImpl {
/* 
* 진저브레드부터 getOverScrollMode 메서드가 처음 생김
* 이후 버전에서는 GBViewCompatImpl를 상속하므로 동일 기능 사용 (이전 버전은 사용불가)
*/
@Override
public boolean getOverScrollMode(View v){
return ViewCompatGingerBread.getOverScrollMode(v);
}
@Override
public boolean setOverScrollMode(View v, int mode){
return ViewCompatGingerBread.setOverScrollMode(v, mode);
}
}

......

/*
* 정적 초기화 블럭에서 API 버전에 따라 인터페이스 구현체가 INSTANCE 변수에 들어간다. 
*/
static final ViewCompatImpl INSTANCE;
static {
final int version = android.os.Build.VERSION.SDK_INT;
if(version >= 19) {
INSTANCE = new KitKatViewCompatImpl();
} else if(version >= 17) {
INSTANCE = new JbMr1ViewCompatImpl();
} else if ......
}

/*
* ViewCompat의 정적 메서드와 ViewCompatImpl 인터페이스의 메서드는 1:1 매핑된다. 
*/
public static boolean canScrollHorizontally(View v, int direction) {
return INSTANCE.canScrollHorizontally(v, direction);
}

public static boolean canScrollVertically(View v, int direction) {
return INSTANCE.canScrollVertically(v, direction);
}

public static int getOverScrollMode(View v) {
return INSTANCE.getOverScrollMode(v);
}

public static void setOverScrollMode(View v, int mode) {
return INSTANCE.getOverScrollMode(v);
}
}


댓글