안드로이드에서 서버와 통신하기 위한 방법으로는 HTTP통신과 Socket통신 방법이 있다. 우리는 주로 DB에 저장되어 있는 데이터를 이용하기 위해 서버통신을 한다. 하지만 안드로이드 특성상 외부DB에 직접적으로 접할 수 없기 때문에 중간 매체인 WEB을 이용한다.

[안드로이드와 WEB, DB 연결방식] - 출처 : http://mailmail.tistory.com/13



안드로이드에서 네트워크 처리

안드로이드에서는 UI에 관련된 모든 작업은 메인스레드(UI스레드)에서 처리된다. 특별한 스레드처리를 하지않는 액티비티에서 발생하는 모든 작업은 메인스레드에서 담당하게 된다는 것이다. onCreate()에서 다운로드와 같은 오랜시간이 걸리는 작업을 하게되면 작업을 완료하기 전까지 UI스레드가 묶여있기 때문에 다운로드동안 UI가 먹통이 되어버린다. 이러한 문제를 해결하기 위해 비동기처리를 해야하며 AsyncTask를 이용한다.



'웹 개발 > 안드로이드' 카테고리의 다른 글

안드로이드 타이틀바 없애기  (0) 2017.05.11
RecyclerView란?  (0) 2017.05.10
가변 비트레이트 스트리밍(Adaptive Bitrate Streaming)  (0) 2017.04.11
GCM( Google Cloud Messaging ) 이란?  (0) 2017.04.10
Parcelable  (0) 2017.04.08

기본적으로 프로젝트를 생성하고 실행시키면 아래와 같은 모습으로 실행된다. 



 TrohPlayer라고 적혀있는 영역이 타이틀바이며, 그 위의 시간 배터리 등등 표시되는 곳이 상태바이다. 이번 포스팅에서는 타이틀바의 제거와 , 풀스크린 즉 앱이 전체화면을 차지하도록 하는 방법에 대해 알아보려고 한다.


타이틀바 없애기

안드로이드 프로젝트의 Manifest.xml 파일을 열어보면 아래와 같은 코드가 보일 것인데, 이중에 theme부분을 보면 "@style/AppTheme " 이라는 부분에 주목해야 한다.



Ctrl키를 누른상태로 AppTheme부분을 클릭해보면 아래와 같이 되어 있을 것인데, 여기에 타이틀바에 대한 설정을 추가해줘야 한다. 아래와 같이 타이틀바와 풀스크린에 대한 정보를 추가해주면 설정이 완료된다.



<타이틀바 제거만 추가한 경우>


<풀스크린으로 실행한 경우>






'웹 개발 > 안드로이드' 카테고리의 다른 글

Android Clinet와 Web통신(작성중)  (0) 2017.06.18
RecyclerView란?  (0) 2017.05.10
가변 비트레이트 스트리밍(Adaptive Bitrate Streaming)  (0) 2017.04.11
GCM( Google Cloud Messaging ) 이란?  (0) 2017.04.10
Parcelable  (0) 2017.04.08

5.0(롤리팝) 버전이 ListView 보다 유연하고 성능이 향상된 RecyclerView와 함께 발표되었다. 기존의 ListView는 커스터마이징 하기에 힘들었고, 구조적인 문제로 성능상의 문제도 있었다. RecylerView는 ListView의 문제를 해결하기 위해 개발자에게 더 다양한 형태로 커스터마이징 할 수 있도록 제공되었다. RecyclerView와 ListView의 가장 큰 차이점은 Layout Manager와, View Holder 패턴의 의무사용, Item에 대한 뷰의 변형이나 애니메이션할 수 있는 개념이 추가 되었다. 리스트 뷰의 성능 상의 이슈도 해결해주면서, 많은 타입의 뷰들을 가독성 있게 보여줄 수 있는 뷰가 리사이클뷰이다. 


주요 클래스

  • Adapter - 기존의 ListView에서 사용하는 Adapter와 같은 개념으로 데이터와 아이템에 대한 View생성.
  • ViewHolder - 재활용 View에 대한 모든 서브 뷰를 보유. 
  • LayoutManager - 아이템의 항목을 배치
  • ItemDecoration - 아이템 항목에서 서브뷰에 대한 처리
  • ItemAnimation - 아이템 항목이 추가, 제거되거나 정렬될 때 애니메이션 처리

