이번시간에는 애플리케이션의 구성요소인 서비스와 브로드케스트리시버를 공부했어요. 하지만 서비스는 이미지를 남길수가 없었죠. 그래도 필기해놓은게 있으니 곧 설명을 남길께요.

서비스라는 애는 UI가 없이 뭔가 background에서 조용히 일처리를 하고 사라져요. 이런 서비스를 통해서 IPC를 구현할 수도
있는데요 서로다른 Process 사이를 연동시키는 거죠. binder라는 서비스가 이런걸 해 줘요.
 그냥 startService() 만 하면요 별도의 쓰레드는 만들지 않아요. 하지만 CPU를 많이 쓰거나 대기 상태를 요구하는 서비스는
별도의 쓰레드를 만들 필요가 있죠. 그럴때는 bindService() 를 호출해요. IPC를 담당하는 서비스는 보통 이렇게 하죠. 이 쓰레드
를 잘 사용해야 사용자들이 체감속도를 좋게 느낄 수 있어요.
 Service도 LifeCycle 이 있어요. 하지만 Activity와는 좀 틀리죠. 화면에 보이는게 없으니깐 당연히 그렇겠죠. 그래서 resume,
pause, start, stop 이 필요없어요. 그리고 startService는 여러번 호출해도 서비스는 하나만 생겨요. 서비스는 Activity같이 
stack에 쌓이고 이런게 아니라 백그라운드에 하나만 생기는 거기 때문에 그렇죠. 서비스는 stopself()를 통해 Destroy 시킬 수 
있어요.

 나중에 보게 되겠지만 content provider가 있는데요, 얘는 내부적으로 갖고있는 데이터를 다뤄요. A가 만든 데이터를 B가 접근
하는 건 불가능 한데요 그래도 공유하고 싶을 때가 있죠. 전화번호부나 사진 같은거요. 이 때 content provider를 사용해서 SQLite
를 이용해요. 이런걸 SendBox Model 이라고도 하죠.

그럼 브로드케스트리시버부터 볼께요. 얘를 통해서 메일도착, 날짜, 위치이동 등의 정보를 App에게 알려줄 수 있어요.
브로드캐스트리시버는 다른 App도 관심이 있을 만한 이벤트를 뿌려주죠. 그리고 registerReceiver메소드를 이용하면
런타임시 실행코드 상에서 관심이 있다고 등록할 수 있어요.
 브로드캐스트리시버는 onReceive() 콜백 함수만 구현하면 되는데요 받았다는 것만 표시하고 바로 내려가는 간단한 작업을
하게 되죠. 그래서 오래걸리는 작업이라면 Service에게 맡기는게 좋아요.
 지금 메모리에 떠있는 App에게만 주는 이벤트도 있는데요 예를 들어 1분마다 바뀐 시간을 알려주는 이벤트에요.
모든 App에게 1분마다 이벤트를 보내주면 시스템에 엄청 과부하가 걸리겠죠. 그런 애들을 꼭 registerReceiver를 이용해서
메모리에 떠있는 애만 받도록 등록해야 해요.
 App는 어떤 브로드캐스트에 관심이 있다고 intent-filter에 등록을 해야하죠. 그래서 만약 SMS가 왔을 때 알려줄 수 있는
App가 올라와있지 않다면 시스템이 알아서 App올려주고 브로드캐스트를 부르게 되죠. 

 여러 브로드캐스트가 왔을 때 순차적으로 실행하도록 할 수도 있어요. sendOrderedBroadcase()메소드를 이용하면 가능하죠.
 이런게 왜 필요하냐면요 스팸차단을 하고싶다고 해보죠. 근데 스팸차단은 sms 브로드캐스트와 전화가 오는 브로드캐스트 등을
보고 스팸차단을 해서 그런 브로드캐스트를 막아야겠죠? 이런 경우에 순차 브로드캐스트가 필요하죠. 그리고 어떤 패키지가 추가가 
되었는데 위험하다 등등을 알려주는 브로드캐스트 같은 경우도 우선순위가 높아야 겠죠?
 부팅이 되자마자 실행해야 할 브로드캐스트가 있을수도 있는데요 이럴때는 manifest 파일에 사용자의 permission 주는게 필요해요.
BOOT_COMPLETED라는 permission이 필요하죠.
 
 여기서 실수하기 쉬운게 있는데요 UI가 없는 Service나 broadcast는 Run Configuration에서 설정할 수 없죠.

여러 브로드케스트 예제를 쭈욱 보겠습니다.











