출처 : http://neptjuno.tistory.com/33

public abstract class AsyncTask extends Object

세 가지 generic type(Params, Progress, Result)과 네 가지 step (onPreExecute, doInBackground, onProgressUpdate, onPostExecute)으로 구성

1. generic type
  1) Params : 실행 될 때 task에 전달된 파라미터의 type
  2) Progress : 백스라운드에서 작업하는 동안 발생되는 progress unit의 type
  3) Result : 백그라운드 작업에서 처리된 결과의 type
private class MyTask extends AsyncTask<void, void, void> {...}
private class MyTask extends AsyncTask<URL, Integer, Long>{...}
(필요없는 type에 대해서는 void로 작성)

2. step
  1) onPreExecute()
      - UI thread에서 호출된 즉시 호출되는 메소드
      - task를 setup하는 데 사용

  2) doInBackground(Params .. )
     - onPreExecute()의 수행이 끝난 후 백그라운드로 즉시 호출.
     - 긴 수행 시간을 요하는 작업을 백그라운드로 수행하는 역할
     - asynchronous task의 파라미터는 이 때 전달.
     - 수행 결과는 이 단계에서 반환되어야 하며 마지막 단계로 전달
     - publishProgress(Progress..)를 사용할 수 있으며 이 값들은 onProgressUpdate(Progress..)단계로 인해 UI thread에 불려지게 됨

  3) onPostExecute(Result)
      - 백그라운드 작업이 종료된 후에 UI thread에 호출되는 함수
      - 백그라운드에 계산된 결과가 이 단계의 파라미터로 전달됨

3. Threading rules
    - 이 task instance는 UI thread에서 생성되어져야만 한다.
    - execute(Param..)은 UI thread에서 호출되어져야만 한다.
    - onPreExecute(), onPostExecute(Result), doInBackground(Params..), onProgressUpdate(Progress..)는 수동으로 호출하지 않는다.
    - task는 오직 한번만 수행 될 수 있다.

출처 : http://tigerwoods.tistory.com/28


AsyncTask class
- backgrount 작업을 위한 모든 일(thread 생성, 작업 실행 UI와 통신 등)을 추상화 함으로 각각의 background 작업을 객체 단위로 구현/관리 할 수 있게 하는 것이 목적

type을 정할 필요가 없는 generic이 있다면 void전달

  • protected void onPreExecute():
     Background 작업이 시작되자마자 UI스레드에서 실행될 코드를 구현해야 함. (예. background 작업의 시작을 알리는 text표현, background 작업을 위한 ProgressBar popup등)
  • protected abstract Result doInBackground(Params… params):
    Background에서 수행할 작업을 구현해야 함. execute(…) 메소드에 입력된 인자들을 전달 받음.
  • void onProgressUpdate(Progress... values):
    publishProgress(…) 메소드 호출의 callback으로 UI스레드에서 보여지는 background 작업 진행 상황을 update하도록 구현함. (예. ProgressBar 증가 등)
  • void onPostExecute(Result result):
    doInBackground(…)가 리턴하는 값을 바탕으로 UI스레드에 background 작업 결과를 표현하도록 구현 함. (예. background작업을 계산한 복잡한 산술식에 대한 답을 UI 위젯에 표현함 등)
  • void onCancelled():
    AsyncTask:cancel(Boolean) 메소드를 사용해 AsyncTask인스턴스의 background작업을 정지 또는 실행금지 시켰을 때 실행되는 callback. background작업의 실행정지에 따른 리소스복구/정리 등이 구현될 수 있다.
background 작업의 시작과 background 작업 중 진행정보의 UI스레드 표현
1) final AsyncTask<…> execute(Params… params):
Background 작업을 시작한다. 꼭 UI스레드에서 호출하여야 함. 가변인자를 받아들임으로 임의의 개수의 인자를 전달할 수 있으며, 인자들은 doInBackground(…) 메소드로 전달된다.

2) final void publishProgress(Progress... values):
Background 작업 수행 중 작업의 진행도를 UI 스레드에 전달 함. doInBackground(…)메소드 내부에서만 호출.

AsyncTask인스턴스는 자기 자신을 pending, running, finished 이렇게 세 가지 상태(status)로 구분하는데 각각 AsyncTask:Status 클래스에 상수 PENDING, RUNNING, FINISHED로 표현 될 수 있다

public final AsyncTask.Status getStatus()
를 이용해 인스턴스 상태를 얻을 수 있음.
PENDING, RUNNING, FINISHED 중에서 리턴

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

공유 가능 앱 리스트 가져오기  (0) 2017.03.06
안드로이드 앱의 cpu 사용량 구하기  (0) 2017.03.06
AppWidget  (0) 2011.07.28
Broadcast Receiver  (0) 2011.07.26
나인패치  (0) 2011.07.26

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

Broadcast Receiver를 호출하는 method
- sendBroadcast(Intent intent[String srceiverPermission]);
   * 응용프로그램에서 실행될 intent를 전송
   * 허가받은 수신자에게만 방송을 보내고 싶다면 permission도 지정이 가능
   * permmission이 필요 없다면 null이나 생략 가능

- sendOrderBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler schduler, int initialCode, String initialData, Bundle initialExtras)
   * 실행될 intent, android:priority, 실행될 BR, 리턴받은 번들값을 지정해 실행

- registerReceiver(BroadcastReceiver receiver, intentFilter filter)
   * 항상 Broadcast를 수신대기 하고 있는 경우지만 원활할 때만 수신대기 하도록 manifest에 등록하거나 registerReceiver method를 통해 지정하면 등록돼어 실행

- unregisterReceiver(BroadcastReceiver receiver)
   * registerReceiver method를 통해 등록된 것을 해제


자바 코드로 Broadcast Receiver 등록
1. cast 날리기
   Intent intent = new Intent();
   intent.putExtra(Statickeyword.xxxx, true);
   intent.setAction(Statickeyword.xxxx);
   context.sendBroadcast(intent);

2. cast 감지, 처리
   2_1 Broadcast 생성
         BroadcastReceiver br=new BroadcastReceiver(){
         @Override
          public void on Receive(Context context, Intent intent){
         }
    2_2 필터 생성
        private IntentFilter filter = new IntentFilter();
        filter.addAction(Statickeyword.xxxx);

3. Activity 등록
    @Override
         public void onResume(){
         super.onResume();
         registerReceiver(br, filter);
         }

4. 해제
    @Override
         public void onPause(){
         super.onPause();
         unregisterReceiver(br);
         }

Receiver를 Activity에 등록하면 Activity가 활성화 상태에서만 cast에 반응
Broadcast Receiver class를 상속하여 onReceiver method를 오버라이딩 하고 manifest에 추가하면 Activity 상태와 무관하게 cast요청 감지.

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

AsyncTask  (0) 2011.09.06
AppWidget  (0) 2011.07.28
나인패치  (0) 2011.07.26
Data Base  (0) 2011.07.25
broadcast receiver java code로 등록  (0) 2011.07.25

+ Recent posts