AppWidget
- 다른 앱의 일부 영역만을 차지한 채 주기적으로 갱신되는 조그만 앱
- Home Screen에 떠 있는 어플리케이션의 미니어쳐
- AppWidget Host의 일부 영역을 독점적으로 차지하며 자신의 고유한 기능을 수행
- 요약적인 정보를 표시하는 것이 주된 기능
- 간단한 명령 가능
- 복수 개의 인스턴스 설치 가능


AppWidget Host
- Home Screen이 대표적
- 일부런쳐 프로그램도 App Widget Host 기능 수행 가능

AppWidget Manager
- AppWidget을 관리하는 관리자
- 설치된 AppWidget의 목록을 가지며 미리 지정한 시간이 될 때마다 AppWidget에게 신호를 보내 상태를 갱신
- 객체 구현
   + static AppWidgetManager getInstance(Context context)
- App Widget 관련 정보 조사하는 method
   + List<AppWidgetProviderInfo> getInstalledProviders()
   + AppWidgetProviderInfo getAppWidgetInfo(int appWidgetId)
   + int[] getAppWidgetIds (ComponentName provider)
- AppWidgetProviderInfo class
   + AppWidget의 여러가지 속성을 정의
   + 크기, 갱신 주기, 설정 Activity에 대한 정보를 갖음

AppWidget 속성
- AppWidgetProviderInfo class로 기술
   xml 문서로 작성하여 manifest에 meta-data로 포함 (경로 /res/xml/)
- minWidth. minHeight
   AppWidget이 차지할 화면상의 크기 지정
   장치 독립성 확보를 위해 dip 단위를 사용하는 것을 권장
   Home Screen은 4X4 크기의 셀로 구성
   각 셀의 크기는 72dip x 72dip
- updatePeriodMillis
   갱신 신호를 보낼 주기를 지정
   갱신 주기는 1/1000초 단위로 지정할 수 있지만 너무 자주 갱신할 필요는 없음
   갱신 주기는 배터리 성능에 직접적인 영향을 미치므로 가급적 길게 설정할 것을 권장
   1시간 미만의 주기는 권장되지 않음 ( 최소 갱신 주기가 30분으로 정해져있음. - 갱신주기를 짧게 줘도 30분에 한번만 갱신 )
   자주 갱신해야 하는 정보일 경우 (슬라이드 쇼, 주식 시황)는 타이머나 알람을 사용
   알람은 주기를 자유롭게 선택 가능하며 장비가 슬립모드일 때는 동작하지 않음
- initialLayout
   AppWidget의 Layout 기술
   RemoteViews class로만 layout의 정보만 전달하는데 이 클래는 모든 widget만 지원하지 않음
   => layout : LinearLayout, RelativeLayout, FrameLayout
   => View : Button, TextView, ImageView, Progress Bar
   => 기타 : ImageButton, AnalogClock, Chronometer
-configure
  옵션 사항을 편집할 설정 Activity 지정
   Activity class를 밝혀 놓으면 AppWidget이 최초 설치 될 때 호스트에 의해 설정 Activity가 자동으로 호출
   별다른 설정 사항이 없을 경우 이 속성을 생략해도 무방

AppWidget Life Cycle
- AppWidget은 간단한 출력도 Host에게부탁
- 이 통신 사이에서 사용되는 중간 매개체가 RemoteViews
- Android에서 프로세스끼리 통신하는 공식적인 방법은 BroadcastReceiver
- Appwidget은 Host가 보내주는 신호를 받아야 하므로 기본적으로 BR를 구현
- Host와 AppWidget이 주고받는 방송은 AppWidgetManager class에 정의돼 있다.
  = ACITON_APPWIDGET_ENABLED
    첫 번재 인스턴스가 설치될 때 전달
    이제부터 동작을 시작하니 준비하라는 신호.
    예 : 정보 저장을 위한 DB를 생성하거나 파일 목록을 미리 조사해 놓는 것
    AppWidget이 이미 설치 돼 있는 상태에도 부팅 될 때도 전달
  = ACTION_APPWIDGET_DELETED
    AppWidget 인스턴스 중 일부가 삭제 될 때 전달.
  = ACTION_APPWIDGET_DISABLED
     마지막 인스턴스가 제거 될 때 전달
     사용하던 데이터베이스나 임시 파일을 삭제
     ENABLED에서 별도의 초기화를 하지 않아 정리할 것이 없다면 이 방송은 무시해도 됨
     모든 인스턴스가 제거 될 때 AppWidget BR자체가 불증화 되어 더 이상 방송을 수신할 수 없는 상태가 되기 때문에 DISABLED
  = ACTION_APPWIDGET_UPDATE
    개별 AppWidget을 갱신할 때마다 전달
    인스턴스가 새로 설치될 때가 대표적
    갱신 주기가 됐을 때나 장비구 부팅될 때도 다시 그려야 하므로 이 방송이 전달
    AppWidget은 이 방송을 받았을 때 출력할 정보를 재 조사하고 자신을 다시 그린다.
    이 방송을 처리함으로써 위젯의 정보가 사용자에게 출력
    인텐트로는 갱신이 필요한 모든 인스턴스 ID배열이  전달

네 개의 방송 중 AppWidget이 반드시 처리해야 하는 것은 UPDATE뿐

AppWidgetProvider class (AppWidget 제공자)
- BroadcastReceiver의 서브 클래스
onReceive를 재정의 하여 각 액션에 다음 메서드 호출
- void onEnabled(Context context)
- void onDeleted(Context context, int[] appWidgetIds)
- void onDisabled(context context)
- void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
AppwidgetProvider는 위젯을 위한 방송을 받아 각 메소드로 분배하는 단순한 역할을 하는 도우미 클래스일 뿐, 이 클래스를 상속받고 필요한 메서드를 재정의하여 AppWidget 제작
BroadcasReceiver의 서브 클래스 이므로 onReceive 메서드도 당연히 존재하나 AppWidgetprovider가 방송분배를 위해 재정의 하고 잇으므로 서브클래스는 가급적이면 재정의하지 않는 것이 좋다.


레이아웃 내부 위젯 속성 지정
void setimageViewResource(int viewId, int srcId)
void setProgressBar(int viewId, int max, int progress, boolean indeterminate)
void setTextColor(int viewid, int color)
void setTextViewText(int viewId, CharSequence text)

갱신
void updateAppWidget(int appWidgetid, RemoteViews views)
void updateAppWidget(int[] appWidgetIds, RemoteViews views)
void updateAppWidget(Component provider, RemoteViews views)

'안드로이드' 카테고리의 다른 글

안드로이드 앱의 cpu 사용량 구하기  (0) 2017.03.06
AsyncTask  (0) 2011.09.06
Broadcast Receiver  (0) 2011.07.26
나인패치  (0) 2011.07.26
Data Base  (0) 2011.07.25

+ Recent posts