티스토리 뷰


안드로이드에서는 SDK 1.6 버전 이상부터는 위젯의 갱신 시간을 조절하는

android:updatePeriodMillis 를 기본 30분으로 지정하고 있습니다.

그 이유는 너무 잦은 화면 갱신은 베터리의 극심한!! 소모를 야기한다고 레퍼런스 문서에 나와있습니다.

따라서, 위젯의 업데이트 = 베터리의 소모 라는 것을 유념하여 주시고, 포스트 글을 봐주시기 바랍니다.

위젯을 업데이트 하는 방법은 2가지가 있습니다.
1. Background Service를 이용한 화면 갱신법
2. AlarmManager를 이용한 화면 갱신법.

Service로 위젯을 업데이트하는 것은 베터리 소모가 조금 심합니다. 또한, 메모리 정리 어플에의해 종료가 될 수도 있지만, 몇초 단위의 업데이트를 할 수 있으므로, 알람매니저를 이용하는 것보다 세심한 컨트롤이 가능합니다.

일단 본 포스팅에서는 서비스를 이용해서... 위젯의 텍스트 뷰에 숫자를 1초단위로 업데이트 해보도록 하지요.


(본 포스트에 사용된 내용은 http://fallingstar.tistory.com/92 에서 만든 기초적인 위젯을 바탕으로 적용한 것입니다. 기본 앱위젯 생성은 주소의 포스트를 참고해 주세요.)

소스 코드가 정리가 잘 안되어서 안드로이드 프로젝트를 첨부파일로 올립니다.
실행해보시고, 천천히 설명글 읽으시면서 이해하실 수 있으면 좋겠습니다.



1. AppWidgetProvider 에 Inner Class로 Service 클래스를 생성 
2. Manifest.xml에 <service > ~ 추가
3. 서비스에서 run() 함수 재정의
4. 위젯의 레이아웃에 textview 추가


1. 서비스 클래스의 생성
public class ExampleAppWidgetProvider extends AppWidgetProvider {
 
 public static ComponentName mService = null; //서비스 클래스 시작을 위해 ComponentName 형 변수 선언.
...
...
...
// 이전 포스트에서 만든 위젯에서는 엑티비티가 종료될 때 본 함수가 호출되도록 해놓았으므로
// 본 함수내에서 서비스를 시작할 수 있도록 한다.

 static void updateWidget(Context context,     AppWidgetManager appWidgetManager,    int appWidgetId){     
     endServiceFlag = false;
  mService = context.startService(new Intent(context, UpdateService.class));
    }

 //또한 서비스 클래스를 내부 클래스로 정의한 후 아래와 같이 선언한다.
public static class UpdateService extends Service implements Runnable {
  
   private Handler mHandler; //서비스를 일정시간 이후 깨울때 필요함.
  private static final int TIMER_PERIOD = 1 * 1000; //서비스는 기본적으로 밀리세컨드 단위이므로 1초는 1000ms
  private long preTime; //이전시간과 현재 시간을 비교하여 일정 차이보다 작으면 뷰를 갱신한다.
  private long curTime;
  @Override
  public void onCreate(){
   mHandler = new Handler(); //핸들러를 생성하여 일정시간 후에 run()함수가 호출될 수 있도록 한다.
  }
  
  @Override
  public void onStart(Intent intent, int startId){
   preTime = System.currentTimeMillis();//현재 시간을 이전 시간에 저장 후    
   mHandler.postDelayed(this, 1000);   //1초뒤에 서비스클래스의 run()함수가 호출되도록 한다.
  }
  
  @Override
  public IBinder onBind(Intent intent) {
   // TODO Auto-generated method stub
   return null;
  }

  /*
   * 위젯 화면 업데이트를 주기적으로 하기위해 run 함수 호출.
   */
  @Override
  public void run() {

//run 함수 내에서 갱신 작업을 처리한다.
    } //run end!!!

 }// inner class end
}//outer class end



2. Manifest.xml에 아래의 구문을 추가한다.

<service android:enabled="true" android:name=".ExampleAppWidgetProvider$UpdateService" />
$뒤에는 내부서비스클래스의 이름을 적어 넣는다. 본 예제에서는 UpdateService가 inner class 이름



3. 서비스에서 run() 함수를 재정의한다.

run 함수의 내부는 다음과 같이 curTime과 preTime의 차이가 1초이상 나면 글자를 바꾸도록 한 후, 위젯매니저를 통해 위젯을 업데이트 시킨다.
   
   //리모트뷰에 앱위젯의 레이아웃을 결합한다.
   RemoteViews views = new RemoteViews(this.getPackageName(), R.layout.example_appwidget);
   
   /*
    * 지난 업데이트로 부터 시간이 약 1초가  지나면 text뷰의 글자를 변화시킨다.
    */
   long CUR_PERIOD = curTime - preTime;
   if( CUR_PERIOD > 1000 ){
    views.setTextViewText(R.id.text, ""+Integer.toString(curCount));
    preTime = curTime;
    curCount++;
   }
   
   //위젯이 업데이트 되었음을 알린다.
   AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
   ComponentName testWidge = new ComponentName(this, ExampleAppWidgetProvider.class);
   appWidgetManager.updateAppWidget(testWidge, views);
   
   if(endServiceFlag){
    return;
   }else{
 // 다음번에 run()함수는 TIMER_PERIOD 후에 호출된다.
    mHandler.postDelayed(this, TIMER_PERIOD);
   }

4. 위젯의 레이아웃에 TextView를 추가한다.

파일 첨부 하였으니 보시면서 천천히 이해해 보시고 잘 모르시는 부분은 댓글로 질문하여주시면, 같이 공부도 될 수 있을 것같습니다.
개발로 짠 코드라 보기 힘들어도 이해해 주세요.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함