在 AndroidManifest 中聲明 <receiver>標簽, 用name屬性指定繼承自AppWidgetProvider的自定義類.
AndroidManifest.xml
<receiver android:name=".sample.MyWidgetProvider" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/my_appwidget_provider"/>
</receiver>
注:
AppWidgetProvider本質是BroadcastReceiver, 在<action>中需要聲明APPWIDGET_UPDATE, 這樣在收到這種intent時, 系統會調用自定義AppWidgetProvider的onUpdate()來更新數據.
<meta-data>中的resource屬性, 用來指定一個xml文件, 這個文件中的根節點是<appwidget-provider>標簽, 用來指定這個widget在桌面上的寬高值, 以及初始布局的xml文件.
還有一個很重要的屬性是“updatePeriodMillis”用來定義刷新頻率, 也就是說framework多久發送一個特定的intent, 用來調用子定義AppWidgetProvider 的 onUpdate() 回調函數。
系統基于節電的考慮, 定義了widget刷新數據的最小時間間隔是30分鐘, 所以你要是要求實時的去刷新數據的話, 就要采用 Service 和 AlarmManager 對 Widget 進行更新.
my_appwidget_provider.xml
<appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="200dp"
android:minHeight="50dp"
android:updatePeriodMillis="86400000"
android:previewImage="@drawable/app_icon"
android:initialLayout="@layout/widget"
android:configure="com.example.android.ExampleAppWidgetConfigure"
android:resizeMode="horizontal|vertical"
android:widgetCategory="home_screen|keyguard"/>
3. 真正的業務邏輯, 基本集中在自定義的AppWidgetProvider類.
自己要去實現這樣幾個重要的回調方法,
onUpdate(), 這是最重要的回調方法, 接受特定的intent, 用來定期更新數據.
onDeleted():當 Widget 被刪除時調用該方法
onEnabled():當 Widget 第一次被添加時調用
onDisabled():當你的最后一個 Widget 被刪除時調用該方法
onAppWidgetOptionsChanged():當 Widget 第一次被添加或者大小發生變化時調用該方法.
public class MyWidgetProvider extends AppWidgetProvider {
public void onUpdate()
public void onDeleted()
public void onEnabled()
public void onDisabled()
public void onAppWidgetOptionsChanged()
}
eg.
當點擊widget中的R.id.icon和R.id.icon_txt時, 啟動ThemesStore這個activity.
public class ThemeStoreWidget extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widget_themestore);
Intent intent = new Intent(context, ThemesStore.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
remoteView.setOnClickPendingIntent(R.id.icon, pendingIntent);
remoteView.setOnClickPendingIntent(R.id.icon_txt, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetIds, remoteView);
}
}
refer to:
http://glgjing.github.io/blog/2015/11/05/android-kai-fa-zhi-app-widget-xiang-jie/