Adapter

리스트 뷰는 데이터가 어디서 왔냐에 따라 BaseAdapter를 상속한 ArrayAdapter(배열로부터 데이터를 가져올 경우), CursorAdapter(DB로 부터 가져올 경우), sIMPLEaDAPTER(xml 등으로 부터 가져올 때)를 구분하여 사용합니다. 하지만 리사이클러 뷰는 Universal한 Adapter를 사용하여 데이터 소스를 처리합니다. 이것은 리사이클러 뷰의 유연성을 보여줍니다. 다음의 3가지 인터페이스를 구현해야 합니다. 

  • onCreateViewHolder(ViewGroup parent,int viewType) : 뷰 홀더를 생성하고 뷰를 붙여주는 부분
  • onBindViewHolder(ListItemViewHolder holder,int position) : 재활용 되는 뷰가 호출하여 실행되는 메소드, 뷰 홀더를 전달하고 어댑터는 position의 데이터를 결합시킵니다. 
  • getItemCount() : 데이터의 개수를 반환


리스트 뷰가 사용했던 getView() 메소드는 매번 호출되면서 null 처리를 해줘야했다면, onCreateViewHolder는 새롭게 생성될 때만 호출된다.



 리스트뷰에서는 뷰홀더 패턴을 권장했었는데, UI를 수정할 때 마다 부르는 findViewById() 를 뷰홀더 패턴을 이용해 한번만 함으로서 리스트 뷰의 지연을 초래하는 무거운 연산을 줄여주었다. 이 문제를 리사이클러 뷰에서는 뷰 홀더 패턴을 꼭 사용하도록 함으로써 해결했다.

 뷰홀더 패턴은 오래된 기기일수록 효과가 좋지만, 최신기기같은 경우 사용 유무에 대한 성능차이는 미미하다. 뷰홀더 패턴을 사용한 리스트뷰와 리사이클러뷰의 성능은 같다. 단지 차이점은 리사이클링뷰는 뷰홀더 패턴이 강제된다는 차이점이 있다. 


LayoutManager

 리스트뷰는 수직 스크롤만 가능하다. 리스트뷰를 수평으로 사용할 수 없었는데, 리사이클러뷰에서는 수평 스크롤을 지원해줍니다. 뿐만 아니라 더 다양한 타입의 리스트들을 지원하고, 커스텀할 수 있도록 해준다. 리사이클러뷰는 아래와 같은 3가지의 미리 정의된 Layout Managers를 제공한다.
  • LinearLayoutManager : 리사이클러 뷰에서 가장 많이 쓰이는 레이아웃으로 수평,수직 스크롤을 제공하는 리스트를 만들 수 있다.
  • StaggeredGridLayoutManager : 뷰마다 크기가 다른 레이아웃을 만들 수 있다.
  • GridLayoutManager : 사진첩 같은 격자형 리스트를 만들 수 있다


ItemDecoration

리사이클러뷰에서는 RecyclerView.ItemDecoration 클래스를 통해 divider를 원하는 아이템에 추가해줄 수 있다. 조금 복잡해졌지만 동적인 데코레이팅이 가능해졌다


Item Animator

리사이클러 뷰에서는 RecyclerView.ItemAnimator 클래스를 통해 애니메이션을 핸들링 할 수 있게 되었다. 이 클래스를 통해서 아이템 삽입,삭제,이동에 대한 커스터마이징이 가능하고, 또한 DefaultItemAnimator가 제공되므로 커스터마이즈가 필요 없이 사용할 수도 있다. notifyItemChanged(int position), notifyItemInserted(int position), notifyItemRemoved(int position)을 ItemAnimator을 통해 특정 아이템에 대한 애니메이션을 발생시킬 수 있다. 


가변 비트레이트 스트리밍

가변 비트레이트 스트리밍은 네트워크의 상태 혹은 전송속도 등을 기반으로 대역폭이 소화할 수 있는 정도의 고화질(즉 높은 비트스트레이트를 가진 소스를 이용)의 부분 컨텐츠를 전송하는 방식을 말함. 물론 대역폭이 떨어지거나 네트워크 혼잡도가 높아지면서 전송 효율이 떨어지면 낮은 부분 컨텐츠로 변경하여 전송하도록 함.

어떻게?

