티스토리 뷰

위젯을 사용하기 위한.. 파일 들,

 

1. 매니패스트에 브로드캐스트, 브로드캐스트 액션, 서비스 선언.

2. rew\xml에 위젯 설정 xml 파일 추가. 

3. 실제 보이는 레이아웃인 위젯 xml 추가 

4. 위젯 브로드캐스트 생성

5. 위젯 서비스 생성

 

 

 

1. 매니패스트 선언부.. 

리시버 안드로이드:네임은 브로드캐스트를 상속받는 파일

액션 값은 업데이트 상수임. 


<receiver android:name=".component.WidgetProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_provider"/>
</receiver>

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

 

2. 위젯 설정 xml (widget_provider.xml)

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
android:initialLayout="@id/widget_xml"
android:minWidth="146dp"
android:minHeight="72dp"
android:updatePeriodMillis="600000"
android:resizeMode="horizontal|vertical"
xmlns:android="http://schemas.android.com/apk/res/android" />

 

3. 위젯 레이아웃 xml (widget.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:background="@color/transparent"
android:id="@+id/widget_xml">

<TextView
android:id="@+id/widget_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24dp"
android:maxLines="1"
android:lines="1"
android:textColor="#80ffffff"
android:text="위젯 텍스트" />

</LinearLayout>

 

 

4. 위젯 브로드캐스트  (WidgetProvider.java)

public class WidgetProvider extends AppWidgetProvider {

@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
}

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

 

5. 위젯 서비스 (WidgetService.java)

public class WidgetService extends Service {
final String TAG = WidgetService.class.getSimpleName();

@Override
public int onStartCommand(Intent intent, int flags, int startId){
RemoteViews updateViews = new RemoteViews(this.getPackageName(), R.layout.widget);

updateViews.setTextViewText(R.id.widget_text, "텍스트");
updateViews.setOnClickPendingIntent(R.id.widget_text, buildStartIntent(this)); // 클릭 펜딩인텐트.

ComponentName componentname = new ComponentName(this, WidgetProvider.class);
AppWidgetManager appwidgetmanager = AppWidgetManager.getInstance(this);
appwidgetmanager.updateAppWidget(componentname, updateViews);

return super.onStartCommand(intent, flags, startId);
}

@Override
public IBinder onBind(Intent arg0) {
return null;
}

// 클릭 시 앱 실행 펜딩 이벤트.
private PendingIntent buildStartIntent(Context context) {
Intent i = new Intent(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
i.setComponent(new ComponentName(context, SplashActivity.class));
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, i, 0);
return pendingIntent;
}

 

 

 

 

6. 이벤트 시 갱신 해주는 코드. 

Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
int[] appWidgetIds = AppWidgetManager.getInstance(mContext).getAppWidgetIds(new ComponentName(mContext.getPackageName(), WidgetProvider.class.getName()));
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
mContext.sendBroadcast(intent);