content provider라는 애는 다른 App나 컴포넌트들이 데이터를 쉽게 공유할 수 있도록 해 주죠. 
Application이 직접 원격 저장소에 접근할 수 없기 때문에 content provider를 이용해서 간접적으로 접근하게 되죠.
접근할 데이터 셋을 지정할 때는 URI를 사용하는데요 "content://" 이렇게 시작하는 거죠. 어떤 컴포넌트던지 자신만의 URI
가 정해져 있어요. 이 URI를 이용해서 다양한 Activity를 띄우는게 가능하죠.  
SQLite 데이터베이스가 많이 쓰여요.


이제 ListView에 대해 알아보겠어요
 ListView는 고급 View중에서 가장 많이 사용되는 view에요. ListView에 대해서 알아보기 앞서
 고급 위젯에서 두루두루 쓰이는 구조가 바로 ListView, Adapter, Data인건 기억해야 해요.
 ListView는 똑같은 모양의 item들이 여러개 반복될 때 사용되요. 구지 Linear Layout을 써도 되는데 이걸 왜 쓰냐면요
Linear layout을 쓰면 메모리를 많이 쓰게 되거든요. 아이템이 몇만개가 있다고 생각해 보세요.
하지만 ListView는 몇 만개 까지도 처리할 수 있어요. 메모리가 재활용 되기 때문이죠. 맨위의 TextView가 없어지면
밑에 올라오는 TextView를 재활용해서 보여주죠. 어뎁터가 ListView와 backend를 연결해 줘요.
 ListView는 하나이고 각각의 TextView (itemView)는 여러개 인데요 이 아이템들을 재활용해서 보여주는 거에요.




시스템폰트들이 있는 곳입니다.



리스트와 item을 연결해주는 Adapter를 직접만들수도 있어요
근데 왜 v.findViewById()를 할까요? 그건 리스트 안에선 아이디가 동일하지만 아이템 안에선 아이디가 유일하기 때문이에요.
그래서 아이템에 대한걸 결정해 줄때는 매번 아이템의 View v 를 이용해야 하죠.
 adapter에는 CursorAdapter라는 애도 있는데요 얘는 content provider에서 받을 수 있는 데이터를 선택가능한 뷰에 보여주기 위해서
쓰여요. 
 Adapter가 왜 필요하냐면요
 ListVeiw가 특정한 모양을 갖고 있는건 아니에요. 물론 Layout보다 훨씬 복잡한 일을 하긴 하지만 일단은 item을 배치시켜주는 역할
만 하죠. 바로 Adapter가 item을 만들어서 ListView에 공급을 해줘요. 화면에 표시될 수 있도록 Adapter가 바꿔서 전달을 하죠.
 그래서 Adapter의 Layout은 하나하나의 item에 들어가는 레이아웃이라고 볼 수 있어요.
 복잡한 형태의 List를 만들때는 ArrayAdapter를 상속받아서 필요한 부분만 구현하면 되죠.
 Adapter에서 제일 중요한 함수는 getView인데요 ListView가 하나하나의 아이템을 그릴 때마다 Adapter에게 어떻게 그리는지 
물어보는데 Adapter는 이 함수를 통해서 대답을 한다고 보면 되죠. 이 함수의 파라미터 안엔 포지션도 있기 때문에 어느 위치의
아이템을 그리는 지도 볼수 있어요.파라미터 중 convertView도 있는데 이건 재활용할수 있는 View를 나타내죠.
 ListView에 있는걸 선택하고 고르는 View 역시 Adapter를 통해서 연동이 되는데요 방대한 데이터로 하기에는 좀 무리가 있죠.
 Adapter의 item으로 들어가는 속성중에서 minHeight라는 게 있는데요 이건 item의 최소높이가 아무리 작아도 이정도는 되게 하라는
거에요.



 시스템과 App간에 약속된 id값도 있는데요 이렇게 미리 정의된 id를 사용해야 할 경우에는 @android:id 를 사용하면 되요.
 



포지션을 호출해 여러가지 응용을 할 수 있어요





신고

'T아카데미' 카테고리의 다른 글

메뉴  (0) 2010.07.03
사용자인터페이스_02  (0) 2010.07.02
사용자인터페이스_02  (0) 2010.07.01
어플리케이션 구조  (0) 2010.07.01
사용자인터페이스_01  (0) 2010.07.01
안드로이드 개발환경  (0) 2010.06.27
Posted by 응큼미소


티스토리 툴바