가변 전송을 하기 위해서는 가변 전송을 하고자 하는 컨텐트를 다양한 비트레이트로 인코딩하는 과정이 선행되어야 한다. 고화질의 원본 소스파일은 서비스 하고자 하는 비트레이트의 종류만큼 복수개의 파일로 인코딩 되어야 하고 가변 스트리밍을 위하여 전체 길이의 파일을 2~10초 단위의 부분 동영상으로 나누어 저장하게 된다. 예를들어 1분짜리 동영상을 3개의 비트레이트로 가변 비트레이트 스트리밍을 한다고 하면,  10초 단위로 부분 동영상을 만든다고 할 때 30개의 파일(각 비트레이트 별로 10개씩)로 나누어져야 하는 것이다.



그렇다면 사용자는 파일이 이렇게 쪼개져 있다는 것을 어떻게 알 수 있을까? 가변 비트레이트 스트리밍이 시작되는 시점에 사용자의 플레이어는 인코딩된 파일들의 조각 정보가 담겨 있는 메니페스트파일을 받게 되고 이 파일을 담고 있는 비트레이트의 종류, 부분 파일의 식별 방법에 따라 적절한 파일을 HTTP로 요청하여 받게 된다.


[가변 비트레이트 전송 프로토콜의 종류]

-MPEG_DASH(Dynamic Adaptive Streaming over HTTP)

-Adobe Dynamic Streaming for Flash(HDS)

-Apple Http Adaptive Streaming for iPhone/iPad/STB (HLS)

-Microsoft Smooth Streaming



출처 : https://ondemand.tistory.com/177

'웹 개발 > 안드로이드' 카테고리의 다른 글

안드로이드 타이틀바 없애기  (0) 2017.05.11
RecyclerView란?  (0) 2017.05.10
GCM( Google Cloud Messaging ) 이란?  (0) 2017.04.10
Parcelable  (0) 2017.04.08
Intent  (0) 2017.03.18

FCM으로 업데이트되었다고함..FCM은 추후에 다시 정리하도록 하겠습니다~


Google Cloud Messaging

  • 개발자에게 서버에서 안드로이드 디바스의 어플리케이션으로 데이터를 전송하는 것을 도와주는 무료 서비스.

  • 3rd-party에서 새로운 데이터가 있을 경우 gcm 서비스를 통하여 message를 특정 device의 특정application으로 전송 해준다. message는 최대 4kb

  • GCM 서비스는 message를 큐잉하며 이를 단말에 전달해주는 처리를 담당함.

  • GCM Conntection Server는 http / xmpp 지원함



Flow

  • GCM Server는 3rd-party server로부터 message를 받고 이것을 gcm을 사용하는 app 단으로 전송한다.

  • 현재 GCM connection server는 HTTP와 xmpp를 지원한다.

  • XMPP 프로토콜은 단말과 서버간의 tcp 연결을 계속 유지시켜준다.

  • 3rd-party server는 GCM connection server에 message를 보내고, connection server는 queue에 message를 저장하고, device가 online 일 때 device에 message를 보낸다.

  • app은 GCM message를 받기 위해 GCM에 등록해야하며 , REGISTRATION id를 얻어야 한다.

  • 만약 xmpp conntection server를 사용한다면, client app은 upstream message를 connection server에 보낼 수 있다.



GCM 특징

  • 안드로이드 어플리케이션으로 message를 보낼 수 있는 3rd party server를 허용.

  • GCM은 MESSAGE 전달과 순서를 보장하지 않음.

  • Android Application은 message를 받기 위해 실행되고 있을 필요 없음.

  • GCM은 단순히 원시 DATA를 ANDROID 단말로 보내며, 이 DATA를 통해  application에서 제어함.

  • android 2.2 이상 지원 , Google Play Stote App이 설치되어있어야함.

  • 구글계정 필요, android 4.0.4이상에서는 필요없음.


 

GCM 

서버인증 

 Google Api Console을 통해 발급받은 simple api key를 사용

Sender Id

 Google Api Console을 통해 발급받은 sender ID 사용.

Json Format 

지원 

Multicast message 

동일한 MESSAGE를 여러 단말에 전송할 수 있음.(JSON형태로) 

Multiple Senders 

다양한 3rd party server로부터 같은 app에 message전송.(하나의 통일 restration id사용) 

