Google Analytics for Android는 http://code.google.com/mobile/analytics/docs/android/ 에서 다운로드를 받고.. libGoogleAnalytics.jar 파일을 프로젝트의 lib 폴더에 복사를 하고, build path에 잡아서 사용하면 된다..
대충 예제 코드만 보면, 버튼의 클릭은 trackEvent, Activity를 로딩해서 데이터를 가져오는 형태는 trackPageView 메소드를 호출해서 통계자료로 사용하는 것으로 보인다.. 그리고, 코드는 일정시간이 지나면 Cron 잡처럼 디스패칭해서 데이터를 서버(Google Analytics)로 전송하는 형태라는 것을 알려주고 있다.
흠,, 그래도 도대체 어떻게 구현했는지가 궁금했다.. 그래서, 살짝 까본 결과는 아래와 같다.
* GoogleAnalyticsTracker는 static 인스턴스로 전형적인 싱클톤 패턴의 형태를 띠고 있다.
* 예제의 startSession 메소드를 호출하게 되면
** 이벤트를 저장할 데이터베이스를 생성한다
** 네트웍으로 처리할 디스패처를 생성한다..
** 디스패처의 콜백을 받을넘을 생성한다..
** 네트웍 연결관리하는 매니저를 생성하고..
** 안드로이드의 Handler를 하나 생성한다.. 이넘의 용도는 Timer의 schedule메소드와 비슷하게 일정시간 뒤에 등록한 Handler의 메소드를 실행한다..
* 예제의 trackEvent를 호출하면..
** 이벤트 객체를 만들어서, 위의 Handler객체의 postDelayed메소드를 사용해서 디스패처를 구동한다.
* 예제의 stopSession을 호출하면..
** 디스패처를 종료한다.. 결국 서버에 리포팅하는 쓰레드를 종료한다는 것이다..
흠, 위 과정이 Google Analytics for Android가 서버에 통계데이터를 리포팅하는 러프한 과정이다.
그 중에서도 디스패처로 NetworkDispater 클래스(내부적으로 아파치 HTTP 라이브러리 사용)를 사용하고 있는데, 틀만 살펴보면 아래와 같다..
자, 결론이다..
Google Analytics for Android를 사용하기 전에, 혹시 앱에 성능이슈를 유발할까? 또는 네트웍이 안 되면 문제가 생기지 않을까? 하는 의문은 역시 코드가 답을 해 준다.. 한마디 더 덧붙이자면, 코드 잘짰넹.. ㅋㅋ
대충 예제 코드만 보면, 버튼의 클릭은 trackEvent, Activity를 로딩해서 데이터를 가져오는 형태는 trackPageView 메소드를 호출해서 통계자료로 사용하는 것으로 보인다.. 그리고, 코드는 일정시간이 지나면 Cron 잡처럼 디스패칭해서 데이터를 서버(Google Analytics)로 전송하는 형태라는 것을 알려주고 있다.
흠,, 그래도 도대체 어떻게 구현했는지가 궁금했다.. 그래서, 살짝 까본 결과는 아래와 같다.
* GoogleAnalyticsTracker는 static 인스턴스로 전형적인 싱클톤 패턴의 형태를 띠고 있다.
* 예제의 startSession 메소드를 호출하게 되면
** 이벤트를 저장할 데이터베이스를 생성한다
** 네트웍으로 처리할 디스패처를 생성한다..
** 디스패처의 콜백을 받을넘을 생성한다..
** 네트웍 연결관리하는 매니저를 생성하고..
** 안드로이드의 Handler를 하나 생성한다.. 이넘의 용도는 Timer의 schedule메소드와 비슷하게 일정시간 뒤에 등록한 Handler의 메소드를 실행한다..
* 예제의 trackEvent를 호출하면..
** 이벤트 객체를 만들어서, 위의 Handler객체의 postDelayed메소드를 사용해서 디스패처를 구동한다.
* 예제의 stopSession을 호출하면..
** 디스패처를 종료한다.. 결국 서버에 리포팅하는 쓰레드를 종료한다는 것이다..
흠, 위 과정이 Google Analytics for Android가 서버에 통계데이터를 리포팅하는 러프한 과정이다.
그 중에서도 디스패처로 NetworkDispater 클래스(내부적으로 아파치 HTTP 라이브러리 사용)를 사용하고 있는데, 틀만 살펴보면 아래와 같다..
class NetworkDispatcher implements Dispatcher
{
private static final String GOOGLE_ANALYTICS_HOST_NAME = "www.google-analytics.com";
private static final int GOOGLE_ANALYTICS_HOST_PORT = 80;
private static final int MAX_GET_LENGTH = 2036; // 2048도 아닌 2036의 사이즈는 왜?? 흠.. 궁금하다..
private static final int MAX_POST_LENGTH = 8192;
private static final String USER_AGENT_TEMPLATE = "%s/%s (Linux; U; Android %s; %s-%s; %s Build/%s)";
private final String userAgent;
private static final int MAX_EVENTS_PER_PIPELINE = 30;
private static final int MAX_SEQUENTIAL_REQUESTS = 5;
private static final long MIN_RETRY_INTERVAL = 2L;
private final HttpHost googleAnalyticsHost;
private DispatcherThread dispatcherThread;
private boolean dryRun = false;
public NetworkDispatcher()
{
this("GoogleAnalytics", "1.4.2");
}
public NetworkDispatcher(String paramString1, String paramString2)
{
this(paramString1, paramString2, "www.google-analytics.com", 80);
}
NetworkDispatcher(String paramString1, String paramString2, String paramString3, int paramInt)
{
this.googleAnalyticsHost = new HttpHost(paramString3, paramInt);
Locale localLocale = Locale.getDefault();
this.userAgent = String.format("%s/%s (Linux; U; Android %s; %s-%s; %s Build/%s)", new Object[] { paramString1, paramString2, Build.VERSION.RELEASE, localLocale.getLanguage() != null ? localLocale.getLanguage().toLowerCase() : "en", localLocale.getCountry() != null ? localLocale.getCountry().toLowerCase() : "", Build.MODEL, Build.ID });
}
}
{
private static final String GOOGLE_ANALYTICS_HOST_NAME = "www.google-analytics.com";
private static final int GOOGLE_ANALYTICS_HOST_PORT = 80;
private static final int MAX_GET_LENGTH = 2036; // 2048도 아닌 2036의 사이즈는 왜?? 흠.. 궁금하다..
private static final int MAX_POST_LENGTH = 8192;
private static final String USER_AGENT_TEMPLATE = "%s/%s (Linux; U; Android %s; %s-%s; %s Build/%s)";
private final String userAgent;
private static final int MAX_EVENTS_PER_PIPELINE = 30;
private static final int MAX_SEQUENTIAL_REQUESTS = 5;
private static final long MIN_RETRY_INTERVAL = 2L;
private final HttpHost googleAnalyticsHost;
private DispatcherThread dispatcherThread;
private boolean dryRun = false;
public NetworkDispatcher()
{
this("GoogleAnalytics", "1.4.2");
}
public NetworkDispatcher(String paramString1, String paramString2)
{
this(paramString1, paramString2, "www.google-analytics.com", 80);
}
NetworkDispatcher(String paramString1, String paramString2, String paramString3, int paramInt)
{
this.googleAnalyticsHost = new HttpHost(paramString3, paramInt);
Locale localLocale = Locale.getDefault();
this.userAgent = String.format("%s/%s (Linux; U; Android %s; %s-%s; %s Build/%s)", new Object[] { paramString1, paramString2, Build.VERSION.RELEASE, localLocale.getLanguage() != null ? localLocale.getLanguage().toLowerCase() : "en", localLocale.getCountry() != null ? localLocale.getCountry().toLowerCase() : "", Build.MODEL, Build.ID });
}
}
자, 결론이다..
Google Analytics for Android를 사용하기 전에, 혹시 앱에 성능이슈를 유발할까? 또는 네트웍이 안 되면 문제가 생기지 않을까? 하는 의문은 역시 코드가 답을 해 준다.. 한마디 더 덧붙이자면, 코드 잘짰넹.. ㅋㅋ
'Android' 카테고리의 다른 글
| Eclipse ADT에서 Layout의 selector xml의 이미지 버튼등이 안 보일때.. (0) | 2011/12/18 |
|---|---|
| Android의 Dialog의 cancel과 dismiss의 차이점.. (0) | 2011/12/07 |
| Google Analytics for Android.. 살펴보기. (0) | 2011/12/05 |
| Android 다양한 해상도 지원하기.. (0) | 2011/11/28 |
| Android Facebook SDK 사용하기.. (0) | 2011/11/23 |