본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] Service 를 이용한 App Widget Update

by 돼지왕 왕돼지 2012. 2. 16.
반응형


안녕하세요 돼지왕 왕돼지입니다.
오늘은 Service 를 이용한 App Widget Update 방법에 대해 알아 보겠습니다.


왜 Service 를 이용하나요?

 
- 기본적으로 Provider 내에서의 작업 수행은 10초 이내로 끝나야 합니다.
 간혹가다가 위젯 update 를 위해서 많은 계산을 필요로 하던가, DB 에서 정보를 얻어오는 등의 긴 작업을 요하는 경우가 있는데요.
 이런 경우에는 widget update 중 ANR 을 초래할 수 있기 때문에, Service 를 이용하는 것이 좋습니다.

- 두번 째 이유는, android app widget 의 경우 30분 이내의 updatePeriodMillis 를 보장하지 않습니다. 
  따라서 30분 이내에 지속적인 Update 가 필요할 경우에는 Service 를 이용하면 좋습니다.

- 물론 단점도 있긴 합니다. 단점은 Java 의 Timer 를 사용하는 방법보다 Battery 를 많이 먹는다고 하는데,
  제 생각에는 돗진갯진일지 싶습니다.
   
 2012/02/16 - [프로그래밍 놀이터/안드로이드] - [Android/안드로이드] Timer 를 이용한 App Widget Update Example




Sample Code

 
물론 여기서 제공하는 방법은 지속적인 업그레이드는 아닙니다만, 어떤식으로 appwidget 을 update 할껀지에 대한 idea 를 보여주죠.

@AppWidgetProvider

@Override
 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){
     Intent intent = new Intent(context, UpdateService.class);
     context.startService(intent);
 }

 

@Service

public class UpdateService extends Service{
   @Override
   public void onStart(Intent intent, int startId){
        RemoteViews updateViews = new RemoteViews(this.getPackageName(), R.layout.main);
        updateViews.setTextViewText(R.id.textview, (new Date(System.currentTimeMillis())).toLocaleString());
        ComponentName componentname = new ComponentName(this, TestWidget.class);
        AppWidgetManager appwidgetmanager = AppWidgetManager.getInstance(this);
        appwidgetmanager.updateAppWidget(componentname, updateViews);
   }
 
   @Override
   public IBinder onBind(Intent arg0) {
        return null;
   }
}

 

@Manifest 

  <service android:name=".UpdateService">
     <intent-filter>
         <action android:name="com.test.updateservice"/>
     </intent-filter>
  </service>


  
- Service를 이용한다는 점만 달라졌지, remoteview 를 이용해서 UI에 접근하고,
   appwidgetmanager를 통해서 update 소식을 알리고 하는 등의 기초적 방법은 같습니다.


로그인 없이 추천 가능합니다. 손가락 꾸욱~

반응형

댓글