<안드로이드/Android> 앱위젯(AppWidget) PART3

Posted by 앱해피
2015. 6. 19. 12:12 안드로이드 이론

 

AppWidgetProvider 클래스 사용하기.

 

AppWidgetProvider 클래스는 사실은 BroadcastReceiver 클래스를 상속받은 형태로 구현되어 있기 때문에 AppWidget과 관련된 브로드캐스팅 기능을 사용할 수 있다. AppWidgetProvider가 수신받을 수 있는 브로드 캐스트 정보는 다음에 해당한다.


ex) 앱 위젯이 업데이트 되었을 때, 앱 위젯이 삭제 될 때 등등.

 

이와 같은 브로드캐스트가 발생될 때, AppWidgetProvider는 그와 관련된 콜백 메소드를

호출한다.

 

onUpdate()

 

이 콜백 메소드는 일정한 간격(AppWidgetProviderInfo에서 정의)에 따라서 App Widget을 업데이트 해야할 때, 호출된다. 그리고 또한, AppWidget이 처음 홈 스크린에 추가될 때에도 호출된다. 그렇기 때문에 AppWidget과 관련된 초기 설정(뷰와 관련된 핸들러르 정의한다던지 서비스를 시작한다던지)을 해야 한다.

 

onDeleted(Context, int[])

 

이 콜백 메소드는 App Widget이 App Widget host에서 제거될 때 호출된다.

 

onEnabled(Context)

 

이 콜백 메소드는 App Widget이 처음 생성될 때 호출된다. 예를 들어, 유저가 앱 위젯 2개를 차례로 추가할 때, 첫 번째 App Widget을 추가할 때만, 해당 콜백 메소드가 호출된다.

 

onDisable(Context)

 

App Widget Host에 존재하는 마지막 App Widget이 제거될 때 호출된다. 보통 이 콜백메소드에서는 onEnable()메소드에서 생성했던 리소스를 다시 시스템으로 반환할 때 사용된다.

 

** onUpdate() **

 

AppWidgetProvider에서 가장 중요한 콜백 함수는 onUpdate()인 이유는 AppWidget이 추가될 때마다 호출되는 메소드이기 때문이다. App Widget을 사용해서 유저에게 기능을 제공하고 싶다면 onUpdate() 메소드 안에서 다양한 이벤트 핸들러를 등록해야 할 필요가 있다.

 

예를 들어, 클릭 되었을 때 특정 액티비티를 실행시키는 버튼을 갖는 AppWidget을 원한다면, onUpdate() 메소드에서 해당 버튼에 그와 관련 코드를 작성하면 된다.

 

AppWidgetProvider 클래스 구현 및

 

가장 중요한 onUpdate 콜백 메소드 살펴보기

 

public class ExampleAppWidgetProvider extends AppWidgetProvider {

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        final int N = appWidgetIds.length;

 

        // Perform this loop procedure for each App Widget that belongs to this provider
        for (int i=0; i<N; i++) {
            int appWidgetId = appWidgetIds[i];

           

            // Create an Intent to launch ExampleActivity
            Intent intent = new Intent(context, ExampleActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

           

            // Get the layout for the App Widget and attach an on-click listener
            // to the button
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
            views.setOnClickPendingIntent(R.id.button, pendingIntent);

           

            // Tell the AppWidgetManager to perform an update on the current app widget
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
}

 

위의 코드는 onUpdate() 메소드만을 갖는 AppWidgetProvider 클래스를 나타내고 있다.

(onUpdate에서 임의의 액티비티를 실행할 용도의 PendingIntent를 정의하고 있으며, 해당 기능을 setOnClickPendingIntent(int, PendingIntent)를 사용해서 App Widget 버튼에 추가한다.)

 

AppWidgetProvider에 의해 생성된 각각의 App Widget을 식별할 수 있는 appWidgetID를 사용해서 반복문이 진행되고 있는 것을 확인할 수 있다.

 

이와 같은 방법을 통해, 유저가 하나 이상의 AppWidget을 생성했을 때, 그것들을 한번에 업데이트 할 수 있다.

 

[주의]

 

AppWidgetProvider는 BroadcastReceiver를 상속받은 개념이기 때문에, 프로세스의 메인스레드에서 AppWidgetProvider의 각각의 콜백 메소드를 호출하게 된다.

 

그렇기 때문에 App Widget을 업데이트하는 과정에서 상당한 시간이 필요할 것으로 예상된다면, onUpdate() 메소드에서 서비스(Service)를 시작하는 것을 고려할 수 있다.

 

서비스(Service) 내에서는 AppWidgetProvider가 ANR(Android Not Responding)에 의해서 종료될 걱정 없이 App Widget을 업데이트 할 수 있기 때문이다.

AppWidget 강의를 마치도록 하겠습니다, 감사합니다.^_^

 

도움이 되셨다면 추천 부탁드립니다!!