区别
- 与普通widget是两个概念。普通说的widget只是组件,视图。
- App widget 是一个桌面组件。
注意:
应用必须安装在内存里,才能显示widget
开始
- 在官方文档里搜索 App widget
配置:在清单文件里添加下列配置(广播接受者)
<receiver android:name=".ProcessWidgetProvider" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/process_widget_info" />
</receiver>
声明ProcessWidgetProvider
其实就是一个AppWidgetProvider 子类
onReceive : 只要有广播,就会调用
- onEnabled : 第一个widget创建出来的时候调用
- onUpdate : 系统更新widget的时候调用。 widget创建的时候调用。
- onDelete : widget 删除的时候调用
- onDisable : 最后一个widget删除的时候调用。
在res/xml/文件夹下添加 process_widget_info.xml文件
- minWidth widget最小宽度
- minHeight 最小高度
- previewImage 设置预览用的图片。在添加widget之前,widget列表看到的样子。
- initialLayout:显示样式的布局文件
- resizeMode:用来表示缩放的方式。horizontal vertical。如果属性没有配置代表不可缩放
widgetCategory
- home_screen 普通widget的类型
- keyguard 5.0之后添加的类型。可以显示在锁屏界面上。
updatePeriodMillis: 系统自动更新widget的时间间隔。
- 单位是毫秒。
- 4.0 最小更新间隔为 半个小时
- 0 代表不更新。
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="40dp"
android:minHeight="40dp"
android:updatePeriodMillis="1"
android:previewImage="@drawable/preview"
android:initialLayout="@layout/example_appwidget"
android:resizeMode="horizontal|vertical"
android:widgetCategory="home_screen">
</appwidget-provider>
添加点击事件
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
LogUtils.loge("onUpdate");
for (int id:appWidgetIds) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_process);
views.setTextViewText(R.id.tv_process_widget,"呵呵,我是一个拓达一键清理widget");
Intent intent = new Intent(context, ProcessWidgetProvider.class);
intent.setAction("PROCESS_BTN_CLICK");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.btn_process_widget, pendingIntent);
appWidgetManager.updateAppWidget(id,views);
}
}
外部更新widget
SimpleDateFormat formater = new SimpleDateFormat("H:m:s");
RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget_process);
views.setTextViewText(R.id.tv_process_widget,formater.format(new Date()));
Intent intent = new Intent(this, ProcessWidgetProvider.class);
intent.setAction("PROCESS_BTN_CLICK");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
views.setOnClickPendingIntent(R.id.btn_process_widget, pendingIntent);
//widgetmanager
AppWidgetManager manager = AppWidgetManager.getInstance(getApplicationContext());
//这里的ProcessWidgetProvider 就是在清单文件里注册的 AppWidget 的 WidgetProvider
ComponentName componentName = new ComponentName(getApplicationContext(), ProcessWidgetProvider.class);
manager.updateAppWidget(componentName, views);
主动更新
- 使用handler
- 使用AarmManager
- 使用这个,不怕服务被杀死。
- 用户强制停止,半个小时候,系统调用onUpdate的时候,也会把服务重新启动。