본문 바로가기

Development/Android

Widget Life Cycle.

안드로이드 액티비티 라이프사이클 만큼 중요한 위젯 라이프사이클이다.

일반 액티비티와 위젯의 라이프사이클은 개념이 좀 틀리다. 일반 액티비티를 사용하는 어플과 위젯 어플은 완전히 다른 방법으로 만들어진다.

먼저 라이프사이클의 순서를 보면,

widget 정의 -> widget instance 생성 -> onUpdate -> 바탕화면의 widget view 상에서의 사용자의 터치에 반응 -> 바탕화면에서 widget instance 제거 -> widget package 제거


1. widget 정의.
- AppWidgetProvider 를 상속 구현하는 java class 와 widget 의 layout view 가 필요하다.
- manifest 에 정의하고 /res/xml 디렉토리 밑에 provider.xml 파일을 정의한다.


2. widget instance 생성.
  1). config class 를 시작한 호출 intent(widget provider) 로부터 widget instance id 를 전달 받는다.
  2). 사용자 입력등의 widget instance 별 정보를 수집한다.
  3). 이후 사용을 위해서 widget instance 정보를 저장한다.
  4). widget view layout 을 가져오고 거기에 RemoteView 를 생성하고 화면 출력준비를 한다.
  5). onClick 이벤트를 등록한다.
  6). instance id 를 사용해서 RemoteView 를 그리도록 AppWidgetManager 에게 명령한다.
  7). widget id 를 반환하고 종료한다.
    -> 반환할때 widget view 를 그린다.

- 이 과정을 사용자가 생성한 각 widget instance 마다 반복한다.
  -> 스펙상 widget instance 를 하나만 생성하도록 제한되어 있지는 않다.
  -> 다수 개의 widget instance 에 대한 처리기능을 구현 해야 한다는 의미이다.
  -> 각 widget instance 의 status 도 어딘가에 저장해야 한다는 의미이다.
- 안드로이드는 AppWidgetProvider 의 onEnable 콜백도 호출한다.


3. onUpdate().
- 안드로이드는 타이머에 대한 응답으로 onUpdate 를 호출한다.
- AppWidgetManager 를 호출해서 가지고 있는 데이터로 업데이트 되어야 할 RemoteView 를 그릴 수 있다.
  -> 서비스를 시작하는 intent 에 extra data 로 widget id 를 전달해야 한다.
- AppWidgetProvider class 는 stateless 하다.
  -> 서로 다른 thread 에 의해서 변수 초기화 할 가능성이 있다.
  -> 각 widget instance 별로 정보를 저장할 방법이 있어야 한다.

  1). cnofig class 가 반환뿐만 아니라 작업을 완료했는지 확인한다.
  2). 해당 widget instance 에 사용될 저장 데이터를 가져 온다.
  3). widget view layout 을 가져와서 그 안에 RemoteView 를 생성한다.
  4). view 객체들을 생성한다.(텍스트박스, 버튼 등등)
  5). PendingIntent 를 사용해서 모든 view 에 onClick 이벤트를 등록한다.
  6). instance id 를 사용해서 RemoteView 를 그리도록 AddWidgetManager 에 명령한다.


4. 바탕화면의 widget view 상에서 터치에 반응.
- 터치 액션으로 서비스를 시작하거나 브라우저를 띄우는 등의 activity 를 시작한다.
- 서비스나 activity 는 widget instance id 와 AppWidgetManager 를 사용해서 view 와 통신할 수 있다.
  -> PendingIntent 에는 항상 widget instance id 가 들어 있어야 하는 이유.


5. 바탕화면에서 widget instance 제거.
- widget provider 의 onDelete 메소드를 호출한다.
- 외부 저장 데이터가 있다면 onDelete 메서드안에 그 데이터를 저장하는 로직을 넣어야 한다.
- 방금 삭제된 widget instance 가 같은 종류의 최종 instance 일 경우 onDisable 메서드를 호출하낟.
  -> 모든 widget instance 에 대해 저장되어 있는 저장 데이터들을 제거한다.
  -> 해당 widget 의 onUpdate broadcast 에 대해 callback 들을 등록해제한다.


6. widget package 설치 제거.
- 이클립스 ADT 를 이용해서 개발하는 경우 기존의 widget instance 를 모두 제거하고 프로그램을 삭제한다.





* PendingIntent 란?

PendingIntent 는 특정 component(Activity, Service 등) 가 Intent 를 생성한 후 해당 Intent 를 바로 사용하는 대신에 나 대신 다른 Component 가 해당 Intent 를 사용 할 수 있도록 할때 사용하는 class 이다.
PendingIntent 를 실행해주는 다른 Component 가 그 Intent 를 실행할 때는 최초에 그 PendingIntent 를 만든 Component 가 갖고 있는 권한(각종 Permission 등등)으로 실행된다.




'Development > Android' 카테고리의 다른 글

파티톡 1.0.1 업그레이드.  (0) 2011.02.17
목록에서 링크걸기.  (0) 2011.02.09
특별한 갤럭시S.  (0) 2010.08.05
Android Life Cycle 다른 그림.  (0) 2010.08.03
Widget 에서 onReceive 과 onUpdate 메소드의 차이.  (0) 2010.07.30