SlideShare a Scribd company logo
1 of 85
Download to read offline
Modern Android
@dalinaum
About me
● GDG Korea Android 운영자
○ GDG Korea Android
○ http://goo.gl/62bGk
● Google Developers Expert
● Thinkware
발표 자료에 대해
이 발표자료는 저, 양찬석님, 전병권님이 작성한 자료를 기
준으로 하고 있습니다.
발표자료의 내용은 자유롭게 인용, 발췌할 수 있습니다.
Activity Stack?
● 웹 브라우져에는 왜 저렇게 탭이 많지?
● 앱들이 상호작용한다면 모바일 운영체제도
웹 브라우저 처럼 많은 앱이 열리게 될 것임.
● 관리할 방법이 필요함.
Activity Stack
● 연속된 작업 흐름끼리 쌓아 올리자.
● 카드덱 1) 메일을 읽던 중 링크를 클릭해서 웹
페이지를 본다.
● 카드덱 2) 사진 촬영 후에 포토원더에서 사진
을 편집한다.
● 다른 카드 덱으로 전환: 태스크 전환 버튼
● 카드 덱의 카드 제거: 백 버튼
닌겐노 건망증와 튼튼데스네.
지금 메일을 작성중입니다. 그전에는 무얼 했을
까요?
1. 친구 목록을 보다가 이메일 링크를 클릭했습
니다.
2. 노티피케이션을 보고 이메일을 클릭해서 답
장을 합니다.
3. 메일을 읽다가 답장을 합니다.
4. 메일 앱을 클릭해 들어와 메일을 작성합니다.
사용자는 3분만 지나도 뭘 했는지 모릅니다.
백 버튼으로 이전 상태로 가는 것이 적절할까
업 네비게이션의 도입
● 백 버튼: 이전 상태로 이동.
● 업 버튼: 상위 상태로 이동.
액션바
1. 업 버튼
a. 캐럿 (<) - 업 네비게이션 가능.
b. 로고나 아이콘이 같이 표현
2. 현재 위치나 이동할 수 있는 곳을 표현.
a. 탭이나 드로어 메뉴도 사용 가능.
3. 무엇을 할 수 있는지를 표현.
a. 액션 버튼. 넘친 항목은 오른 쪽 끝에 점 세개(4)로 표
액션바는 허니컴 이후에만 되는 것 아네
요?
http://actionbarsherlock.com/
프로요까지 지원. 구글도 씁니다.
Jake Wharton (스퀘어)
List 영역 Detail 영역
List영역 Detail영역
Fragment 특징
● 자체의 lifecycle 호출 ( onCreate, onPause
등)
○ 동적으로 Fragment의 추가/삭제가 쉽다.
○ UI가 아닌 Fragment도 생성 가능
● Activity 가 재생성되도 상태유지가 쉽다.
안드로이드 support library에서 쓸 수 있습니
다.
android.support.v4.app.
Fragment
타블랫용 layout
깔끔한 Activity 코드
서랍 메뉴 (Drawer Menu)
● 페이스북으로 부터 유행
했던 UI 안드로이드에서
공식 지원
● 어떠한 경우에도 액션바
가 움직이지 않는 것이
안드로이드 스타일.
● 캐럿 대신에 햄버거 (석삼)이 표시됨
● 메뉴가 열릴 때 상단의 항목은 그대로 배열되
고 햄버거의 가로폭만 좁아진다.
● http://goo.gl/LF0nv
더블 버퍼링, 트리플 버퍼링, VSync
● 젤리빈에서 트리플 버퍼링과 VSync 도입?
● 화면에 보여지는 영역: 프레임 버퍼
● 더블 버퍼링: 프레임 버퍼외 백 버퍼를 하나
두는 것.
○ 백버퍼 없이 프레임 버퍼에 그리면 그리는 과정 전체
가 보이게 됨.
○ 백버퍼에 내용을 그린 다음 프레임 버퍼에 고속 복사
하는 방식으로 구현.
○ 문제 주사되는 시점에 복사가 이루어지면 화면의 일
부만 복사된 상황에서 표시됨. (티어링 현상)
더블 버퍼링, 트리플 버퍼링, VSync
● 더블 버퍼링 + VSync
○ VSync는 주사 주기를 하드웨어로 부터 받아와서 참
고하는 것으로 티어링을 피할 수 있다.
○ 이번 주사 주기에 다 못 끝내면 다음 주사 주기까지
기다려야 한다.
○ 렌더링 실패시 성능은 1/N으로 떨어진다.
60 프레임 -> 30프레임 -> 20프레임 -> 10프레임.
● 트리플 버퍼링 + VSync
○ 백 버퍼를 하나 더 두어서 주사 주기를 기다리는 동안
다른 프레임을 그리자.
○ 밀린 프레임은 해당 프레임에서 밀림.
○ 백버퍼의 용량이 추가로 필요.
Show GPU overdraws
UI 상의 불필요한 요소를 쉽
게 찾을 수 있습니다. (4.2+)
두개의 옵션을 활성화하십
시요.
Worst case
● blue: 1x (2회)
● green: 2x
● light red: 3x
● dark red: 4x
우리의 소원은 2x
1x
2x
3x
4x
왜 배경이 1x일까요?
● window 배경 1회
● view 배경 1회
● 1 + 1 = 귀요미?
꼭 윈도우 배경 제거
합시다.
1x
2x
3x
4x
android:
windowBackground
@null
getWindow().
setBackgroundDraw
able(null);
transparent를 하지
맙시다.
1x
2x
3x
4x
overdraw GPU 최적화?
Deferred rendering을 하면 여러번 안 그립니다.
대표적인 구현: SGX
Nvidia 테그라는 무조건 횟수만큼 그립니다.
하드웨어 가속
하드웨어 가속
android:hardwareAccelerated="true"
허니컴 이후 부터 사용 가능.
이후 암시적으로 활성화되지만 명시적인게 좋다
고 생각함.
일부 하드웨어가 암시적인 활성화를 무시하기
때문.
디스플레이 리스트
Layer
하드웨어 레이어:
● 캐쉬를 FBO에 저장.
(FrameBufferObject)
● 한정된 영역.
● view.setLayerType
(View.LAYER.
HARDWARE, null)
소프트웨어 레이어:
● 비트맵 보관
● view.setLayerType
(View.LAYER.
SOFTWARE, null)
다양한 속성에 대한 에니메이션
ValueAnimator: View 이외에도 대부분의 속성에
대해 적용가능한 에니메이터 객체. (HC 11)
linear
non-linear
ValueAnimator va = ValueAnimator.ofInt(0, height);
va.setDuration(700);
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()
{
public void onAnimationUpdate(ValueAnimator animation) {
Integer value = (Integer) animation.getAnimatedValue();
v.getLayoutParams().height = value.intValue();
v.requestLayout();
}
});
에니메이션을 빠르게 하는 방법은 없나
요? (JB)
에니메이션을 빠르게 하는 방법은 없나
요? (JB)
객체의 프로퍼티
에 대한 디스플레
이 리스트가 확
장.
(DLProps)
● alpha
● translationX/Y
● scaleX/Y
● rotationX/YViewPropertyAnimator(HC 12), ObjectAnimator (HC 11)
ObjectAnimator
ObjectAnimator.ofFloat(myObject,
"alpha", 0f).start();
객체의 named property에 대한 에니메
이션.
ViewPropertyAnimator
myView.animate().alpha(0);
animatingButton.animate().
setDuration(2000);
(ObjectAnimator의 쉬운 방법)
SurfaceView's adventures in
Wonderland
API에서는 보이지만 회전, 확대, 알파 모든 것이
안됩니다.
SurfaceView (+GLSurfaceView)는 View 영역은
아래에 Surface가 보일 수 있도록 투명하게 합니
다.
(홀 펀칭)
대안: TextureView
뷰의 모든 기능을 사용가능.
GLSurfaceView등의 확장이 없기 때문에 스스로
만들어 써야 함.
3D 그래픽을 하는 것만 조금 까다로움. (기본 코
드가 없음.)
젤리빈 이상만 가능.
OpenGL
비동기 처리
● 일정 시간 이상 메인스레드가 동작하지 않으
면 ANR 에러.
○ 안드로이드는 UI가 메인스레드에서 동작해야 한다.
(아이폰도 UI는 메인스레드에서 존재. 에니메이션만
별도 스레드)
○ DB, 쉐어드프리퍼런스, 파일, 네트워크는 백그라운드
처리되어야 함
비동기 처리
● AsyncTask 모델
○ 백그라운드에서 처리해서 메인스레드에 갱신함.
○ 작업용 메서드, 후작업용 메서드를 오버라이드하는
형태.
○ 일시적으로 사용할때만 적합하다. (반복적으로
AsyncTask를 호출해야할 수 있음)
○ 엑티비티가 화면 전환 등으로 상태를 잃어버려 계속
호출할 수 있음.
● 스레드 모델
○ 메인 스레드와 연결된 핸들러를 이용해야 함.
○ 장기적으로 사용할 수는 있음.
○ 스레드를 만들어서 관리해야하는 것이 불편.
비동기 처리
● 로더
○ 생명주기에 맞추어 작동하는 도구.
○ 액티비티 상황에 따라 움직이는 것은 편리.
○ 장기적인 작업에는 적당하지 않음.
● 서비스
○ 장기적인 작업에 대한 유일한 답.
○ 별도의 스레드를 만들어야 하는 것은 불편.
배터리
● 라디오 대기, 라디오 저전력, 라디오 풀 파워
의 상태.
● 라디오 대기는 최소 전력이지만 네트워크 지
원하지 않음.
● 상태 전환 마다 레이턴시가 있고 효율을 위해
낮은 상태로 가는 것이 더 길게 설정되어 있
음.
배터리
● 최악의 경우:
○ 네트워크 통신을 1초동안 한다.
○ 18초 마다 통신을 한다.
○ 1초동안 네트워크 연결을 위해 2초 소모.
○ 17초간 절전 모드 들어가지 않음.
● 나누어서 네트워크 잡지 마세요.
Google Play Service
구글 자체 서비스 + 안드로이드를 쉽게 쓰기 위
한 서비스 (오픈소스 아님)
● 구글이 만든 HTTPS 확장.
● 구글, 페이스 북이 지지.
● HTTP 2.0의 근간.
● (HTTP와는 달리) 바이너리 기반 효율적.
● 여러 요청을 한번에 처리.
● HTTP 의 헤더도 압축. (HTTP는 본문만 압축)
● 다른 스트림의 끼어듬 허용. 우선 순위.
● 서버 푸쉬 가능 (이 부분만 웹 앱을 새로 적용
해야)
○ 필요한 이미지나 CSS, JS를 같이 푸쉬시킬 수 있음.
OkHTTP
● HTTPUrlConnection과 동일한 인터페이스
● GZIP 압축 지원.
● 캐쉬 지원.
● SPDY 지원.
● 커넥션 풀링 지원.
http://square.github.io/okhttp/ Jesse Wilson
(스퀘어, 전직 안드로이드 HTTP 파트 리드)
Retrofit
HTTP REST 처리 라이브러리. (http://square.github.io/retrofit/)
public interface GitHubService {
@GET("/users/{user}/repos")
List<Repo> listRepos(@Path("user") String user);
}
GitHubService service = restAdapter.create(GitHubService.
class);
List<Repo> repos = service.listRepos("octocat");
HTTP / 이미지 라이브러리 샘플들
http - OkHTTP 간단한 샘플로 main함수가 있는 코드들이 있습니다.
https://github.com/swankjesse/android-http-examples/tree/master/http
picasso-app - 스퀘어의 이미지 라이브러리 피카소에 대한 샘플들입니다.
https://github.com/swankjesse/android-http-examples/tree/master/picasso-app
retrofit-app - 역시 스퀘어가 만든 어노테이션 기반의 HTTP(JSON) 도구 레트로
핏에 대한 샘플들입니다.
https://github.com/swankjesse/android-http-examples/tree/master/retrofit-app
volley-app - 구글이 만든 발리 라이브러리에 대한 샘플입니다.
https://github.com/swankjesse/android-http-examples/tree/master/volley-app
Android Annotation
http://androidannotations.org/
AndroidAnnotations is an Open Source framework that
speeds up Android development.
It takes care of the plumbing, and lets you concentrate on
what's really important. By simplifying your code, it
facilitates its maintenance.
관용어!
findViewById...
(...)getSystemService...
setOnClickListener...
runOnUiThread(new Runnable()...
new Thread().start...
이정도는 괜찮지만 재미없어
요.
@EActivity(R.layout.translate) // Sets content view to R.layout.translate
public class TranslateActivity extends Activity {
@ViewById // Injects R.id.textInput
EditText textInput;
@ViewById(R.id.myTextView) // Injects R.id.myTextView
TextView result;
@AnimationRes // Injects android.R.anim.fade_in
Animation fadeIn;
@Click // When R.id.doTranslate button is clicked
void doTranslate() {
translateInBackground(textInput.getText().toString());
}
@Background // Executed in a background thread
void translateInBackground(String textToTranslate) {
String translatedText = callGoogleTranslate(textToTranslate);
showResult(translatedText);
}
@UiThread // Executed in the ui thread
void showResult(String translatedText) {
result.setText(translatedText);
result.startAnimation(fadeIn);
}
// [...]
}
Otto
http://square.github.com/otto/
Otto is an event bus designed to decouple different parts of your application
while still allowing them to communicate efficiently.
Forked from Guava, Otto adds unique functionality to an already refined
event bus as well as specializing it to the Android platform.
Guava
The Guava project contains several of Google's core libraries
that we rely on in our Java-based projects: collections,
caching, primitives support, concurrency libraries, common
annotations, string processing, I/O, and so forth.
https://squareup.com/
https://github.com/square
Event Bus
= transfer 'Event' between components
= listeners?
http://en.wikipedia.org/wiki/Bus_(computing)
Listener vs Event Bus
여러 프래그먼트를 사용하는 앱
A B C 1. 인터페이스를 만듭니다.
2. 인터페이스를 구현합니다.
3. 프래그먼트로 메시지를 전달합니다.
다른 프래그먼트와 소통하기
http://developer.android.com/training/basics/fragments/communicating.html
public static class MainActivity extends Activity
implements FragmentA .OnFragmentListener, FragmentB.OnFragmentListener, FragmentC.OnFragmentListener {
....
@Override
public void onFragmentA () {
}
public void onFragmentB() {
}
}
public class FragmentA extends Fragment {
OnFragmentListener mCallback ;
// Container Activity must implement this interface
public interface OnFragmentListener {
public void onArticleSelected (int position );
}
@Override
public void onAttach (Activity activity ) {
super.onAttach (activity );
try {
mCallback = (OnFragmentListener ) activity ;
} catch (ClassCastException e) {
throw new ClassCastException (activity .toString ()
+ " must implement OnFragmentListener" );
}
}
...
}
1. 인터페이스 정의하기
2. 인터페이스 구현하기
public static class MainActivity extends Activity
implements FragmentA .OnFragmentListener, FragmentB.OnFragmentListener, FragmentC.OnFragmentListener {
...
public void onArticleSelected (int position ) {
// The user selected the headline of an article from the FragmentA
// Do something here to display that article
FragmentA articleFrag = (FragmentA )
getSupportFragmentManager ().findFragmentById (R.id.article_fragment );
if (articleFrag != null) {
// If article frag is available, we're in two-pane layout...
// Call a method in the ArticleFragment to update its content
articleFrag .updateArticleView (position );
} else {
// Otherwise, we're in the one-pane layout and must swap frags...
// Create fragment and give it an argument for the selected article
FragmentA newFragment = new FragmentA ();
Bundle args = new Bundle();
args .putInt(FragmentA .ARG_POSITION , position );
newFragment .setArguments (args);
FragmentTransaction transaction = getSupportFragmentManager ().beginTransaction ();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transaction .replace(R.id.fragment_container , newFragment );
transaction .addToBackStack (null);
// Commit the transaction
transaction .commit();
}
}
}
3. 프래그먼트로 메시지 전달하기
3단계 Otto
1. 이벤트 버스를 만듭니다.
2. 이벤트를 발행합니다.
3. 이벤트를 구독합니다.
@Subscribe
public void answerAvailable (AnswerAvailableEvent event) {
// TODO: React to the event somehow!
}
bus.register(this);
bus.post(new AnswerAvailableEvent (42));
Bus bus1 = new Bus();
Bus bus2 = new Bus(ThreadEnforcer .MAIN);
기타 유용한 라이브러리
Pull-to-refresh
https://github.com/chrisbanes/Android-PullToRefresh
구글에 입
사!
ImageLoader
캐싱지원, 사용이 쉽다.
http://androidimageloader.com/
HttpResponseCache
Http응답을 캐싱해주는 라이브러리
Android 4.0 이상의 android.net.http.
HttpResponseCache 의 Backport
https://github.com/candrews/HttpResponseCache
google-gson
json을 Java Object로 변환해주는 라이브러리
https://code.google.com/p/google-gson/
String json = "{1, 2, 3, 4, 5}";
int[] array = gson.fromJson("[1,2,3,4,5]", int[].class)
jsoup
Beautiful Soup
(Python Html 파싱 라이브러리)의 자바 버전
http://jsoup.org/
acra(Application Crash Report
for Android)
앱 크래시 정보를 특정서버로(Google Doc, 자체서버
등)으로 전송해주는 라이브러리
http://acra.ch/
기타 참고
● Fragment 시작하기 - http://goo.gl/6k5Jj
● TextureView Demo - http://goo.gl/5NyI2
● 배터리를 절약하는 네트워크 어플리케이션의
구현
http://huewu.blog.me/110150046116
● 비동기를 위한 Loader - http://goo.gl/lU0qk
● SPDY는 무엇인가? - http://goo.gl/57MK2
●

More Related Content

What's hot

React를 이용하여 멀티플랫폼에서 개발하기
React를 이용하여 멀티플랫폼에서 개발하기React를 이용하여 멀티플랫폼에서 개발하기
React를 이용하여 멀티플랫폼에서 개발하기WebFrameworks
 
React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.
React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.
React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.병대 손
 
iOS App 개발 with React Native + ClojureScript
iOS App 개발 with React Native + ClojureScriptiOS App 개발 with React Native + ClojureScript
iOS App 개발 with React Native + ClojureScriptCheolhee Han
 
Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기성일 한
 
ReactJS로 시작하는 멀티플랫폼 개발하기
ReactJS로 시작하는 멀티플랫폼 개발하기ReactJS로 시작하는 멀티플랫폼 개발하기
ReactJS로 시작하는 멀티플랫폼 개발하기Taegon Kim
 
React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작Taegon Kim
 
[124] 하이브리드 앱 개발기 김한솔
[124] 하이브리드 앱 개발기 김한솔[124] 하이브리드 앱 개발기 김한솔
[124] 하이브리드 앱 개발기 김한솔NAVER D2
 
발렌타인 웨비너 7회 - React를 이용한 웹 앱 개발 살펴보기
발렌타인 웨비너 7회 - React를 이용한 웹 앱 개발 살펴보기발렌타인 웨비너 7회 - React를 이용한 웹 앱 개발 살펴보기
발렌타인 웨비너 7회 - React를 이용한 웹 앱 개발 살펴보기DoHyun Jung
 
Next Javascript ES2015 시작하기
Next Javascript ES2015 시작하기Next Javascript ES2015 시작하기
Next Javascript ES2015 시작하기JinKwon Lee
 
Single-page Application
Single-page ApplicationSingle-page Application
Single-page ApplicationSangmin Yoon
 
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)YoungSu Son
 
Node.js + Websocket 삽질기
Node.js + Websocket 삽질기Node.js + Websocket 삽질기
Node.js + Websocket 삽질기Paprikhan
 
Do not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDYDo not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDYHyun-woo Park
 
[D2 오픈세미나]3.web view hybridapp
[D2 오픈세미나]3.web view hybridapp[D2 오픈세미나]3.web view hybridapp
[D2 오픈세미나]3.web view hybridappNAVER D2
 
[141] react everywhere
[141] react everywhere[141] react everywhere
[141] react everywhereNAVER D2
 
[D2CAMPUS]JavaScript 다시 시작하기
[D2CAMPUS]JavaScript 다시 시작하기[D2CAMPUS]JavaScript 다시 시작하기
[D2CAMPUS]JavaScript 다시 시작하기NAVER D2
 
[115] clean fe development_윤지수
[115] clean fe development_윤지수[115] clean fe development_윤지수
[115] clean fe development_윤지수NAVER D2
 
Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012Daum DNA
 

What's hot (19)

React를 이용하여 멀티플랫폼에서 개발하기
React를 이용하여 멀티플랫폼에서 개발하기React를 이용하여 멀티플랫폼에서 개발하기
React를 이용하여 멀티플랫폼에서 개발하기
 
React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.
React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.
React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.
 
iOS App 개발 with React Native + ClojureScript
iOS App 개발 with React Native + ClojureScriptiOS App 개발 with React Native + ClojureScript
iOS App 개발 with React Native + ClojureScript
 
Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기
 
ReactJS로 시작하는 멀티플랫폼 개발하기
ReactJS로 시작하는 멀티플랫폼 개발하기ReactJS로 시작하는 멀티플랫폼 개발하기
ReactJS로 시작하는 멀티플랫폼 개발하기
 
React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작React Native를 사용한
 초간단 커뮤니티 앱 제작
React Native를 사용한
 초간단 커뮤니티 앱 제작
 
Django beginning
Django beginningDjango beginning
Django beginning
 
[124] 하이브리드 앱 개발기 김한솔
[124] 하이브리드 앱 개발기 김한솔[124] 하이브리드 앱 개발기 김한솔
[124] 하이브리드 앱 개발기 김한솔
 
발렌타인 웨비너 7회 - React를 이용한 웹 앱 개발 살펴보기
발렌타인 웨비너 7회 - React를 이용한 웹 앱 개발 살펴보기발렌타인 웨비너 7회 - React를 이용한 웹 앱 개발 살펴보기
발렌타인 웨비너 7회 - React를 이용한 웹 앱 개발 살펴보기
 
Next Javascript ES2015 시작하기
Next Javascript ES2015 시작하기Next Javascript ES2015 시작하기
Next Javascript ES2015 시작하기
 
Single-page Application
Single-page ApplicationSingle-page Application
Single-page Application
 
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
 
Node.js + Websocket 삽질기
Node.js + Websocket 삽질기Node.js + Websocket 삽질기
Node.js + Websocket 삽질기
 
Do not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDYDo not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDY
 
[D2 오픈세미나]3.web view hybridapp
[D2 오픈세미나]3.web view hybridapp[D2 오픈세미나]3.web view hybridapp
[D2 오픈세미나]3.web view hybridapp
 
[141] react everywhere
[141] react everywhere[141] react everywhere
[141] react everywhere
 
[D2CAMPUS]JavaScript 다시 시작하기
[D2CAMPUS]JavaScript 다시 시작하기[D2CAMPUS]JavaScript 다시 시작하기
[D2CAMPUS]JavaScript 다시 시작하기
 
[115] clean fe development_윤지수
[115] clean fe development_윤지수[115] clean fe development_윤지수
[115] clean fe development_윤지수
 
Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012
 

Viewers also liked

Modern Android UI, or not by Action Bar alone
Modern Android UI, or not by Action Bar aloneModern Android UI, or not by Action Bar alone
Modern Android UI, or not by Action Bar aloneAnton Rutkevich
 
(소스콘 2015 발표자료) Apache HORN, a large scale deep learning
(소스콘 2015 발표자료) Apache HORN, a large scale deep learning(소스콘 2015 발표자료) Apache HORN, a large scale deep learning
(소스콘 2015 발표자료) Apache HORN, a large scale deep learningEdward Yoon
 
룩앳미(포트폴리오) - 김대환
룩앳미(포트폴리오) - 김대환룩앳미(포트폴리오) - 김대환
룩앳미(포트폴리오) - 김대환대환 김
 
[NEXT] Android 개발 경험 프로젝트 5일차 (Actionbar, SideNavigation)
[NEXT] Android 개발 경험 프로젝트 5일차 (Actionbar, SideNavigation)[NEXT] Android 개발 경험 프로젝트 5일차 (Actionbar, SideNavigation)
[NEXT] Android 개발 경험 프로젝트 5일차 (Actionbar, SideNavigation)YoungSu Son
 
Drawable 발표
Drawable 발표Drawable 발표
Drawable 발표인수 장
 
Copy cat sng#2
Copy cat sng#2Copy cat sng#2
Copy cat sng#2StellaYun
 
Korea Fashion
Korea FashionKorea Fashion
Korea FashionYu Il Kim
 
2014 teaminterface company profile
2014 teaminterface company profile2014 teaminterface company profile
2014 teaminterface company profileteaminterface
 
Modern Android App Development
Modern Android App DevelopmentModern Android App Development
Modern Android App DevelopmentChi Hwan Choi
 
C++ 미정의 행동(undefined behavior)
C++ 미정의 행동(undefined behavior)C++ 미정의 행동(undefined behavior)
C++ 미정의 행동(undefined behavior)은아 정
 
[0602 박민근] Direct2D
[0602 박민근] Direct2D[0602 박민근] Direct2D
[0602 박민근] Direct2D흥배 최
 

Viewers also liked (20)

Modern Android UI, or not by Action Bar alone
Modern Android UI, or not by Action Bar aloneModern Android UI, or not by Action Bar alone
Modern Android UI, or not by Action Bar alone
 
(소스콘 2015 발표자료) Apache HORN, a large scale deep learning
(소스콘 2015 발표자료) Apache HORN, a large scale deep learning(소스콘 2015 발표자료) Apache HORN, a large scale deep learning
(소스콘 2015 발표자료) Apache HORN, a large scale deep learning
 
룩앳미(포트폴리오) - 김대환
룩앳미(포트폴리오) - 김대환룩앳미(포트폴리오) - 김대환
룩앳미(포트폴리오) - 김대환
 
[NEXT] Android 개발 경험 프로젝트 5일차 (Actionbar, SideNavigation)
[NEXT] Android 개발 경험 프로젝트 5일차 (Actionbar, SideNavigation)[NEXT] Android 개발 경험 프로젝트 5일차 (Actionbar, SideNavigation)
[NEXT] Android 개발 경험 프로젝트 5일차 (Actionbar, SideNavigation)
 
Drawable 발표
Drawable 발표Drawable 발표
Drawable 발표
 
Copy cat sng#2
Copy cat sng#2Copy cat sng#2
Copy cat sng#2
 
Korea Fashion
Korea FashionKorea Fashion
Korea Fashion
 
2014 teaminterface company profile
2014 teaminterface company profile2014 teaminterface company profile
2014 teaminterface company profile
 
Anatomy of an android
Anatomy of an androidAnatomy of an android
Anatomy of an android
 
A brief guide to android gradle
A brief guide to android gradleA brief guide to android gradle
A brief guide to android gradle
 
The Git - (#1/2)
The Git - (#1/2)The Git - (#1/2)
The Git - (#1/2)
 
Realm Java
Realm JavaRealm Java
Realm Java
 
Butter android views
Butter android viewsButter android views
Butter android views
 
Modern Android App Development
Modern Android App DevelopmentModern Android App Development
Modern Android App Development
 
Tensorflow 101
Tensorflow 101Tensorflow 101
Tensorflow 101
 
Actionbar and fragment
Actionbar and fragmentActionbar and fragment
Actionbar and fragment
 
Final project
Final projectFinal project
Final project
 
C++ 미정의 행동(undefined behavior)
C++ 미정의 행동(undefined behavior)C++ 미정의 행동(undefined behavior)
C++ 미정의 행동(undefined behavior)
 
[0602 박민근] Direct2D
[0602 박민근] Direct2D[0602 박민근] Direct2D
[0602 박민근] Direct2D
 
3D Graphics 101
3D Graphics 1013D Graphics 101
3D Graphics 101
 

Similar to Modern android

응답하라 반응형웹 - 4. angular
응답하라 반응형웹 - 4. angular응답하라 반응형웹 - 4. angular
응답하라 반응형웹 - 4. angularredribbon1307
 
Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지Bansook Nam
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기현철 조
 
[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for Appspresso[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for AppspressoKTH, 케이티하이텔
 
[121]네이버 효과툰 구현 이야기
[121]네이버 효과툰 구현 이야기[121]네이버 효과툰 구현 이야기
[121]네이버 효과툰 구현 이야기NAVER D2
 
Flipper 불완전 정복
Flipper 불완전 정복Flipper 불완전 정복
Flipper 불완전 정복Sewon Ann
 
20131217 html5
20131217 html520131217 html5
20131217 html5DK Lee
 
웹 Front-End 실무 이야기
웹 Front-End 실무 이야기웹 Front-End 실무 이야기
웹 Front-End 실무 이야기JinKwon Lee
 
안드로이드 오픈소스 어플리케이션 블록
안드로이드 오픈소스 어플리케이션 블록안드로이드 오픈소스 어플리케이션 블록
안드로이드 오픈소스 어플리케이션 블록YoungSu Son
 
1.Create Project Sunshine - 시온고등학교 안드로이드 스터디
1.Create Project Sunshine - 시온고등학교 안드로이드 스터디1.Create Project Sunshine - 시온고등학교 안드로이드 스터디
1.Create Project Sunshine - 시온고등학교 안드로이드 스터디Youngbin Han
 
Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1Dong Chan Shin
 
Java script 강의자료_ed13
Java script 강의자료_ed13Java script 강의자료_ed13
Java script 강의자료_ed13hungrok
 
Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유
Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유
Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유Sang Seok Lim
 
svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드Insub Lee
 
Data-binding AngularJS
Data-binding AngularJSData-binding AngularJS
Data-binding AngularJSEunYoung Kim
 
Open Source Engineering V2
Open Source Engineering V2Open Source Engineering V2
Open Source Engineering V2YoungSu Son
 
HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)
HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)
HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)JinKwon Lee
 
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안Jeongsang Baek
 
GDG DevFest Busan 16" Android Nougat Developer's Note
GDG DevFest Busan 16" Android Nougat Developer's NoteGDG DevFest Busan 16" Android Nougat Developer's Note
GDG DevFest Busan 16" Android Nougat Developer's NoteSeok-yong Kim
 

Similar to Modern android (20)

응답하라 반응형웹 - 4. angular
응답하라 반응형웹 - 4. angular응답하라 반응형웹 - 4. angular
응답하라 반응형웹 - 4. angular
 
Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
 
[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for Appspresso[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for Appspresso
 
[121]네이버 효과툰 구현 이야기
[121]네이버 효과툰 구현 이야기[121]네이버 효과툰 구현 이야기
[121]네이버 효과툰 구현 이야기
 
Flipper 불완전 정복
Flipper 불완전 정복Flipper 불완전 정복
Flipper 불완전 정복
 
20131217 html5
20131217 html520131217 html5
20131217 html5
 
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
 
웹 Front-End 실무 이야기
웹 Front-End 실무 이야기웹 Front-End 실무 이야기
웹 Front-End 실무 이야기
 
안드로이드 오픈소스 어플리케이션 블록
안드로이드 오픈소스 어플리케이션 블록안드로이드 오픈소스 어플리케이션 블록
안드로이드 오픈소스 어플리케이션 블록
 
1.Create Project Sunshine - 시온고등학교 안드로이드 스터디
1.Create Project Sunshine - 시온고등학교 안드로이드 스터디1.Create Project Sunshine - 시온고등학교 안드로이드 스터디
1.Create Project Sunshine - 시온고등학교 안드로이드 스터디
 
Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1
 
Java script 강의자료_ed13
Java script 강의자료_ed13Java script 강의자료_ed13
Java script 강의자료_ed13
 
Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유
Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유
Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유
 
svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드
 
Data-binding AngularJS
Data-binding AngularJSData-binding AngularJS
Data-binding AngularJS
 
Open Source Engineering V2
Open Source Engineering V2Open Source Engineering V2
Open Source Engineering V2
 
HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)
HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)
HTML5로 만드는 데스크탑 어플리케이션 (Node-Webkit)
 
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
 
GDG DevFest Busan 16" Android Nougat Developer's Note
GDG DevFest Busan 16" Android Nougat Developer's NoteGDG DevFest Busan 16" Android Nougat Developer's Note
GDG DevFest Busan 16" Android Nougat Developer's Note
 

More from Leonardo YongUk Kim

Kotlin 2.0을 통해 알아보는 코틀린의 미래
Kotlin 2.0을 통해 알아보는 코틀린의 미래Kotlin 2.0을 통해 알아보는 코틀린의 미래
Kotlin 2.0을 통해 알아보는 코틀린의 미래Leonardo YongUk Kim
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계Leonardo YongUk Kim
 
Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?Leonardo YongUk Kim
 
MVC부터 MVVM, 단방향 데이터 흐름까지
MVC부터 MVVM, 단방향 데이터 흐름까지MVC부터 MVVM, 단방향 데이터 흐름까지
MVC부터 MVVM, 단방향 데이터 흐름까지Leonardo YongUk Kim
 
A brief introduction to Realm with Kotlin
A brief introduction to Realm with KotlinA brief introduction to Realm with Kotlin
A brief introduction to Realm with KotlinLeonardo YongUk Kim
 
오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?
오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?
오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?Leonardo YongUk Kim
 
Realm: 초고속 데이터베이스
Realm: 초고속 데이터베이스Realm: 초고속 데이터베이스
Realm: 초고속 데이터베이스Leonardo YongUk Kim
 
Veni, Vide, Built: Android Gradle Plugin
Veni, Vide, Built: Android Gradle PluginVeni, Vide, Built: Android Gradle Plugin
Veni, Vide, Built: Android Gradle PluginLeonardo YongUk Kim
 
좋은 뷰, 나쁜 뷰, 이상한 뷰
좋은 뷰, 나쁜 뷰, 이상한 뷰좋은 뷰, 나쁜 뷰, 이상한 뷰
좋은 뷰, 나쁜 뷰, 이상한 뷰Leonardo YongUk Kim
 
GIt 마을로 이주하기 (Git -> Svn, svn-all-fast-export)
GIt 마을로 이주하기 (Git -> Svn, svn-all-fast-export)GIt 마을로 이주하기 (Git -> Svn, svn-all-fast-export)
GIt 마을로 이주하기 (Git -> Svn, svn-all-fast-export)Leonardo YongUk Kim
 

More from Leonardo YongUk Kim (18)

Compose Multiplatform 101
Compose Multiplatform 101Compose Multiplatform 101
Compose Multiplatform 101
 
Kotlin 2.0을 통해 알아보는 코틀린의 미래
Kotlin 2.0을 통해 알아보는 코틀린의 미래Kotlin 2.0을 통해 알아보는 코틀린의 미래
Kotlin 2.0을 통해 알아보는 코틀린의 미래
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계
 
Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?
 
MVC부터 MVVM, 단방향 데이터 흐름까지
MVC부터 MVVM, 단방향 데이터 흐름까지MVC부터 MVVM, 단방향 데이터 흐름까지
MVC부터 MVVM, 단방향 데이터 흐름까지
 
Anatomy of Realm
Anatomy of RealmAnatomy of Realm
Anatomy of Realm
 
PublishSubject
PublishSubjectPublishSubject
PublishSubject
 
Realm과 RxJava
Realm과 RxJavaRealm과 RxJava
Realm과 RxJava
 
A brief introduction to Realm with Kotlin
A brief introduction to Realm with KotlinA brief introduction to Realm with Kotlin
A brief introduction to Realm with Kotlin
 
오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?
오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?
오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?
 
Realm: 초고속 데이터베이스
Realm: 초고속 데이터베이스Realm: 초고속 데이터베이스
Realm: 초고속 데이터베이스
 
React Everywhere
React EverywhereReact Everywhere
React Everywhere
 
React Redux React Native
React Redux React NativeReact Redux React Native
React Redux React Native
 
Veni, Vide, Built: Android Gradle Plugin
Veni, Vide, Built: Android Gradle PluginVeni, Vide, Built: Android Gradle Plugin
Veni, Vide, Built: Android Gradle Plugin
 
좋은 뷰, 나쁜 뷰, 이상한 뷰
좋은 뷰, 나쁜 뷰, 이상한 뷰좋은 뷰, 나쁜 뷰, 이상한 뷰
좋은 뷰, 나쁜 뷰, 이상한 뷰
 
The git
The gitThe git
The git
 
GIt 마을로 이주하기 (Git -> Svn, svn-all-fast-export)
GIt 마을로 이주하기 (Git -> Svn, svn-all-fast-export)GIt 마을로 이주하기 (Git -> Svn, svn-all-fast-export)
GIt 마을로 이주하기 (Git -> Svn, svn-all-fast-export)
 
red black tree
red black treered black tree
red black tree
 

Modern android

  • 2. About me ● GDG Korea Android 운영자 ○ GDG Korea Android ○ http://goo.gl/62bGk ● Google Developers Expert ● Thinkware
  • 3. 발표 자료에 대해 이 발표자료는 저, 양찬석님, 전병권님이 작성한 자료를 기 준으로 하고 있습니다. 발표자료의 내용은 자유롭게 인용, 발췌할 수 있습니다.
  • 4. Activity Stack? ● 웹 브라우져에는 왜 저렇게 탭이 많지? ● 앱들이 상호작용한다면 모바일 운영체제도 웹 브라우저 처럼 많은 앱이 열리게 될 것임. ● 관리할 방법이 필요함.
  • 5. Activity Stack ● 연속된 작업 흐름끼리 쌓아 올리자. ● 카드덱 1) 메일을 읽던 중 링크를 클릭해서 웹 페이지를 본다. ● 카드덱 2) 사진 촬영 후에 포토원더에서 사진 을 편집한다. ● 다른 카드 덱으로 전환: 태스크 전환 버튼 ● 카드 덱의 카드 제거: 백 버튼
  • 6. 닌겐노 건망증와 튼튼데스네. 지금 메일을 작성중입니다. 그전에는 무얼 했을 까요? 1. 친구 목록을 보다가 이메일 링크를 클릭했습 니다. 2. 노티피케이션을 보고 이메일을 클릭해서 답 장을 합니다. 3. 메일을 읽다가 답장을 합니다. 4. 메일 앱을 클릭해 들어와 메일을 작성합니다. 사용자는 3분만 지나도 뭘 했는지 모릅니다. 백 버튼으로 이전 상태로 가는 것이 적절할까
  • 7. 업 네비게이션의 도입 ● 백 버튼: 이전 상태로 이동. ● 업 버튼: 상위 상태로 이동.
  • 8.
  • 9. 액션바 1. 업 버튼 a. 캐럿 (<) - 업 네비게이션 가능. b. 로고나 아이콘이 같이 표현 2. 현재 위치나 이동할 수 있는 곳을 표현. a. 탭이나 드로어 메뉴도 사용 가능. 3. 무엇을 할 수 있는지를 표현. a. 액션 버튼. 넘친 항목은 오른 쪽 끝에 점 세개(4)로 표
  • 10. 액션바는 허니컴 이후에만 되는 것 아네 요? http://actionbarsherlock.com/ 프로요까지 지원. 구글도 씁니다. Jake Wharton (스퀘어)
  • 11.
  • 14. Fragment 특징 ● 자체의 lifecycle 호출 ( onCreate, onPause 등) ○ 동적으로 Fragment의 추가/삭제가 쉽다. ○ UI가 아닌 Fragment도 생성 가능 ● Activity 가 재생성되도 상태유지가 쉽다.
  • 15. 안드로이드 support library에서 쓸 수 있습니 다. android.support.v4.app. Fragment
  • 18.
  • 19. 서랍 메뉴 (Drawer Menu) ● 페이스북으로 부터 유행 했던 UI 안드로이드에서 공식 지원 ● 어떠한 경우에도 액션바 가 움직이지 않는 것이 안드로이드 스타일.
  • 20. ● 캐럿 대신에 햄버거 (석삼)이 표시됨 ● 메뉴가 열릴 때 상단의 항목은 그대로 배열되 고 햄버거의 가로폭만 좁아진다. ● http://goo.gl/LF0nv
  • 21.
  • 22.
  • 23. 더블 버퍼링, 트리플 버퍼링, VSync ● 젤리빈에서 트리플 버퍼링과 VSync 도입? ● 화면에 보여지는 영역: 프레임 버퍼 ● 더블 버퍼링: 프레임 버퍼외 백 버퍼를 하나 두는 것. ○ 백버퍼 없이 프레임 버퍼에 그리면 그리는 과정 전체 가 보이게 됨. ○ 백버퍼에 내용을 그린 다음 프레임 버퍼에 고속 복사 하는 방식으로 구현. ○ 문제 주사되는 시점에 복사가 이루어지면 화면의 일 부만 복사된 상황에서 표시됨. (티어링 현상)
  • 24. 더블 버퍼링, 트리플 버퍼링, VSync ● 더블 버퍼링 + VSync ○ VSync는 주사 주기를 하드웨어로 부터 받아와서 참 고하는 것으로 티어링을 피할 수 있다. ○ 이번 주사 주기에 다 못 끝내면 다음 주사 주기까지 기다려야 한다. ○ 렌더링 실패시 성능은 1/N으로 떨어진다. 60 프레임 -> 30프레임 -> 20프레임 -> 10프레임. ● 트리플 버퍼링 + VSync ○ 백 버퍼를 하나 더 두어서 주사 주기를 기다리는 동안 다른 프레임을 그리자. ○ 밀린 프레임은 해당 프레임에서 밀림. ○ 백버퍼의 용량이 추가로 필요.
  • 25. Show GPU overdraws UI 상의 불필요한 요소를 쉽 게 찾을 수 있습니다. (4.2+) 두개의 옵션을 활성화하십 시요.
  • 26.
  • 28. ● blue: 1x (2회) ● green: 2x ● light red: 3x ● dark red: 4x 우리의 소원은 2x 1x 2x 3x 4x
  • 29. 왜 배경이 1x일까요? ● window 배경 1회 ● view 배경 1회 ● 1 + 1 = 귀요미? 꼭 윈도우 배경 제거 합시다. 1x 2x 3x 4x
  • 31. overdraw GPU 최적화? Deferred rendering을 하면 여러번 안 그립니다. 대표적인 구현: SGX Nvidia 테그라는 무조건 횟수만큼 그립니다.
  • 33. 하드웨어 가속 android:hardwareAccelerated="true" 허니컴 이후 부터 사용 가능. 이후 암시적으로 활성화되지만 명시적인게 좋다 고 생각함. 일부 하드웨어가 암시적인 활성화를 무시하기 때문.
  • 34.
  • 36.
  • 37. Layer 하드웨어 레이어: ● 캐쉬를 FBO에 저장. (FrameBufferObject) ● 한정된 영역. ● view.setLayerType (View.LAYER. HARDWARE, null) 소프트웨어 레이어: ● 비트맵 보관 ● view.setLayerType (View.LAYER. SOFTWARE, null)
  • 38.
  • 39. 다양한 속성에 대한 에니메이션 ValueAnimator: View 이외에도 대부분의 속성에 대해 적용가능한 에니메이터 객체. (HC 11) linear non-linear
  • 40. ValueAnimator va = ValueAnimator.ofInt(0, height); va.setDuration(700); va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { public void onAnimationUpdate(ValueAnimator animation) { Integer value = (Integer) animation.getAnimatedValue(); v.getLayoutParams().height = value.intValue(); v.requestLayout(); } });
  • 41. 에니메이션을 빠르게 하는 방법은 없나 요? (JB)
  • 42. 에니메이션을 빠르게 하는 방법은 없나 요? (JB) 객체의 프로퍼티 에 대한 디스플레 이 리스트가 확 장. (DLProps) ● alpha ● translationX/Y ● scaleX/Y ● rotationX/YViewPropertyAnimator(HC 12), ObjectAnimator (HC 11)
  • 43.
  • 46. SurfaceView's adventures in Wonderland API에서는 보이지만 회전, 확대, 알파 모든 것이 안됩니다. SurfaceView (+GLSurfaceView)는 View 영역은 아래에 Surface가 보일 수 있도록 투명하게 합니 다. (홀 펀칭)
  • 47. 대안: TextureView 뷰의 모든 기능을 사용가능. GLSurfaceView등의 확장이 없기 때문에 스스로 만들어 써야 함. 3D 그래픽을 하는 것만 조금 까다로움. (기본 코 드가 없음.) 젤리빈 이상만 가능.
  • 48.
  • 49.
  • 50.
  • 51.
  • 53. 비동기 처리 ● 일정 시간 이상 메인스레드가 동작하지 않으 면 ANR 에러. ○ 안드로이드는 UI가 메인스레드에서 동작해야 한다. (아이폰도 UI는 메인스레드에서 존재. 에니메이션만 별도 스레드) ○ DB, 쉐어드프리퍼런스, 파일, 네트워크는 백그라운드 처리되어야 함
  • 54. 비동기 처리 ● AsyncTask 모델 ○ 백그라운드에서 처리해서 메인스레드에 갱신함. ○ 작업용 메서드, 후작업용 메서드를 오버라이드하는 형태. ○ 일시적으로 사용할때만 적합하다. (반복적으로 AsyncTask를 호출해야할 수 있음) ○ 엑티비티가 화면 전환 등으로 상태를 잃어버려 계속 호출할 수 있음. ● 스레드 모델 ○ 메인 스레드와 연결된 핸들러를 이용해야 함. ○ 장기적으로 사용할 수는 있음. ○ 스레드를 만들어서 관리해야하는 것이 불편.
  • 55. 비동기 처리 ● 로더 ○ 생명주기에 맞추어 작동하는 도구. ○ 액티비티 상황에 따라 움직이는 것은 편리. ○ 장기적인 작업에는 적당하지 않음. ● 서비스 ○ 장기적인 작업에 대한 유일한 답. ○ 별도의 스레드를 만들어야 하는 것은 불편.
  • 56. 배터리 ● 라디오 대기, 라디오 저전력, 라디오 풀 파워 의 상태. ● 라디오 대기는 최소 전력이지만 네트워크 지 원하지 않음. ● 상태 전환 마다 레이턴시가 있고 효율을 위해 낮은 상태로 가는 것이 더 길게 설정되어 있 음.
  • 57. 배터리 ● 최악의 경우: ○ 네트워크 통신을 1초동안 한다. ○ 18초 마다 통신을 한다. ○ 1초동안 네트워크 연결을 위해 2초 소모. ○ 17초간 절전 모드 들어가지 않음. ● 나누어서 네트워크 잡지 마세요.
  • 58. Google Play Service 구글 자체 서비스 + 안드로이드를 쉽게 쓰기 위 한 서비스 (오픈소스 아님)
  • 59.
  • 60.
  • 61.
  • 62. ● 구글이 만든 HTTPS 확장. ● 구글, 페이스 북이 지지. ● HTTP 2.0의 근간.
  • 63. ● (HTTP와는 달리) 바이너리 기반 효율적. ● 여러 요청을 한번에 처리. ● HTTP 의 헤더도 압축. (HTTP는 본문만 압축) ● 다른 스트림의 끼어듬 허용. 우선 순위. ● 서버 푸쉬 가능 (이 부분만 웹 앱을 새로 적용 해야) ○ 필요한 이미지나 CSS, JS를 같이 푸쉬시킬 수 있음.
  • 64. OkHTTP ● HTTPUrlConnection과 동일한 인터페이스 ● GZIP 압축 지원. ● 캐쉬 지원. ● SPDY 지원. ● 커넥션 풀링 지원. http://square.github.io/okhttp/ Jesse Wilson (스퀘어, 전직 안드로이드 HTTP 파트 리드)
  • 65. Retrofit HTTP REST 처리 라이브러리. (http://square.github.io/retrofit/) public interface GitHubService { @GET("/users/{user}/repos") List<Repo> listRepos(@Path("user") String user); } GitHubService service = restAdapter.create(GitHubService. class); List<Repo> repos = service.listRepos("octocat");
  • 66. HTTP / 이미지 라이브러리 샘플들 http - OkHTTP 간단한 샘플로 main함수가 있는 코드들이 있습니다. https://github.com/swankjesse/android-http-examples/tree/master/http picasso-app - 스퀘어의 이미지 라이브러리 피카소에 대한 샘플들입니다. https://github.com/swankjesse/android-http-examples/tree/master/picasso-app retrofit-app - 역시 스퀘어가 만든 어노테이션 기반의 HTTP(JSON) 도구 레트로 핏에 대한 샘플들입니다. https://github.com/swankjesse/android-http-examples/tree/master/retrofit-app volley-app - 구글이 만든 발리 라이브러리에 대한 샘플입니다. https://github.com/swankjesse/android-http-examples/tree/master/volley-app
  • 67. Android Annotation http://androidannotations.org/ AndroidAnnotations is an Open Source framework that speeds up Android development. It takes care of the plumbing, and lets you concentrate on what's really important. By simplifying your code, it facilitates its maintenance.
  • 69. @EActivity(R.layout.translate) // Sets content view to R.layout.translate public class TranslateActivity extends Activity { @ViewById // Injects R.id.textInput EditText textInput; @ViewById(R.id.myTextView) // Injects R.id.myTextView TextView result; @AnimationRes // Injects android.R.anim.fade_in Animation fadeIn; @Click // When R.id.doTranslate button is clicked void doTranslate() { translateInBackground(textInput.getText().toString()); } @Background // Executed in a background thread void translateInBackground(String textToTranslate) { String translatedText = callGoogleTranslate(textToTranslate); showResult(translatedText); } @UiThread // Executed in the ui thread void showResult(String translatedText) { result.setText(translatedText); result.startAnimation(fadeIn); } // [...] }
  • 70. Otto http://square.github.com/otto/ Otto is an event bus designed to decouple different parts of your application while still allowing them to communicate efficiently. Forked from Guava, Otto adds unique functionality to an already refined event bus as well as specializing it to the Android platform. Guava The Guava project contains several of Google's core libraries that we rely on in our Java-based projects: collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, and so forth.
  • 72. Event Bus = transfer 'Event' between components = listeners? http://en.wikipedia.org/wiki/Bus_(computing)
  • 74. 여러 프래그먼트를 사용하는 앱 A B C 1. 인터페이스를 만듭니다. 2. 인터페이스를 구현합니다. 3. 프래그먼트로 메시지를 전달합니다. 다른 프래그먼트와 소통하기 http://developer.android.com/training/basics/fragments/communicating.html
  • 75. public static class MainActivity extends Activity implements FragmentA .OnFragmentListener, FragmentB.OnFragmentListener, FragmentC.OnFragmentListener { .... @Override public void onFragmentA () { } public void onFragmentB() { } } public class FragmentA extends Fragment { OnFragmentListener mCallback ; // Container Activity must implement this interface public interface OnFragmentListener { public void onArticleSelected (int position ); } @Override public void onAttach (Activity activity ) { super.onAttach (activity ); try { mCallback = (OnFragmentListener ) activity ; } catch (ClassCastException e) { throw new ClassCastException (activity .toString () + " must implement OnFragmentListener" ); } } ... } 1. 인터페이스 정의하기 2. 인터페이스 구현하기
  • 76. public static class MainActivity extends Activity implements FragmentA .OnFragmentListener, FragmentB.OnFragmentListener, FragmentC.OnFragmentListener { ... public void onArticleSelected (int position ) { // The user selected the headline of an article from the FragmentA // Do something here to display that article FragmentA articleFrag = (FragmentA ) getSupportFragmentManager ().findFragmentById (R.id.article_fragment ); if (articleFrag != null) { // If article frag is available, we're in two-pane layout... // Call a method in the ArticleFragment to update its content articleFrag .updateArticleView (position ); } else { // Otherwise, we're in the one-pane layout and must swap frags... // Create fragment and give it an argument for the selected article FragmentA newFragment = new FragmentA (); Bundle args = new Bundle(); args .putInt(FragmentA .ARG_POSITION , position ); newFragment .setArguments (args); FragmentTransaction transaction = getSupportFragmentManager ().beginTransaction (); // Replace whatever is in the fragment_container view with this fragment, // and add the transaction to the back stack so the user can navigate back transaction .replace(R.id.fragment_container , newFragment ); transaction .addToBackStack (null); // Commit the transaction transaction .commit(); } } } 3. 프래그먼트로 메시지 전달하기
  • 77. 3단계 Otto 1. 이벤트 버스를 만듭니다. 2. 이벤트를 발행합니다. 3. 이벤트를 구독합니다. @Subscribe public void answerAvailable (AnswerAvailableEvent event) { // TODO: React to the event somehow! } bus.register(this); bus.post(new AnswerAvailableEvent (42)); Bus bus1 = new Bus(); Bus bus2 = new Bus(ThreadEnforcer .MAIN);
  • 81. HttpResponseCache Http응답을 캐싱해주는 라이브러리 Android 4.0 이상의 android.net.http. HttpResponseCache 의 Backport https://github.com/candrews/HttpResponseCache
  • 82. google-gson json을 Java Object로 변환해주는 라이브러리 https://code.google.com/p/google-gson/ String json = "{1, 2, 3, 4, 5}"; int[] array = gson.fromJson("[1,2,3,4,5]", int[].class)
  • 83. jsoup Beautiful Soup (Python Html 파싱 라이브러리)의 자바 버전 http://jsoup.org/
  • 84. acra(Application Crash Report for Android) 앱 크래시 정보를 특정서버로(Google Doc, 자체서버 등)으로 전송해주는 라이브러리 http://acra.ch/
  • 85. 기타 참고 ● Fragment 시작하기 - http://goo.gl/6k5Jj ● TextureView Demo - http://goo.gl/5NyI2 ● 배터리를 절약하는 네트워크 어플리케이션의 구현 http://huewu.blog.me/110150046116 ● 비동기를 위한 Loader - http://goo.gl/lU0qk ● SPDY는 무엇인가? - http://goo.gl/57MK2 ●