App Widget 이란 Home Screen에 노출되는 miniature Application입니다.
보통 시계 어플등이 Widget 형태로 존재 하게 됩니다.
App Widget을 구현에 필요 한것들
A. 꼭 필요 한것들
1. AppWidgetProviderInfo object
- App Widget을 위한 MetaData, update frequecy 나 layout에 대한 정의.
- XML 에 정의 되어야함.
- XML 에 정의 되어야함.
2. AppWidgetProvider
- Programming Interface
- AppWidget이 Update/Enabled/Disabled/Delete되었을때, BroadCast를 받는 Receiver역할을 한다.
- AppWidget이 Update/Enabled/Disabled/Delete되었을때, BroadCast를 받는 Receiver역할을 한다.
3. View Layout
- AppWidget Design , Android Layout XML 로 정의한다.
B. 추가로 할 수 있는것
App Widget Configuration Activity
- AppWidget이 생성될때, User가 설정하게 할수 있는 Optional Feature
요약
Android Manifest에 AppWiget을 정의하고, AppWidgetProvider를 구현함으로써 Programming 하고,
Layout을 통해 App Widget을 디자인한다.
Layout을 통해 App Widget을 디자인한다.
Manifest에 App Widget 선언하기.
앞서 언급한대로, AppWidget에는 AppWidgetProvider라는 BroadCast Receiver가 필요 합니다.
앞서 언급한대로, AppWidget에는 AppWidgetProvider라는 BroadCast Receiver가 필요 합니다.
<receiver android:name="ExampleAppWidgetProvider" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/example_appwidget_info" />
</receiver>
- AppWidget Broadcast Reciver 등록
- MetaData Resource 설정
AppWidgetProviderInfo MetaData
res/xml/ folder에 <appwidget-provider /> 태그를 작성한 yourappwidget-info.xml을 추가합니다.
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="294dp"
android:minHeight="72dp"
android:updatePeriodMillis="86400000"
android:initialLayout="@layout/example_appwidget"
android:configure="com.example.android.ExampleAppWidgetConfigure" >
</appwidget-provider>
- minWidth/minHeight 설정
- 사실상 width값대로 표기되는게 아니라, 현재의 Cell Size에 따라 자동 계산된다.
- Cell Size는 Device별로 다르고, 같은 Device일때도, Vertical이냐 Horizontal에 따라서 또 다르다.
- ( Number of Cells ) * 74 -2 의 계산식으로 계산하여 설정하도록 한다.
- updatePeriodMillis 설정
- layout 명시
- AppWidget Layout XML
- configure(optional)
- 유저가 AppWidget 설정시 사용될 Activity
AppWidget Layout
AppWidget의 Layout은 기본적으로 Activity용 Layout과 다를 바가 없다.
다만, AppWidget은 RemoteView를 기반으로 하고 있기 때문에, 사용할 수 있는 종류에 제약이 있다.
사용가능한 Layout Classes
사용가능한 Widget Classes
AppWidgetProviderClass 구현하기
아래 소스는 appWidget을 Click했을 때, 특정 Activity를 띄우는 AppWidget의 예이다.
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);
}
}
}
AppWidget의 기본적인 목적은 주기적으로 화면을 구성해주서 보여주는것이다.
그럼으로 특별히 Enable/Disable를 처리할 이유가 없다면, 내가 해야 할일은 onUpdate() Method를 구현하는것 뿐이다.
이제 AppWidget을 띄울 수 있는 기본적인 개념은 알게 되었다.