Time to Live 

0~4주 사이를 expire로 지정가능. 만료일이 지나면 message저장  

battery 

배터리에 좀 더 효율적

quotas 

제한 없음. 



GCM 아키텍처

  • app은 message를 받기위해 GCM으로부터 device를 register함. 이 register를 3rd-party에 등록.

  • 3rd party server는 app에 message를 보내기 위해 등록된 register와 함께 GCM으로 message전송.

  • GCM Connection Server는 register로 확인된 단말에 해당 message를 전송

  1. 단말에서 GCM으로 REGISTER요청
  2. GCM에서 REGISTER 성공 후 resistration id 전송
  3. 3th party server로 registration id 전송
  4. resistration id값과 message를 gcm으로 전송.
  5. 해당 registration에 맞는 단말에 message전송.


GCM 시퀀스



GCM 용어정리

Sender ID

Google API Console로부터 획득한 project number값
Sender ID 값은 GCM에 해당 단말을 register 할 때 사용됨. 이는 GCM으로부터 허가되는 애플리케이션임을 입증하기 위해 사용.

Application ID

Message수신이 설정되어 있는 안드로이드 애플리케이션에게 GCM 서버에 의해 발급된 ID값.
이 값으로 Android 시스템에서 해당 application으로 message를 전송하도록 함.

Registration ID

Message를 수신하도록 허용된 android application에게 GCM 서버에 의해 발급된 ID값.
이 Registration ID값으로 특정 단말의 특정 application과 연결될 수 있는 식별자.

Google User Account

4.0.4 미만 버전에서 GCM이 정상구동되기 위해서 한개 이상의 Google계정이 해당 단말에 설정 되어있어야함.

Sender Auth Token

Message를 보내는 3rd party server에 GCM에 접근이 허용되도록 주어진 API KEY
이 값은 서버에서 GCM으로 전송시 post 요청의 header에 포함되어 있어야함.













'웹 개발 > 안드로이드' 카테고리의 다른 글

RecyclerView란?  (0) 2017.05.10
가변 비트레이트 스트리밍(Adaptive Bitrate Streaming)  (0) 2017.04.11
Parcelable  (0) 2017.04.08
Intent  (0) 2017.03.18
SurfaceView 와 SurfaceHolder  (0) 2017.03.14

Parcelable

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



위와 같은 Book클래스를 인텐트로 넘겨주려고 하는데, 이대로 사용할 수는 없다.

 오브젝트를 Parcelable 클래스로 만들어주려면 android.os.Parcelable 인터페이스를 구현해야 한다.그러므로 아래와 같이 클래스 정의를 변경한다.



그리고 Parcelable 인터페이스에 있는 2개의 메소드를 오버라이드 해 줘야만 한다.

describeContents() - Parcelable 하려는 오브젝트의 종류를 정의한다.

writeToParcel(Parcel desc,int flags) - 실제 오브젝트 serialization / flattening을 하는 메소드, 오브젝트의 각 멤버변수를 parcel해줘야한다.



다음으로 해야 할 일은 Parcel에서 데이터를 un-marshal / de-serialize하는 단계를 추가해야 한다. 그러기 위해서 Parcelable.Creator 타입의 CREATOR라는 변수를 정의해야 한다. 이 변수를 정의하지 않으면 안드로이드는 다음과 같은 익셉션을 발생한다.

Parcelable protocol requires a Parcelable.Creator object called CREATOR



Book.java 에 모든 parcel된 데이터를 복구하는 생성자를 정의해 줘야만 한다.


주의할 것은 writeToParcel() 메소드에서 기록한 순서와 동일하게 복구해야만 한다.


전체코드는 다음과 같다.


'웹 개발 > 안드로이드' 카테고리의 다른 글

가변 비트레이트 스트리밍(Adaptive Bitrate Streaming)  (0) 2017.04.11
GCM( Google Cloud Messaging ) 이란?  (0) 2017.04.10
Intent  (0) 2017.03.18
SurfaceView 와 SurfaceHolder  (0) 2017.03.14
ANR(Application Not Responding)  (0) 2017.03.14

인텐트란

인텐트란 이러한 어플리케이션 구성요소(컴포넌트)간에 작업 수행을 위한 정보를 전달하는 역할을 한다. 어떠한 컴포넌트를 호출하느냐에 따라 사용되는 대표적인 메소드로는 다음과 같다.

