在 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/
网友评论