startActivity() - 새로운 액티비티를 화면에 띄울 때

startService() - 서비스와 관련

broadcastIntent() - 브로드캐스팅을 수행할 때

인텐트는 명시적 인텐트(Explicit Intent)와 암시적 인텐트(Implicit Intent)으로 구분할 수 있는데 인텐트에 클래스 객체나 컴포넌트 이름을 지정하여 호출될 대상을 확실히 알 수 있는 경우에는 명시적 인텐트 , 호출될 대상의 속성들을 지정했지만 호출될 대상이 달라질 수 있는 경우에는 암시적 인텐트라고 한다.

명시적 인텐트

Intent inent = new Intent(getApplicationContext() , TestActivity.class);
startActivity(intent) or startActivityForResult();

startActivity는 단순한 화면 전환이 필요할 때 사용하며 , startActivityForResult는 새로 띄운 액티비티로 부터 응답을 처리할 경우에 사용한다.

암시적 인텐트

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.naver.com"));
위와 같이 암시적 인텐트는 보통 액션과 데이터라는 속성으로 굿어되어있다. 이 두가지 속성말고도 Category , Type , Component , Extras라는 속성을 가진다. Component라는 속성을 지정할 경우는 명시적 인텐트이며 , 결국 암시적 인텐트는 Component 속성을 제외한 나머지 속성들로 구성되며 , 이러한 속성들에 부합하는 컴포넌트가 실행된다.

인텐트 필터

안드로이드 매니페스트 파일을 보면 , Intent-Filter라는 것이 있다. 예를 들어 컴포넌트A가 컴포넌트B로 인텐트를 보넀다고 하자. 명시적 인텐트라면 컴포넌트 B는 바로 ㅇ니텐트를 받았겠지만 암시적 인텐트라면 컴포넌트B는 이 인텐트가 자신의 속성과 부합하는지 확인을 해야할 것이다. 이러한 확인작업을 위해 Intent-filter라는 것이 존재한다. 인텐트 필터도 암시적 인텐트의 속성처럼 Action , data , category 필터라는 것을 가지고 있다. 


'웹 개발 > 안드로이드' 카테고리의 다른 글

GCM( Google Cloud Messaging ) 이란?  (0) 2017.04.10
Parcelable  (0) 2017.04.08
SurfaceView 와 SurfaceHolder  (0) 2017.03.14
ANR(Application Not Responding)  (0) 2017.03.14
Inflate  (0) 2017.03.13

SurfaceView와 SurfaceHolder

안드로이드 어플리케이션에서 View는 GDI Thread를 통해 Surface에 그려지게 된다. 만약 View에 동영상 또는 카메라 프리뷰와 같이 그려지는 양이 매우 많거나 빠른 화면전환을 원한다면 SurfaceView를 사용해야 한다. SurfaceView는 GDI Thread를 통해 Surface에 그려지지 않고 다른 Thread를 통해서 그려지기 때문이다. SurfaceView는 아래 그림과 같이 Window의 아래쪽에 위치하며, Windows를 Punched하여 자신이 보여지게 끔 한다. 만약 Window위에 다른 View가 있다면 blended되어진다. 

 

[출처] 청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법  http://sozu.tistory.com/35 

Furface는 하나의 그래픽 버퍼로써 SurfaceView에 실제로 그림을 그리는 등의 작업을 하는 것은 SurfaceHolder라고 하는 콜백함수이다. SurfaceHolder는 개발자가 직접 surface의 사이즈나 형식을 조절할 수 있고, surface의 pixel등 수정을 할 수 있게 해준다. 콜백함수는 정의해두기만 하면 운영체제가 알아서 호출해주는 함수를 의미한다.

 

[출처] 커니의 안드로이드 이야기  http://androidhuman.tistory.com/307 






[출처] http://javaexpert.tistory.com/170 [나는 안드로이드다.]

'웹 개발 > 안드로이드' 카테고리의 다른 글

Parcelable  (0) 2017.04.08
Intent  (0) 2017.03.18
ANR(Application Not Responding)  (0) 2017.03.14
Inflate  (0) 2017.03.13
could not install *smartsocket* listener:cannot bind to ..  (0) 2017.03.09

+ Recent posts